2016-01-29 27 views
9

Tôi khá mới đối với Mạng nơron và Thư viện Keras và tôi tự hỏi mình có thể sử dụng Lớp Nhúng như được mô tả here để che giấu dữ liệu đầu vào của mình từ một dây dẫn 2D đến một dây dẫn 3D cho một RNN.Cách sử dụng Lớp nhúng cho mạng thần kinh tái phát (RNN) trong Keras

Giả sử chuỗi thời gian của tôi dữ liệu tìm kiếm như sau (với thời gian tăng):

X_train = [ 
    [1.0,2.0,3.0,4.0], 
    [2.0,5.0,6.0,7.0], 
    [3.0,8.0,9.0,10.0], 
    [4.0,11.0,12.0,13.0], 
    ... 
] # with a length of 1000 

Bây giờ, nói rằng tôi muốn cung cấp cho các RNN 2 vectơ Tính năng cuối cùng để dự đoán các vector đặc trưng cho thời gian t +1.

Hiện tại (không có Lớp nhúng), tôi tạo bản thân 3D theo yêu cầu (nb_samples, timesteps, input_dim) (như trong ví dụ này here).

liên quan đến ví dụ của tôi, 3D tensor thức sau đó sẽ trông như sau:

X_train_2 = [ 
    [[1.0,2.0,3.0,4.0], 
    [2.0,5.0,6.0,7.0]], 
    [[2.0,5.0,6.0,7.0], 
    [3.0,8.0,9.0,10.0]], 
    [[3.0,8.0,9.0,10.0], 
    [4.0,11.0,12.0,13.0]], 
    etc... 
] 

và Y_train:

Y_train = [ 
    [3.0,8.0,9.0,10.0], 
    [4.0,11.0,12.0,13.0], 
    etc... 
] 

Mô hình của tôi trông như sau (phù hợp với các ví dụ đơn giản ở trên):

num_of_vectors = 2 
vect_dimension = 4 

model = Sequential() 
model.add(SimpleRNN(hidden_neurons, return_sequences=False, input_shape=(num_of_vectors, vect_dimension))) 
model.add(Dense(vect_dimension)) 
model.add(Activation("linear")) 
model.compile(loss="mean_squared_error", optimizer="rmsprop") 
model.fit(X_train, Y_train, batch_size=50, nb_epoch=10, validation_split=0.15) 

Và cuối cùng, câu hỏi của tôi sẽ là, làm cách nào tôi có thể tránh thực hiện những bản sao 2D đó 3D tensor định hình lại bản thân mình và sử dụng lớp Nhúng thay thế? Tôi đoán sau khi mô hình = tuần tự() Tôi sẽ phải thêm một cái gì đó như:

model.add(Embedding(?????)) 

Có lẽ câu trả lời là khá đơn giản, tôi chỉ đơn giản là nhầm lẫn bởi các tài liệu của lớp nhúng.

Trả lời

7

Bạn có thể bạn nó như sau:

Lưu ý:

  1. tôi tạo ra một số X và y như 0s chỉ để cung cấp cho bạn một số ý tưởng về cấu trúc đầu vào.

  2. Nếu bạn đang sử dụng y_train nhiều lớp, bạn cần phải binarize.

  3. Bạn có thể cần thêm đệm nếu bạn có dữ liệu có độ dài khác nhau.

  4. Nếu tôi hiểu chính xác về dự đoán tại thời điểm t + 1, bạn có thể muốn xem chuỗi Trình tự học tập theo trình tự.

Hãy thử một cái gì đó như:

hidden_neurons = 4 
nb_classes =3 
embedding_size =10 

X = np.zeros((128, hidden_neurons), dtype=np.float32) 
y = np.zeros((128, nb_classes), dtype=np.int8) 


model = Sequential() 
model.add(Embedding(hidden_neurons, embedding_size)) 
model.add(SimpleRNN(hidden_neurons, return_sequences=False)) 
model.add(Dense(nb_classes)) 
model.add(Activation("softmax")) 
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', class_mode="categorical") 
model.fit(X, y, batch_size=1, nb_epoch=1) 
+0

có lẽ tôi phải thêm ".0" vào sau tất cả các số của mình. Tôi thực sự không cố gắng thực hiện phân tích phân loại. – Kito

0

Từ những gì tôi biết cho đến nay, lớp Nhúng vẻ là nhiều hơn hoặc ít hơn để giảm chiều như word embedding. Vì vậy, theo nghĩa này, nó dường như không thể áp dụng như công cụ định hình lại chung.

Thông tin cơ bản nếu bạn có ánh xạ từ thành các số nguyên như {car: 1, mouse: 2 ... zebra: 9999}, văn bản nhập của bạn sẽ là vectơ các từ được biểu thị bằng id nguyên, như [1, 2 , 9999 ...], có nghĩa là [xe hơi, chuột, ngựa vằn ...].Nhưng có vẻ như hiệu quả khi ánh xạ từ vectơ của số thực với độ dài từ vựng, vì vậy nếu văn bản của bạn có 1000 từ duy nhất, bạn sẽ ánh xạ từng từ thành vectơ số thực với độ dài 1000. Tôi không chắc chắn nhưng tôi nghĩ rằng nó chủ yếu đại diện cho sự cân nhắc về ý nghĩa của một từ tương tự như thế nào đối với tất cả các từ khác, nhưng tôi không chắc điều đó đúng và có nhiều cách khác để nhúng các từ.

Các vấn đề liên quan