Hiểu biết về KST LSTM


311

Tôi đang cố gắng điều hòa sự hiểu biết của tôi về các LSTM và chỉ ra ở đây trong bài viết này của Christopher Olah thực hiện ở Keras. Tôi đang theo dõi blog được viết bởi Jason Brownlee cho hướng dẫn của Keras. Điều tôi chủ yếu bối rối là,

  1. Việc định hình lại chuỗi dữ liệu thành [samples, time steps, features] và,
  2. Các LSTM nhà nước

Hãy tập trung vào hai câu hỏi trên với tham chiếu đến đoạn mã được dán bên dưới:

# reshape into X=t and Y=t+1
look_back = 3
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)

# reshape input to be [samples, time steps, features]
trainX = numpy.reshape(trainX, (trainX.shape[0], look_back, 1))
testX = numpy.reshape(testX, (testX.shape[0], look_back, 1))
########################
# The IMPORTANT BIT
##########################
# create and fit the LSTM network
batch_size = 1
model = Sequential()
model.add(LSTM(4, batch_input_shape=(batch_size, look_back, 1), stateful=True))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
for i in range(100):
    model.fit(trainX, trainY, nb_epoch=1, batch_size=batch_size, verbose=2, shuffle=False)
    model.reset_states()

Lưu ý: create_dataset lấy một chuỗi có độ dài N và trả về một N-look_backmảng trong đó mỗi phần tử là mộtlook_back chuỗi độ dài.

Các bước thời gian và tính năng là gì?

Có thể thấy TrainX là mảng 3 chiều với Time_steps và Feature là hai chiều cuối cùng tương ứng (3 và 1 trong mã cụ thể này). Đối với hình ảnh dưới đây, điều này có nghĩa là chúng tôi đang xem xét many to onetrường hợp, trong đó số lượng hộp màu hồng là 3? Hoặc theo nghĩa đen nó có nghĩa là chiều dài chuỗi là 3 (tức là chỉ có 3 hộp màu xanh lá cây được xem xét).nhập mô tả hình ảnh ở đây

Liệu các đối số tính năng có trở nên phù hợp khi chúng ta xem xét loạt đa biến không? ví dụ mô hình hóa hai cổ phiếu tài chính cùng một lúc?

LSTM nhà nước

Các LSTM có trạng thái có nghĩa là chúng ta lưu các giá trị bộ nhớ ô giữa các lần chạy không? Nếu đây là trường hợp,batch_size là một, và bộ nhớ được đặt lại giữa các lần đào tạo, vậy thì điểm nào nói rằng nó là trạng thái. Tôi đoán điều này có liên quan đến thực tế là dữ liệu đào tạo không bị xáo trộn, nhưng tôi không biết làm thế nào.

Có suy nghĩ gì không? Tham khảo hình ảnh: http://karpathy.github.io/2015/05/21/rnn-effectively/

Chỉnh sửa 1:

Một chút bối rối về nhận xét của @ van về các hộp màu đỏ và màu xanh lá cây bằng nhau. Vì vậy, chỉ để xác nhận, các lệnh gọi API sau có tương ứng với các sơ đồ không được kiểm soát không? Đặc biệt lưu ý sơ đồ thứ hai ( batch_sizeđược chọn tùy ý.): nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Chỉnh sửa 2:

Đối với những người đã thực hiện khóa học sâu của Udacity và vẫn còn bối rối về đối số time_step, hãy xem cuộc thảo luận sau: https://discussions.udacity.com/t/rnn-lstm-use-im

Cập nhật:

Hóa ra đó model.add(TimeDistributed(Dense(vocab_len)))là những gì tôi đang tìm kiếm. Dưới đây là một ví dụ: https://github.com/sachinruk/ShakespeareBot

Cập nhật2:

Tôi đã tóm tắt hầu hết những hiểu biết của tôi về các LSTM ở đây: https://www.youtube.com/watch?v=ywinX5wgdEU


