LSTMセルとTensorflowを使用してテキスト生成ニューラルネットワークを作成しようとしています。私は時間主形式[time_steps、batch_size、input_size]で文章をネットワーク上で訓練しています。シーケンスの次の単語を予測するために、各時間ステップを欲しいと思います。シーケンスはタイムステップまで空の値で埋められ、別のプレースホルダにはバッチ内の各シーケンスの長さが含まれます。各タイムステップで可変長出力のコストを計算します。
バックプロパゲーションの概念については多くの情報がありますが、可変長シーケンスコスト計算のテンソルフローの実際の実装については何も見つかりません。シーケンスの終わりにはパッドが置かれているので、パッド付きの部品のコストを計算したくないと仮定しています。ですから、最初の出力からシーケンスの最後までの出力をクリップする方法が必要です。
outputs = []
states = []
cost = 0
for i in range(time_steps+1):
output, state = cell(X[i], state)
z1 = tf.matmul(output, dec_W1) + dec_b1
a1 = tf.nn.sigmoid(z1)
z2 = tf.matmul(a1, dec_W2) + dec_b2
a2 = tf.nn.softmax(z2)
outputs.append(a2)
states.append(state)
#== calculate cost
cost = cost + tf.nn.softmax_cross_entropy_with_logits(logits=z2, labels=y[i])
optimizer = tf.train.AdamOptimizer(0.001).minimize(cost)
このコードでは可変長シーケンスなしで動作します:
は、ここで私が現在持っているコードです。しかし、もし私が最後に追加された値をパディングすると、それはあまり意味をなさないパディングされたセクションのコストも計算されます。
シーケンスの長さ上限の前に出力のコストのみを計算するにはどうすればよいですか?