私は、スカラー入力に基づく数学的演算選択nnモデルを生成しようとしています。操作は、nnによって生成されるsoftmaxの結果に基づいて選択されます。次に、最終出力を生成するためにこの演算をスカラ入力に適用しなければならない。これまでは、softmax出力にargmaxとonehotを適用してマスクを作成しました。このマスクは、実行可能なすべての操作から連結値マトリックスに適用されます(以下の疑似コードに示されています)。問題は、argmaxもonehotも区別できないように見えるということです。私はこれに新しいので、いずれかが高く評価されるだろう。前もって感謝します。TensorFlowで微分可能な演算の選択はどのようにして行いますか?
#perform softmax
logits = tf.matmul(current_input, W) + b
softmax = tf.nn.softmax(logits)
#perform all possible operations on the input
op_1_val = tf_op_1(current_input)
op_2_val = tf_op_2(current_input)
op_3_val = tf_op_2(current_input)
values = tf.concat([op_1_val, op_2_val, op_3_val], 1)
#create a mask
argmax = tf.argmax(softmax, 1)
mask = tf.one_hot(argmax, num_of_operations)
#produce the input, by masking out those operation results which have not been selected
output = values * mask
は、あなたの答えをありがとうございました。私はソフトマックスそのものを試してみたところ、最大値は1に近く、小さな値は0になります。直ちにロジットの大きな違いを生み出すために、 'softmax = tf.nn.softmax(10000 * logits)'のようなものを使ってマスクを生成するのが妥当ですか、それとも重みを使ってnnを訓練するべきですか? – user59271
私はあなたが重量を介してそれを選ぶためにnnを訓練するべきだと思います。 1000のような大きな数字を乗算する唯一の問題は、トレーニングプロセスの早い段階でソフトマックスを飽和させることです。大きなロジット値のsoftmaxのグラジエントはほぼ0なので、softmaxの背後の重みはトレーニングプロセスの開始時でさえも更新が少なくなります。 1000を乗算すると勾配が増加するはずですが、ソフトマックスの勾配の指数関数的な低下とは一致しません。 –