如何在这两个类似的TensorFlow脚本中确定输出?

时间:2018-02-14 08:16:30

标签: python tensorflow

以下是来自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]]}))
  • 我注意到输出包含一个包含两个单独数组的数组,每个数组包含一个值
  • 第一个值始终介于0 - 6.9999999
  • 之间
  • 第二个数组中的第二个值介于0 - 15.9999999
  • 之间
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.9999999
  • 之间
  • 第二个数组中的第二个值介于0 - 3.9999999
  • 之间
  • 第三个数组中的第三个值介于0 - 5.9999999
  • 之间
  • 第四个数组中的第四个值介于0 - 6.9999999
  • 之间

我的问题是:

  1. 什么决定了这两个阵列的测距输出?
  2. 为什么两者的输出都是正数还是全部为负数?
  3. 为什么两者的输出都按数字顺序各自有各个值?

1 个答案:

答案 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)以查看其值。

关于您的问题:

  1. 是什么决定了这两个(模型?)的测距输出 它是您在x中输入的输入与默认初始化程序中输出的随机值之间的点积。

  2. 为什么两者的输出都是正数还是全部为负数? 随机的机会。打印变量,运行初始化程序几次,看看它们是如何变化的。

  3. 为什么两者的输出都按数字顺序分别列出各个值? 由于您要么接受正权重,要么默认初始化程序更喜欢正权重,较高值的线性组合将获得更高的结果。在你的第二个例子中,它应该是相当明显的,因为你在ax + b和a> 0中替换1,2,3,4。