gpt4 book ai didi

tensorflow - 将 Dense 应用于 RNN 层中的每个输出

转载 作者:行者123 更新时间:2023-12-02 02:35:11 26 4
gpt4 key购买 nike

我正在尝试将以下 Keras 代码转换为纯 Tensorflow,但在向双向 RNN 输出的每个时间步添加密集层时遇到问题:

这是有问题的 Keras 代码:

self.model = Sequential()
self.model.add(Bidirectional(LSTM(nr_out, return_sequences=True,
dropout_W=dropout, dropout_U=dropout),
input_shape=(max_length, nr_out)))
self.model.add(TimeDistributed(Dense(nr_out, activation='relu', init='he_normal')))
self.model.add(TimeDistributed(Dropout(0.2)))

这是初始 tensorflow 代码:

lstm_cell_fwd = rnn.BasicLSTMCell(num_hidden, forget_bias=1.0)
lstm_cell_bwd = rnn.BasicLSTMCell(num_hidden, forget_bias=1.0)
outputs, output_state_fw, output_state_bw = rnn.static_bidirectional_rnn(lstm_cell_fwd, lstm_cell_bwd, inputs=sequence, dtype=tf.float64)

通常,如果我只想预测最后一个状态,我会这样做:

logits = tf.matmul(outputs[-1], weights['out']) + biases['out']

在 Tensorflow 中表达 TimeDistributed 层的最佳方式是什么?

最佳答案

尝试将您的单元格定义更新为:

lstm_cell_fwd = rnn.BasicLSTMCell(num_hidden, forget_bias=1.0)
lstm_cell_fwd = rnn.DropoutWrapper(lstm_cell_fwd, input_keep_prob=dropout, output_keep_prob=dropout) # if you want to keep dropout, which seems to be in your Keras model
lstm_cell_fwd = rnn.OutputProjectionWrapper(lstm_cell_fwd, nr_out) # FC output layer
# Similarly for lstm_cell_bwd
outputs, output_state_fw, output_state_bw = rnn.static_bidirectional_rnn(lstm_cell_fwd, lstm_cell_bwd, ...)

看起来你的 Keras 定义使用了 dropout,所以我在这里添加了一个 dropout 层。我相信 Keras 中的 dropout_W 相当于 TF 中的 input_keep_prob,而 Keras 中的 dropout_U 相当于 TF 中的 output_keep_prob。对于您的 dropout 层,您需要定义一个占位符:

dropout = tf.placeholder(tf.float32, [], name='dropout')

当您运行网络时,以一定的 dropout 概率进行训练,通常使用 dropout=1.0 进行验证、测试和使用网络。

关于tensorflow - 将 Dense 应用于 RNN 层中的每个输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46449922/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com