TensorFlow 使用占位符 vs tf.convert_to_tensor() 将 numpy 数组传递给图形



如果我理解正确(否(,有两种方法可以将numpy数组传递给tensorflow计算图:

  1. 使用tf.placeholder并在feed_dict中传递此 Numpy 数组
  2. 使用tf.convert_to_tensor,将此 Numpy 数组转换为张量,然后将此张量用于任何计算。

这两种方法之间有什么区别吗?

tf_convert_to_tensor是非常不切实际的,因为它不能扩展。请参阅以下示例:

X = np.random.rand(3,3)
Y = np.random.rand(3,3)
X_tensor = tf.convert_to_tensor(X)
X_squared = tf.square(X_tensor)
Y_tensor = tf.convert_to_tensor(Y)
Y_squared = tf.square(Y)
with tf.Session() as sess:
x = sess.run(X_squared)
y = sess.run(Y_squared)

如您所见,对于我们要作为图形输入提供的每个 Numpy 数组,我们必须创建一个新的tf.convert_to_tensor操作。例如,如果您有一个不会更改的静态输入,那么您可以使用单个tf.convert_to_tensor操作。另一方面,让我们看一下使用tf.placeholder的相同示例:

X = np.random.rand(3,3)
Y = np.random.rand(3,3)
graph_input = tf.placeholder(shape=[None, None], dtype=tf.float64)
squared = tf.square(graph_input)
with tf.Session() as sess:
x = sess.run(squared, feed_dict={graph_input: X})
y = sess.run(squared, feed_dict={graph_input: Y})

如您所见,我们使用tf.placeholder为图形动态提供输入数据。将其视为一个漏斗,用于将数据倒入图表中。对于在整个训练过程中可能/将要更改的数据(例如学习率、辍学概率等(,tf.placeholder很好。

占位符张量:

据我所知,tf.placeholder默认的tf.Graph对象中创建了一个占位符张量。placeholder张量基本上为值进入图形创建了一个路径/入口。它们充当图形的输入,图形也可能对应于模型。 这些值(不属于图形(使用您提到的feed_dict提供给占位符。

tf.convert_to_tensor()

正如官方文档中提到的,

此函数将各种类型的 Python 对象转换为张量 对象。它接受张量对象、numpy 数组、Python 列表和 蟒蛇标量。

它将现有的NumPy数组或Python对象转换为相应的张量(具有相同的dtype和形状(。此张量不会是占位符张量。它只是一个实用程序,用于转换 NumPy 数组并从中创建tf.Tensor对象。

因此,占位符张量允许您使用feed_dict将 NumPy 数组或 Python 对象直接馈送到图形中。如果你的数据是静态的,那么你可以通过使用tf.convert_to_tensor()创建一个张量来将其包含在图形中。

最新更新