Machine learning 什么时候需要占位符?

Machine learning 什么时候需要占位符?,machine-learning,tensorflow,Machine Learning,Tensorflow,我看到的每个TensorFlow示例都使用占位符将数据输入到图形中。但我的应用程序在没有占位符的情况下运行良好。根据,使用占位符是“最佳实践”,但它们似乎使代码变得不必要的复杂 是否存在绝对需要占位符的情况?A占位符承诺以后提供值。 简单的例子是定义两个占位符a、b,然后对它们执行如下操作 a = tf.placeholder(tf.float32) b = tf.placeholder(tf.float32) adder_node = a + b # + provides a shortcu

我看到的每个TensorFlow示例都使用占位符将数据输入到图形中。但我的应用程序在没有占位符的情况下运行良好。根据,使用占位符是“最佳实践”,但它们似乎使代码变得不必要的复杂


是否存在绝对需要占位符的情况?

A占位符承诺以后提供值。 简单的例子是定义两个占位符a、b,然后对它们执行如下操作

a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b  # + provides a shortcut for tf.add(a, b)
a、b
未初始化且不包含任何数据,因为它们被定义为占位符

另一种方法是定义变量
tf.Variable
,在这种情况下,在声明时必须提供初始值。 比如:

这种解决方案有两个缺点

  • 性能方面,您需要在调用时多做一步 但是,这些变量是可更新的

  • 在某些情况下,您不知道这些变量的初始值 因此,您必须将其定义为占位符

结论

  • 使用
    tf.Variable
    作为可训练变量,例如模型的权重(W)和偏差(B),或者当需要初始值时 将军

  • tf.placeholder
    允许您创建操作和构建计算图,而无需数据。在张量流中 术语,然后通过这些 占位符


A占位符承诺以后提供值。 简单的例子是定义两个占位符a、b,然后对它们执行如下操作

a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b  # + provides a shortcut for tf.add(a, b)
a、b
未初始化且不包含任何数据,因为它们被定义为占位符

另一种方法是定义变量
tf.Variable
,在这种情况下,在声明时必须提供初始值。 比如:

这种解决方案有两个缺点

  • 性能方面,您需要在调用时多做一步 但是,这些变量是可更新的

  • 在某些情况下,您不知道这些变量的初始值 因此,您必须将其定义为占位符

结论

  • 使用
    tf.Variable
    作为可训练变量,例如模型的权重(W)和偏差(B),或者当需要初始值时 将军

  • tf.placeholder
    允许您创建操作和构建计算图,而无需数据。在张量流中 术语,然后通过这些 占位符


我非常喜欢艾哈迈德的答案,我投了更高的票,但我想提供另一种解释,可能会,也可能不会让事情变得更清楚

Tensorflow的一个重要特性是,它的操作图被编译,然后在用于构建它们的原始环境之外执行。这使得Tensorflow可以进行各种技巧和优化,比如分布式、独立于平台的计算、图形互操作性、GPU计算等。但所有这些都是以复杂性为代价的。由于图形是在自己的虚拟机中执行的,因此必须有一种特殊的方式从外部将数据输入到图形中,例如从python程序

这就是占位符的作用。将数据馈送到模型中的一种方法是在执行图形操作时通过馈送字典提供数据。为了指示该数据应该在图形中的何处,可以使用占位符。这样,正如艾哈迈德所说,占位符是对未来提供的数据的一种承诺。它实际上是一个占位符,用于以后提供的内容。用一个类似艾哈迈德的例子

# define graph to do matrix muliplication x = tf.placeholder(tf.float32) y = tf.placeholder(tf.float32) # this is the actual operation we want to do, # but since we want to supply x and y at runtime # we will use placeholders model = tf.matmul(x, y) # now lets supply the data and run the graph init = tf.global_variables_initializer() with tf.Session() as session: session.run(init) # generate some data for our graph data_x = np.random.randint(0, 10, size=[5, 5]) data_y = np.random.randint(0, 10, size=[5, 5]) # do the work result = session.run(model, feed_dict={x: data_x, y: data_y} #定义用于矩阵复用的图形 x=tf.placeholder(tf.float32) y=tf.placeholder(tf.float32) #这就是我们要做的实际操作, #但是因为我们想在运行时提供x和y #我们将使用占位符 模型=tf.matmul(x,y) #现在让我们提供数据并运行图表 init=tf.global_variables_initializer() 使用tf.Session()作为会话: 会话运行(init) #为图表生成一些数据 数据\u x=np.random.ranndint(0、10、size=[5、5]) data_y=np.random.randint(0,10,size=[5,5]) #做这项工作 result=session.run(model,feed_dict={x:data_x,y:data_y} 还有其他向图形中提供数据的方法,但可以说,占位符和提要是最容易理解的方法,它提供了最大的灵活性

如果您想避免占位符,其他提供数据的方法可以是将整个数据集加载到graph build上的常量中,或者使用输入管道将加载和预处理数据的整个过程移动到graph中。您可以在TF文档中阅读所有这些


我非常喜欢艾哈迈德的答案,我投了更高的票,但我想提供另一种解释,可能会,也可能不会让事情变得更清楚

Tensorflow的一个重要特性是,它的操作图是在构建它们的原始环境之外编译和执行的。这使得Tensorflow可以进行各种技巧和优化,如分布式、平台无关计算、图形互操作性、GPU计算等。但所有这些都是在因为你的图形是在它自己的虚拟机中执行的,所以你必须有一种特殊的方式从外部向它输入数据,例如从你的python程序

这就是占位符的作用。将数据馈送到模型中的一种方法是在执行图形操作时通过馈送字典提供数据。为了指示这些数据应该在图形中的哪个位置,您可以使用占位符。正如艾哈迈德所说,这种方法是placeh # define graph to do matrix muliplication x = tf.placeholder(tf.float32) y = tf.placeholder(tf.float32) # this is the actual operation we want to do, # but since we want to supply x and y at runtime # we will use placeholders model = tf.matmul(x, y) # now lets supply the data and run the graph init = tf.global_variables_initializer() with tf.Session() as session: session.run(init) # generate some data for our graph data_x = np.random.randint(0, 10, size=[5, 5]) data_y = np.random.randint(0, 10, size=[5, 5]) # do the work result = session.run(model, feed_dict={x: data_x, y: data_y}