如果我理解正确(否(,有两种方法可以将numpy数组传递给tensorflow计算图:
- 使用
tf.placeholder
并在feed_dict
中传递此 Numpy 数组 - 使用
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()
创建一个张量来将其包含在图形中。