2017-02-09 38 views
5

Tôi đang cố gắng sử dụng mạng nơron LSTM (sử dụng Keras) để dự đoán động thái tiếp theo của đối thủ trong trò chơi Rock-Paper-Scissor.Keras Định dạng dữ liệu đào tạo LSTM

Tôi đã mã hóa các yếu tố đầu vào là Rock: [1 0 0], Paper: [0 1 0], Scissor: [0 0 1]. Bây giờ tôi muốn đào tạo mạng thần kinh nhưng tôi hơi bối rối về cấu trúc dữ liệu của dữ liệu đào tạo của tôi.

tôi đã được lưu trữ lịch sử trò chơi của đối thủ trong tệp .csv với cấu trúc sau:

1,0,0 
0,1,0 
0,1,0 
0,0,1 
1,0,0 
0,1,0 
0,1,0 
0,0,1 
1,0,0 
0,0,1 

Và tôi đang cố gắng sử dụng tất cả các dữ liệu thứ 5 là nhãn đào tạo của tôi, và 4 dữ liệu trước đó là công tác đào tạo đầu vào. Nói cách khác, ở mỗi bước thời gian, một vectơ có thứ nguyên 3 được gửi đến mạng và chúng tôi có 4 bước thời gian.

Ví dụ, sau đây là dữ liệu đầu vào

1,0,0 
0,1,0 
0,1,0 
0,0,1 

Và một phần năm là nhãn đào tạo

1,0,0 

Câu hỏi của tôi là những gì kiểu định dạng dữ liệu không mạng LSTM Keras' chấp nhận? Điều gì sẽ là một cách tối ưu để sắp xếp lại dữ liệu của tôi cho mục đích này? Mã không đầy đủ của tôi được đính kèm như sau nếu nó giúp:

#usr/bin/python 
from __future__ import print_function 

from keras.models import Sequential 
from keras.layers import Dense, Activation, Dropout 
from keras.layers.recurrent import LSTM 
from keras.optimizers import Adam 

output_dim = 3 
input_dim = 3 
input_length = 4 
batch_size = 20 #use all the data to train in one iteration 


#each input has such strcture 
#Rock: [1 0 0], Paper: [0 1 0], Scissor: [0 0 1] 
#4 inputs (vectors) are sent to the LSTM net and output 1 vector as the prediction 

#incomplete function 
def read_data(): 
    raw_training = np.genfromtxt('training_data.csv',delimiter=',') 




    print(raw_training) 

def createNet(summary=False): 
    print("Start Initialzing Neural Network!") 
    model = Sequential() 
    model.add(LSTM(4,input_dim=input_dim,input_length=input_length, 
      return_sequences=True,activation='softmax')) 
    model.add(Dropout(0.1)) 
    model.add(LSTM(4, 
      return_sequences=True,activation='softmax')) 
    model.add(Dropout(0.1)) 
    model.add(Dense(3,activation='softmax')) 
    model.add(Dropout(0.1)) 
    model.add(Dense(3,activation='softmax')) 
    model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy']) 
    if summary: 
     print(model.summary()) 
    return model 

if __name__=='__main__': 
    createNet(True) 

Trả lời

2

Định dạng đầu vào cho LSTM phải có hình dạng (sequence_length, input_dim). Vì vậy, trong trường hợp của bạn, các mảng hình khối (4,3) nên làm điều đó.

Những gì bạn sẽ cấp cho mô hình sau đó sẽ là một mảng hình khối (số_of_train_examples, sequence_length, input_dim). Nói cách khác, bạn sẽ nạp các bảng số dạng hình dạng (4,3). Tạo danh sách:

1,0,0 
0,1,0 
0,1,0 
0,0,1 

và sau đó làm np.array (list_of_train_example).

Tuy nhiên, tôi không hiểu tại sao bạn trả lại toàn bộ chuỗi cho LSTM thứ hai? Nó sẽ cho bạn một cái gì đó với hình dạng (4,4), lớp dày đặc có thể sẽ thất bại trên đó. Chuỗi trả về có nghĩa là bạn sẽ trả về toàn bộ chuỗi, vì vậy mọi đầu ra bị ẩn ở mỗi bước của LSTM. Tôi sẽ đặt điều này thành False cho LSTM thứ hai để chỉ nhận được một vectơ "tóm tắt" về hình dạng (4,) mà lớp Dense của bạn có thể đọc được. Dù sao, ngay cả đối với LSTM đầu tiên, nó có nghĩa là với đầu vào hình dạng (4,3), bạn xuất một thứ có hình dạng (4,4), vì vậy bạn sẽ có nhiều tham số hơn dữ liệu đầu vào cho lớp này ... không thực sự tốt.

Về kích hoạt, tôi cũng sẽ sử dụng softmax nhưng chỉ trên lớp cuối cùng, softmax được sử dụng để có được xác suất là đầu ra của lớp. Nó không thực sự có ý nghĩa để sử dụng một softmax ra khỏi LSTM và Dense trước khi cuối cùng. Đi cho một số phi tuyến tính khác như "sigmoid" hoặc "tanh".

Đây là những gì tôi sẽ làm mô hình khôn ngoan

def createNet(summary=False): 
    print("Start Initialzing Neural Network!") 
    model = Sequential() 
    model.add(LSTM(4,input_dim=input_dim,input_length=input_length, 
      return_sequences=True,activation='tanh')) 
    model.add(Dropout(0.1)) 
    # output shape : (4,4) 
    model.add(LSTM(4, 
      return_sequences=False,activation='tanh')) 
    model.add(Dropout(0.1)) 
    # output shape : (4,) 
    model.add(Dense(3,activation='tanh')) 
    model.add(Dropout(0.1)) 
    # output shape : (3,) 
    model.add(Dense(3,activation='softmax')) 
    # output shape : (3,) 
    model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy']) 
    if summary: 
     print(model.summary()) 
    return model 
Các vấn đề liên quan