我正在尝试在Tensorflow中创建一个具有多个softmax输出的网络,每个softmax具有不同的大小。 网络架构是:输入 -> LSTM -> Dropout。然后我有2个softmax层:10个输出的softmax和20个输出的softmax。这样做的原因是因为我想生成两组输出(10个和20个),然后将它们组合以产生最终输出。我不确定如何在Tensorflow中实现这一点。
以前,要创建一个与描述相似但只有一个softmax的网络,我认为我可以这样做。
然而,现在,我希望我的RNN输出(经过dropout后)流入大小为10和20的两个softmax层。有人知道如何做到这一点吗?
谢谢。
编辑:理想情况下,我想使用类似于Knet Julia库中定义的softmax版本。Tensorflow有相应的功能吗? https://github.com/denizyuret/Knet.jl/blob/1ef934cc58f9671f2d85063f88a3d6959a49d088/deprecated/src7/op/actf.jl#L103
以前,要创建一个与描述相似但只有一个softmax的网络,我认为我可以这样做。
inputs = tf.placeholder(tf.float32, [batch_size, maxlength, vocabsize])
lengths = tf.placeholders(tf.int32, [batch_size])
embeddings = tf.Variable(tf.random_uniform([vocabsize, 256], -1, 1))
lstm = {}
lstm[0] = tf.contrib.rnn.LSTMCell(hidden_layer_size, state_is_tuple=True, initializer=tf.contrib.layers.xavier_initializer(seed=random_seed))
lstm[0] = tf.contrib.rnn.DropoutWrapper(lstm[0], output_keep_prob=0.5)
lstm[0] = tf.contrib.rnn.MultiRNNCell(cells=[lstm[0]] * 1, state_is_tuple=True)
output_layer = {}
output_layer[0] = Layer.W(1 * hidden_layer_size, 20, 'OutputLayer')
output_bias = {}
output_bias[0] = Layer.b(20, 'OutputBias')
outputs = {}
fstate = {}
with tf.variable_scope("lstm0"):
# create the rnn graph at run time
outputs[0], fstate[0] = tf.nn.dynamic_rnn(lstm[0], tf.nn.embedding_lookup(embeddings, inputs),
sequence_length=lengths,
dtype=tf.float32)
logits = {}
logits[0] = tf.matmul(tf.concat([f.h for f in fstate[0]], 1), output_layer[0]) + output_bias[0]
loss = {}
loss[0] = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits[0], labels=labels[0]))
然而,现在,我希望我的RNN输出(经过dropout后)流入大小为10和20的两个softmax层。有人知道如何做到这一点吗?
谢谢。
编辑:理想情况下,我想使用类似于Knet Julia库中定义的softmax版本。Tensorflow有相应的功能吗? https://github.com/denizyuret/Knet.jl/blob/1ef934cc58f9671f2d85063f88a3d6959a49d088/deprecated/src7/op/actf.jl#L103