Несколько Lstm после и до полного подключения - PullRequest
0 голосов
/ 18 марта 2019

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

Вот код keras:

input_data1 = Input(inshape, dtype='float32', name='input1')
encoder1 = TimeDistributed(Dense(128, activation='relu', name='encoder1'), name='encoder1_TD')(input_data1)

lstm1 = LSTM(256, return_sequences=True, name='lstm1')(encoder1)
lstm2 = LSTM(256, return_sequences=True, name='lstm2')(lstm1)

intermediate_data = TimeDistributed(Dense(128, activation='linear', name='decoder1'), name='decoder_TD1')(lstm2)
output_data = TimeDistributed(Dense(12, activation='linear', name='decoder2'), name='decoder_TD2')(intermediate_data)

model = Model(input_data, output_data)
print(model.summary())
return model

Может кто-нибудь помочь мне с архитектурой тензорного потока этого? Я не могу понять использование MultiRNNCell. Это дает мне ошибку всякий раз, когда я использую 2 или более слоев LSTM.

input shape = (batch_size, timesteps, 4)

output shape = (batch_size, timesteps, 8) 

1 Ответ

0 голосов
/ 18 марта 2019

Похоже, что последние изменения в API-интерфейсе tenorflow делают его похожим на keras, а также новые учебные пособия, ориентированные на решения, подобные keras.

Если вам нужен LSTM со стековым потоком «старого стиля», вы можете использовать tf.nn.rnn_cell.MultiRNNCell (теперь он устарел и заменен на tf.keras.layers.StackedRNNCells):

import tensorflow as tf
import tensorflow.contrib
from tensorflow.nn import dynamic_rnn

input_data = tf.placeholder(tf.float32, [batch_size, time_steps, num_features])
label_data = tf.placeholder(tf.float32, [batch_size, time_steps, num_labels])
# dense layer is broadcasted automatically to time-distributed data 
dense_data = tf.layers.dense(input_data, 128, activation='relu')

with tf.variable_scope('lstm') as scope:
    lstm1 = tensorflow.nn.rnn_cell.LSTMCell(256, state_is_tuple=True)
    lstm2 = tensorflow.nn.rnn_cell.LSTMCell(256, state_is_tuple=True)
    lstm3 = tensorflow.nn.rnn_cell.LSTMCell(256, state_is_tuple=True)
    # or even more layers
    # group them into one cell
    multi_cell = tensorflow.nn.rnn_cell.MultiRNNCell(cells=[lstm1, lstm2, lstm3], state_is_tuple=True)
    rnn_result, _ = tf.nn.dynamic_rnn(multi_cell, dense_data, dtype=tf.float32)

td_data_1 = tf.layers.dense(rnn_result, 128, activation='linear')
td_data_2 = tf.layers.dense(rnn_result, 12, activation='linear')

Теперь вы должны определить некоторую потерю, но не ясно, какую потерю вы планируете использовать, поэтому я пропускаю эту часть (в зависимости от некоторых характеристик это может быть sigmoid_cross_entropy_with_logits (в конце концов, это не выполнимый пример, но я могу предоставить один для некоторого стандартного набора данных, такого как MNIST или около того, если вам нужно):

loss = tf.nn...
train_op = tf.train.AdamOptimizer(1e-4).minimize(loss)
init_op = tf.initialize_all_variables()

Инициализация и обучение (упрощенно):

sess = tf.Session()
sess.run(init_op)

for i in range(len(x_tr) // batch_size):
    sess.run(
        train_op,
        feed_dict={
            input_data: x_tr[i*batch_size:i*batch_size+batch_size],
            output_data: y_tr_cat[i*batch_size:i*batch_size+batch_size],

        }
    )

Заметьте, пожалуйста, если вам не нужны стековые слои с тензорным потоком и требуется какое-то решение для версии 2.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...