7
Ảnh đầu tiên phải là (batch_size, 5, 1); ảnh thứ hai phải là (batch_size, 4, 3) (nếu không có trình tự sau). Và tại sao đầu ra vẫn là "X"? Nó có nên là "Y" không?
Văn

1
Ở đây tôi giả sử X_1, X_2 ... X_6 là một số duy nhất. Và ba số (X_1, X_2, X_3) tạo thành một vectơ hình dạng (3,). Một số (X_1) tạo thành một vectơ hình dạng (1,).
Văn

2
@ Vân, giả định của bạn là đúng. Điều đó thật thú vị, vì vậy về cơ bản, mô hình không học được các mẫu vượt quá số lượng thời gian. Vì vậy, nếu tôi có một chuỗi thời gian có độ dài 1000 và có thể nhìn thấy một mẫu một cách trực quan cứ sau 100 ngày, tôi nên tạo tham số time_steps ít nhất 100. Đây có phải là một quan sát chính xác không?
sachinruk

3
Đúng. Và nếu bạn có thể thu thập 3 tính năng có liên quan mỗi ngày, thì bạn có thể đặt kích thước tính năng thành 3 như bạn đã làm trong ảnh thứ hai. Trong trường hợp đó, hình dạng đầu vào sẽ là (batch_size, 100, 3).
Văn

1
và với câu hỏi đầu tiên của bạn là vì tôi đã tham gia một chuỗi thời gian duy nhất. Ví dụ giá cổ phiếu, vì vậy X và Y là từ cùng một chuỗi.
sachinruk

Câu trả lời:


173

Trước hết, bạn chọn hướng dẫn tuyệt vời ( 1 , 2 ) để bắt đầu.

Bước thời gian có nghĩa là gì : Time-steps==3trong X.shape (Mô tả hình dạng dữ liệu) có nghĩa là có ba hộp màu hồng. Vì trong Keras, mỗi bước yêu cầu một đầu vào, do đó số lượng hộp màu xanh lá cây thường phải bằng số lượng hộp màu đỏ. Trừ khi bạn hack cấu trúc.

nhiều đến nhiều so với nhiều thành một : Trong máy ảnh, có một return_sequencestham số khi bạn khởi tạo LSTMhoặc GRUhoặc SimpleRNN. Khi return_sequencesFalse(theo mặc định), thì nó là nhiều như một trong hình. Hình dạng trở lại của nó là (batch_size, hidden_unit_length), đại diện cho trạng thái cuối cùng. Khi return_sequencesTrue, sau đó nó là nhiều nhiều . Hình dạng trở lại của nó là(batch_size, time_step, hidden_unit_length)

Đối số tính năng có trở nên phù hợp không : Đối số tính năng có nghĩa là "Hộp màu đỏ của bạn lớn bao nhiêu" hoặc kích thước đầu vào mỗi bước là bao nhiêu. Nếu bạn muốn dự đoán từ 8 loại thông tin thị trường, thì bạn có thể tạo dữ liệu của mình với feature==8.

Stateful : Bạn có thể tra cứu mã nguồn . Khi khởi tạo trạng thái, nếu stateful==True, thì trạng thái từ lần đào tạo cuối cùng sẽ được sử dụng làm trạng thái ban đầu, nếu không nó sẽ tạo ra trạng thái mới. Tôi chưa bật stateful. Tuy nhiên, tôi không đồng ý với điều đó batch_sizechỉ có thể là 1 khi stateful==True.

Hiện tại, bạn tạo dữ liệu của mình với dữ liệu được thu thập. Hình ảnh thông tin chứng khoán của bạn đang đến dưới dạng luồng, thay vì chờ một ngày để thu thập tất cả tuần tự, bạn muốn tạo dữ liệu đầu vào trực tuyến trong khi đào tạo / dự đoán với mạng. Nếu bạn có 400 cổ phiếu chia sẻ cùng một mạng, thì bạn có thể đặt batch_size==400.


