#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>