Преобразование BasicLSTMCell в двунаправленный LSTM

#python #tensorflow #keras #lstm #bidirectional

#python #тензорный поток #keras #lstm #двунаправленный

Вопрос:

Недавно я попытался использовать API BasicLSTMCell из Tensorflow для создания подписи к видео. Я работаю с кодом, который строит BasicLSTMCell следующим образом:

 self.lstm1 = tf.compat.v1.nn.rnn_cell.BasicLSTMCell(dim_hidden, state_is_tuple=False)
self.lstm2 = tf.compat.v1.nn.rnn_cell.BasicLSTMCell(dim_hidden, state_is_tuple=False)
 

Затем использует его позже следующим образом:

 with tf.compat.v1.variable_scope("Encoding") as scope:  
      for i in range(0, self.n_video_lstm_step):
          if i > 0:
              scope.reuse_variables()

          with tf.compat.v1.variable_scope("LSTM1"):
              output1, state1 = self.lstm1(image_emb[:,i,:], state1)

          with tf.compat.v1.variable_scope("LSTM2"):
              output2, state2 = self.lstm2(tf.concat([padding, output1], 1), state2)
  
          out_list.append(tf.concat([output1, output2], 1))
     
 

Я хочу, чтобы эти ячейки LSTM были двунаправленными для моего требования. Я пытался использовать

 keras.layers.Bidirectional(keras.layers.LSTM(dim_hidden, unit_forget_bias=True, unroll=True))
 

Но это не сработало. Может кто-нибудь сообщить мне, как заставить его работать с двунаправленным lstm.

Комментарии:

1. Чтобы уточнить, пытаетесь ли вы использовать двунаправленную оболочку для существующей реализации LSTM в Keras или вы создаете ячейки LSTM

Ответ №1:

Исходя из заданного вами вопроса, Convert BasicLSTMCell to bidirectional LSTM — Вы можете использовать двунаправленную оболочку RNN напрямую, как показано в приведенном ниже коде. Уточните, как вы изменяете класс слоя LSTM, который вызывает ошибку, с которой вы столкнулись. Я соответствующим образом обновлю свой ответ.

 import numpy as np
from tensorflow.keras import layers, Model, utils

X = np.random.random((100,10,3))
y = np.random.random((100,))

inp = layers.Input((10,3))
x = layers.Bidirectional(layers.LSTM(8, return_sequences=True))(inp)
x = layers.Bidirectional(layers.LSTM(8))(x)
out = layers.Dense(1, activation='softmax')(x)

model = Model(inp, out)
utils.plot_model(model, show_layer_names=False, show_shapes=True)

model.compile(optimizer='adam', loss='binary_crossentropy')
model.fit(X, y, epochs=3)
 
 Epoch 1/3
4/4 [==============================] - 5s 10ms/step - loss: 0.6963
Epoch 2/3
4/4 [==============================] - 0s 22ms/step - loss: 0.6965
Epoch 3/3
4/4 [==============================] - 0s 11ms/step - loss: 0.6976
<tensorflow.python.keras.callbacks.History at 0x7f91066bf4c0>