Hơi bối rối về lý do tại sao các hộp màu đỏ và màu xanh lá cây phải giống nhau. Bạn có thể xem bản chỉnh sửa tôi đã thực hiện (chủ yếu là hình ảnh mới) và nhận xét không?
sachinruk

1
Thật. Kiểm tra tài liệu:stateful: Boolean (default False). If True, the last state for each sample at index i in a batch will be used as initial state for the sample of index i in the following batch.
Van

1
@Van Nếu tôi có chuỗi thời gian đa biến, tôi có nên sử dụng lookback = 1không?
innm

1
Tại sao kích thước LSTM của không gian đầu ra (32) khác với số lượng tế bào thần kinh (tế bào LSTM)?
Dính

1
Ngoài ra stateful=True: Kích thước lô có thể là bất cứ thứ gì bạn thích, nhưng bạn phải tuân theo nó. Nếu bạn xây dựng mô hình của bạn với kích thước lô 5, sau đó tất cả fit(), predict()và các phương pháp liên quan sẽ yêu cầu một loạt 5. Lưu ý rằng tuy nhiên tình trạng này sẽ không được lưu với model.save(), mà có thể dường như không mong muốn. Tuy nhiên, bạn có thể tự thêm trạng thái vào tệp hdf5, nếu bạn cần. Nhưng hiệu quả là điều này cho phép bạn thay đổi kích thước lô bằng cách chỉ lưu và tải lại một mô hình.
jlh

192

Để bổ sung cho câu trả lời được chấp nhận, câu trả lời này cho thấy các hành vi của máy ảnh và cách đạt được từng hình ảnh.

Hành vi chung của Keras

Quá trình xử lý nội bộ của máy ảnh tiêu chuẩn luôn có nhiều đến nhiều như trong hình sau (nơi tôi đã sử dụng features=2, áp suất và nhiệt độ, như một ví dụ):

Nhiều nhiều

Trong hình ảnh này, tôi đã tăng số bước lên 5, để tránh nhầm lẫn với các kích thước khác.

Ví dụ này:

  • Chúng tôi có N thùng dầu
  • Chúng tôi đã dành 5 giờ để thực hiện các biện pháp hàng giờ (các bước thời gian)
  • Chúng tôi đã đo hai tính năng:
    • Áp suất P
    • Nhiệt độ T

Mảng đầu vào của chúng ta nên có hình dạng như (N,5,2)sau:

        [     Step1      Step2      Step3      Step4      Step5
Tank A:    [[Pa1,Ta1], [Pa2,Ta2], [Pa3,Ta3], [Pa4,Ta4], [Pa5,Ta5]],
Tank B:    [[Pb1,Tb1], [Pb2,Tb2], [Pb3,Tb3], [Pb4,Tb4], [Pb5,Tb5]],
  ....
Tank N:    [[Pn1,Tn1], [Pn2,Tn2], [Pn3,Tn3], [Pn4,Tn4], [Pn5,Tn5]],
        ]

Đầu vào cho cửa sổ trượt

Thông thường, các lớp LSTM được cho là xử lý toàn bộ chuỗi. Cửa sổ phân chia có thể không phải là ý tưởng tốt nhất. Lớp này có các trạng thái bên trong về cách một chuỗi đang phát triển khi nó bước về phía trước. Windows loại bỏ khả năng học các chuỗi dài, giới hạn tất cả các chuỗi theo kích thước cửa sổ.

Trong các cửa sổ, mỗi cửa sổ là một phần của chuỗi gốc dài, nhưng bởi Keras, chúng sẽ được xem mỗi chuỗi là một chuỗi độc lập:

        [     Step1    Step2    Step3    Step4    Step5
Window  A:  [[P1,T1], [P2,T2], [P3,T3], [P4,T4], [P5,T5]],
Window  B:  [[P2,T2], [P3,T3], [P4,T4], [P5,T5], [P6,T6]],
Window  C:  [[P3,T3], [P4,T4], [P5,T5], [P6,T6], [P7,T7]],
  ....
        ]

