tensorflow 1.12.0
在下面的代码片段中,似乎wrapd_rv_val和seq_rv_val应该等效,但事实并非如此。而是将seq_rv_val正确初始化为随机生成的init_val数组,但将wrapd_rv_val设置为全1。这是怎么回事?
import numpy as np
import tensorflow as tf
init_val = np.random.rand(1, 1, 16, 1).astype(np.dtype('float32'))
wrapped_rv = tf.nn.softmax(tf.get_variable('wrapped_rv', initializer=init_val))
var = tf.get_variable('seq_rv', initializer=init_val)
seq_rv = tf.nn.softmax(var, axis=2)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
wrapped_rv_val = sess.run(wrapped_rv)
seq_rv_val = sess.run(seq_rv)
print("seq_rv_val: {0}".format(seq_rv_val.flatten()))
print("wrapped_rv_val: {0}".format(wrapped_rv_val.flatten()))
输出:
seq_rv_val:[0.28422353 0.12556878 0.18170598 0.19684952 0.21165217]
wrapped_rv_val:[1。 1. 1. 1. 1。]
答案 0 :(得分:1)
实际上,当您执行以下操作时,seq_rv_val
和wrapped_rv_val
都将正确地初始化为随机生成的init_val array
。
# change
wrapped_rv = tf.nn.softmax(tf.get_variable('wrapped_rv', initializer=init_val))
# to
wrapped_rv = tf.nn.softmax(tf.get_variable('wrapped_rv', initializer=init_val), axis=2)
接下来,我将解释为什么将wrapped_rv
初始化为1。让我们看一下softmax
的公式。
设置axis=2
时,分母求和项的数量将为16。但是,当您设置axis=-1
(默认值)时,分母求和项的数量将为1。因此,将分子与分母相同,将其设置为axis=-1
时结果为1。
您可以运行以下示例来了解问题所在。
import tensorflow as tf
y = tf.constant([[1],[0],[1]],dtype=tf.float32)
y1 = tf.constant([[1],[2],[3]],dtype=tf.float32)
y2 = tf.constant([[1],[3],[7]],dtype=tf.float32)
softmax_var1 = tf.nn.softmax(logits=y1)
softmax_var2 = tf.nn.softmax(logits=y2)
with tf.Session() as sess:
print(sess.run(softmax_var1))
print(sess.run(softmax_var2))
[[1.]
[1.]
[1.]]
[[1.]
[1.]
[1.]]