以下是来自https://www.tensorflow.org/programmers_guide/low_level_intro#training的两个TensorFlow脚本。我对此非常陌生并试图拼凑出一个解释/理解;我在脚本下面列出了三个问题。
x = tf.placeholder(tf.float32, shape=[None, 3])
linear_model = tf.layers.Dense(units=1)
y = linear_model(x)
init = tf.global_variables_initializer()
sess.run(init)
print(sess.run(y, {x: [[1, 2, 3], [4, 5, 6]]}))
x = tf.constant([[1], [2], [3], [4]], dtype=tf.float32)
y_true = tf.constant([[0], [-1], [-2], [-3]], dtype=tf.float32)
linear_model = tf.layers.Dense(units=1)
y_pred = linear_model(x)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
print(sess.run(y_pred))
我的问题是:
答案 0 :(得分:1)
tf.layers.Dense计算输入的线性组合,并对结果应用激活函数。
由于你将单位定义为1而没有指定激活函数,你得到的是第一个例子中的ax + by + cz + d和第二个例子中的ax + b。实际上,这是一个包含性能行的列矩阵。
通常学习乘法器(我提供的示例中的a,b,c,d)。您的代码不会训练它们。要正确学习,他们需要从一些合理的价值观开始(例如0不利于学习)。您可以指定自己的初始化程序。在这种情况下,您使用默认值(根据docs glorot_uniform_initializer)。
您可以使用tf.trainable_variables()
获取所有变量(包括tf.layers.Dense
定义的变量并对其进行评估(使用sess.run
)以查看其值。
关于您的问题:
是什么决定了这两个(模型?)的测距输出 它是您在x中输入的输入与默认初始化程序中输出的随机值之间的点积。
为什么两者的输出都是正数还是全部为负数? 随机的机会。打印变量,运行初始化程序几次,看看它们是如何变化的。
为什么两者的输出都按数字顺序分别列出各个值? 由于您要么接受正权重,要么默认初始化程序更喜欢正权重,较高值的线性组合将获得更高的结果。在你的第二个例子中,它应该是相当明显的,因为你在ax + b和a> 0中替换1,2,3,4。