Lưu ý rằng trong trường hợp này, ban đầu bạn chỉ có một chuỗi, nhưng bạn chia nó thành nhiều chuỗi để tạo các cửa sổ.

Khái niệm "chuỗi là gì" là trừu tượng. Các phần quan trọng là:

  • bạn có thể có các đợt với nhiều chuỗi riêng lẻ
  • Điều làm cho các chuỗi là các chuỗi là chúng phát triển theo các bước (thường là các bước thời gian)

Đạt được từng trường hợp với "lớp đơn"

Đạt tiêu chuẩn nhiều đến nhiều:

StandardManyToMany

Bạn có thể đạt được nhiều đến nhiều với một lớp LSTM đơn giản, sử dụng return_sequences=True:

outputs = LSTM(units, return_sequences=True)(inputs)

#output_shape -> (batch_size, steps, units)

Đạt được nhiều thành một:

Sử dụng cùng một lớp chính xác, các máy ảnh sẽ thực hiện chính xác quá trình tiền xử lý nội bộ, nhưng khi bạn sử dụng return_sequences=False(hoặc đơn giản bỏ qua đối số này), máy ảnh sẽ tự động loại bỏ các bước trước đó đến cuối cùng:

ManyToOne

outputs = LSTM(units)(inputs)

#output_shape -> (batch_size, units) --> steps were discarded, only the last was returned

Đạt được một đến nhiều

Bây giờ, điều này không được hỗ trợ bởi các lớp LSTM của máy ảnh. Bạn sẽ phải tạo chiến lược của riêng mình để nhân các bước. Có hai cách tiếp cận tốt:

  • Tạo đầu vào nhiều bước không đổi bằng cách lặp lại một tenxơ
  • Sử dụng a stateful=Trueđể thường xuyên lấy đầu ra của một bước và phục vụ nó làm đầu vào của bước tiếp theo (nhu cầu output_features == input_features)

Một đến nhiều với vector lặp lại

Để phù hợp với hành vi tiêu chuẩn của máy ảnh, chúng tôi cần các đầu vào theo các bước, vì vậy, chúng tôi chỉ cần lặp lại các đầu vào cho độ dài mà chúng tôi muốn:

OneToManyRepeat

outputs = RepeatVector(steps)(inputs) #where inputs is (batch,features)
outputs = LSTM(units,return_sequences=True)(outputs)

#output_shape -> (batch_size, steps, units)

Hiểu trạng thái = Đúng

Bây giờ đến một trong những cách sử dụng có thể stateful=True(bên cạnh việc tránh tải dữ liệu không thể vừa với bộ nhớ máy tính của bạn)

Stateful cho phép chúng ta nhập "các phần" của chuỗi trong các giai đoạn. Sự khác biệt là:

  • Trong stateful=False, lô thứ hai chứa toàn bộ chuỗi mới, độc lập với lô đầu tiên
  • Trong stateful=True, đợt thứ hai tiếp tục đợt đầu tiên, mở rộng các chuỗi tương tự.

Nó cũng giống như phân chia các chuỗi trong các cửa sổ, với hai điểm khác biệt chính sau:

  • những cửa sổ này không chồng chất !!
  • stateful=True sẽ thấy các cửa sổ này được kết nối dưới dạng một chuỗi dài

Trong stateful=True, mỗi đợt mới sẽ được hiểu là tiếp tục đợt trước (cho đến khi bạn gọi model.reset_states()).

  • Trình tự 1 trong lô 2 sẽ tiếp tục trình tự 1 trong lô 1.
  • Trình tự 2 trong lô 2 sẽ tiếp tục trình tự 2 trong lô 1.
  • Trình tự n trong lô 2 sẽ tiếp tục chuỗi n trong lô 1.

Ví dụ về đầu vào, lô 1 chứa các bước 1 và 2, lô 2 chứa các bước từ 3 đến 5:

                   BATCH 1                           BATCH 2
        [     Step1      Step2        |    [    Step3      Step4      Step5
Tank A:    [[Pa1,Ta1], [Pa2,Ta2],     |       [Pa3,Ta3], [Pa4,Ta4], [Pa5,Ta5]],
Tank B:    [[Pb1,Tb1], [Pb2,Tb2],     |       [Pb3,Tb3], [Pb4,Tb4], [Pb5,Tb5]],
  ....                                |
Tank N:    [[Pn1,Tn1], [Pn2,Tn2],     |       [Pn3,Tn3], [Pn4,Tn4], [Pn5,Tn5]],
        ]                                  ]

Chú ý sự liên kết của các xe tăng trong đợt 1 và đợt 2! Đó là lý do tại sao chúng ta cần shuffle=False(tất nhiên trừ khi chúng ta chỉ sử dụng một chuỗi).

Bạn có thể có bất kỳ số lượng lô, vô thời hạn. (Để có độ dài thay đổi trong mỗi lô, hãy sử dụng input_shape=(None,features).

Một đến nhiều với trạng thái = True

Đối với trường hợp của chúng tôi ở đây, chúng tôi sẽ chỉ sử dụng 1 bước cho mỗi đợt, vì chúng tôi muốn có một bước đầu ra và biến nó thành đầu vào.

Xin lưu ý rằng hành vi trong ảnh không phải là "gây ra bởi" stateful=True. Chúng tôi sẽ buộc hành vi đó trong một vòng lặp thủ công dưới đây. Trong ví dụ này, stateful=Truelà những gì "cho phép" chúng ta dừng chuỗi, thao túng những gì chúng ta muốn và tiếp tục từ nơi chúng ta dừng lại.

OneToManyStateful

Thành thật mà nói, cách tiếp cận lặp lại có lẽ là một lựa chọn tốt hơn cho trường hợp này. Nhưng vì chúng tôi đang xem xét stateful=True, đây là một ví dụ tốt. Cách tốt nhất để sử dụng điều này là trường hợp "nhiều đến nhiều" tiếp theo.

Lớp:

outputs = LSTM(units=features, 
               stateful=True, 
               return_sequences=True, #just to keep a nice output shape even with length 1
               input_shape=(None,features))(inputs) 
    #units = features because we want to use the outputs as inputs
    #None because we want variable length

#output_shape -> (batch_size, steps, units) 

Bây giờ, chúng ta sẽ cần một vòng lặp thủ công để dự đoán:

input_data = someDataWithShape((batch, 1, features))

#important, we're starting new sequences, not continuing old ones:
model.reset_states()

output_sequence = []
last_step = input_data
for i in steps_to_predict:

    new_step = model.predict(last_step)
    output_sequence.append(new_step)
    last_step = new_step

 #end of the sequences
 model.reset_states()

Nhiều đến nhiều với trạng thái = Đúng

Bây giờ, ở đây, chúng tôi nhận được một ứng dụng rất hay: đưa ra một chuỗi đầu vào, cố gắng dự đoán các bước chưa biết trong tương lai của nó.

Chúng tôi đang sử dụng cùng một phương pháp như trong "một đến nhiều" ở trên, với sự khác biệt là:

  • chúng tôi sẽ sử dụng chính chuỗi đó là dữ liệu đích, đi trước một bước
  • chúng tôi biết một phần của chuỗi (vì vậy chúng tôi loại bỏ phần kết quả này).

ManyToManyStateful

Lớp (giống như trên):

outputs = LSTM(units=features, 
               stateful=True, 
               return_sequences=True, 
               input_shape=(None,features))(inputs) 
    #units = features because we want to use the outputs as inputs
    #None because we want variable length

#output_shape -> (batch_size, steps, units) 

Đào tạo:

Chúng tôi sẽ đào tạo mô hình của chúng tôi để dự đoán bước tiếp theo của chuỗi:

totalSequences = someSequencesShaped((batch, steps, features))
    #batch size is usually 1 in these cases (often you have only one Tank in the example)

X = totalSequences[:,:-1] #the entire known sequence, except the last step
Y = totalSequences[:,1:] #one step ahead of X

#loop for resetting states at the start/end of the sequences:
for epoch in range(epochs):
    model.reset_states()
    model.train_on_batch(X,Y)

Dự đoán:

Giai đoạn đầu tiên của dự đoán của chúng tôi liên quan đến "điều chỉnh các quốc gia". Đó là lý do tại sao chúng ta sẽ dự đoán lại toàn bộ chuỗi, ngay cả khi chúng ta đã biết phần này của nó:

model.reset_states() #starting a new sequence
predicted = model.predict(totalSequences)
firstNewStep = predicted[:,-1:] #the last step of the predictions is the first future step

Bây giờ chúng ta đi đến vòng lặp như trong một đến nhiều trường hợp. Nhưng đừng thiết lập lại trạng thái ở đây! . Chúng tôi muốn mô hình biết bước nào của chuỗi đó (và nó biết nó ở bước mới đầu tiên vì dự đoán chúng tôi vừa thực hiện ở trên)

output_sequence = [firstNewStep]
last_step = firstNewStep
for i in steps_to_predict:

    new_step = model.predict(last_step)
    output_sequence.append(new_step)
    last_step = new_step

 #end of the sequences
 model.reset_states()

Cách tiếp cận này đã được sử dụng trong các câu trả lời và tập tin này:

Đạt được cấu hình phức tạp

Trong tất cả các ví dụ trên, tôi đã chỉ ra hành vi của "một lớp".

Tất nhiên, bạn có thể xếp chồng nhiều lớp lên nhau, không nhất thiết phải theo cùng một mẫu và tạo các mô hình của riêng bạn.

Một ví dụ thú vị đã xuất hiện là "bộ mã hóa tự động" có "bộ mã hóa nhiều thành một", theo sau là bộ giải mã "một đến nhiều":

Mã hoá:

inputs = Input((steps,features))

#a few many to many layers:
outputs = LSTM(hidden1,return_sequences=True)(inputs)
outputs = LSTM(hidden2,return_sequences=True)(outputs)    

#many to one layer:
outputs = LSTM(hidden3)(outputs)

encoder = Model(inputs,outputs)

Bộ giải mã:

Sử dụng phương pháp "lặp lại";

inputs = Input((hidden3,))

#repeat to make one to many:
outputs = RepeatVector(steps)(inputs)

#a few many to many layers:
outputs = LSTM(hidden4,return_sequences=True)(outputs)

#last layer
outputs = LSTM(features,return_sequences=True)(outputs)

decoder = Model(inputs,outputs)

Bộ giải mã tự động:

inputs = Input((steps,features))
outputs = encoder(inputs)
outputs = decoder(outputs)

autoencoder = Model(inputs,outputs)

Đào tạo với fit(X,X)

Giải thích thêm

Nếu bạn muốn biết chi tiết về cách các bước được tính trong LSTM hoặc chi tiết về các stateful=Truetrường hợp ở trên, bạn có thể đọc thêm trong câu trả lời này: Nghi ngờ về `Hiểu về máy ảnh LSTMs`


1
Rất thú vị khi sử dụng trạng thái với việc sử dụng đầu ra làm đầu vào. Cũng như một ghi chú bổ sung, một cách khác để làm điều này là sử dụng API Keras chức năng (giống như bạn đã thực hiện ở đây, mặc dù tôi tin rằng bạn có thể đã sử dụng trình tự tuần tự) và chỉ cần sử dụng lại cùng một ô LSTM cho mỗi bước , trong khi chuyển cả trạng thái kết quả và đầu ra từ ô sang chính nó. Tức là my_cell = LSTM(num_output_features_per_timestep, return_state=True), theo sau là một vòng lặpa, _, c = my_cell(output_of_previous_time_step, initial_states=[a, c])
Jacob R

1
Các ô và chiều dài là các giá trị hoàn toàn độc lập. Không có hình ảnh nào đại diện cho số lượng "tế bào". Tất cả đều cho "chiều dài".
Daniel Möller

1
@ DanielMöller Tôi biết là hơi muộn, nhưng câu trả lời của bạn thực sự thu hút sự chú ý của tôi. Một quan điểm của bạn đã phá vỡ mọi thứ về sự hiểu biết của tôi về lô nào cho LSTM. Bạn cung cấp ví dụ với N xe tăng, năm bước và hai tính năng. Tôi tin rằng, nếu lô là ví dụ hai, điều đó có nghĩa là hai mẫu (bể có 5 bước 2 tính năng) sẽ được đưa vào mạng và sau đó sẽ có trọng lượng phù hợp. Nhưng nếu tôi hiểu đúng, bạn nói rằng lô 2 có nghĩa là dấu thời gian của các mẫu sẽ được chia thành 2 và nửa đầu của tất cả các mẫu sẽ được đưa vào LSTM-> cập nhật trọng lượng và hơn lần thứ hai.
cha đẻ

1
Đúng. Trên trạng thái = True, lô 1 = nhóm mẫu, cập nhật. Sau đó, đợt 2 = nhiều bước hơn cho cùng một nhóm mẫu, cập nhật.
Daniel Möller

2
Tôi ước tôi có thể nâng cấp 100 lần này. Câu trả lời siêu hữu ích.
adamconkey

4

Khi bạn có return_ Hậu quả trong lớp RNN cuối cùng của bạn, bạn không thể sử dụng lớp Mật độ đơn giản thay vì sử dụng TimeDistribution.

Đây là một ví dụ về mã này có thể giúp đỡ người khác.

words = keras.layers.Input (batch_shape = (Không có, self.maxSequenceLpm), name = "input")

    # Build a matrix of size vocabularySize x EmbeddingDimension 
    # where each row corresponds to a "word embedding" vector.
    # This layer will convert replace each word-id with a word-vector of size Embedding Dimension.
    embeddings = keras.layers.embeddings.Embedding(self.vocabularySize, self.EmbeddingDimension,
        name = "embeddings")(words)
    # Pass the word-vectors to the LSTM layer.
    # We are setting the hidden-state size to 512.
    # The output will be batchSize x maxSequenceLength x hiddenStateSize
    hiddenStates = keras.layers.GRU(512, return_sequences = True, 
                                        input_shape=(self.maxSequenceLength,
                                        self.EmbeddingDimension),
                                        name = "rnn")(embeddings)
    hiddenStates2 = keras.layers.GRU(128, return_sequences = True, 
                                        input_shape=(self.maxSequenceLength, self.EmbeddingDimension),
                                        name = "rnn2")(hiddenStates)

    denseOutput = TimeDistributed(keras.layers.Dense(self.vocabularySize), 
        name = "linear")(hiddenStates2)
    predictions = TimeDistributed(keras.layers.Activation("softmax"), 
        name = "softmax")(denseOutput)  

    # Build the computational graph by specifying the input, and output of the network.
    model = keras.models.Model(input = words, output = predictions)
    # model.compile(loss='kullback_leibler_divergence', \
    model.compile(loss='sparse_categorical_crossentropy', \
        optimizer = keras.optimizers.Adam(lr=0.009, \
            beta_1=0.9,\
            beta_2=0.999, \
            epsilon=None, \
            decay=0.01, \
            amsgrad=False))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.