【问题标题】:TensorFlow Multi-Layer PerceptronTensorFlow 多层感知器
【发布时间】:2016-09-21 18:14:22
【问题描述】:

我正在学习 TensorFlow,我的目标是实现 MultiPerceptron 以满足我的需求。我检查了MNIST tutorial with MultiPerceptron implementation,除此之外一切都很清楚:

    _, c = sess.run([optimizer, cost], feed_dict={x: batch_x,
                                                  y: batch_y})

我猜,x 本身就是一个图像(28*28 像素,所以输入是 784 个神经元),y 是一个标签,它是一个 1x10 数组:

x = tf.placeholder("float", [None, n_input])
y = tf.placeholder("float", [None, n_classes])

他们提供整批(数据点和标签包)! tensorflow 如何解释这个“批量”输入?它如何更新权重:在批次中的每个元素之后同时更新,还是在整个批次运行之后?

而且,如果我需要输入一个数字 (input_shape = [1,1]) 并输出四个数字 (output_shape = [1,4]),我应该如何更改 tf.placeholders 以及我应该以哪种形式将它们输入会话?

  1. 当我问,tensorflow 是如何解释它时,我想知道 tensorflow 是如何将批处理拆分为单个元素的。例如,批处理是一个二维数组,对吧?它在哪个方向拆分数组?或者它使用矩阵运算并且不分割任何东西?

  2. 1234563 -D 列表。

当我将 float numpy 数组 X_train 提供给 x 时,即:

x = tf.placeholder("float", [1, n_input])

我收到一个错误:

ValueError: Cannot feed value of shape (1, 18) for Tensor 'Placeholder_10:0', which has shape '(1, 1)'

看来我也必须将数据创建为张量?

当我尝试 [18x1] 时:

Cannot feed value of shape (18, 1) for Tensor 'Placeholder_12:0', which has shape '(1, 1)'

【问题讨论】:

    标签: python machine-learning tensorflow


    【解决方案1】:

    他们喂整个浴池(数据点和标签包)!

    是的,这就是神经网络通常的训练方式(由于具有两全其美的一些很好的数学特性 - 一方面比 SGD 更好的梯度逼近,并且比完全 GD 更快收敛)。

    tensorflow 如何解释这个“批量”输入?

    它根据图表中的操作“解释”它。您可能在图表中的某处有 reduce mean,它计算您的批次的 average,从而导致这是“解释”。

    它如何更新权重: 1.同时在批次中的每个元素之后? 2.跑完就扔了整批?

    和上一个答案一样——batch没有什么“神奇”的,它只是另一个维度,神经网络的每个内部操作都针对这批数据进行了很好的定义,因此仍然存在单个 更新到底。由于您使用减少平均操作(或者可能减少总和?),您正在根据“小”梯度的平均值进行更新(或者如果存在减少总和则总和)。再一次 - 你可以控制它(直到凝聚行为,你不能强迫它进行每个样本更新,除非你在图中引入 while 循环)。

    而且,如果我需要输入一个数字(input_shape = [1,1])并输出四个数字(output_shape = [1,4]),我应该如何更改 tf.placeholders 以及我应该以哪种形式输入他们进入会议?谢谢!!

    只需设置变量 n_input=1 和 n_classes=4,然后像以前一样将数据推送为 [batch, n_input] 和 [batch, n_classes] 数组(在您的情况下,batch=1,如果按“1x1”您的意思是“一个维度 1 的样本”,因为您的编辑开始暗示您实际上确实有一批,而 1x1 您的意思是一维输入)。

    编辑:1.当我问,tensorflow 如何解释它时,我想知道,tensorflow 如何将批处理拆分为单个元素。例如,批处理是一个二维数组,对吧?它在哪个方向拆分数组。或者它使用矩阵运算并且不分割任何东西? 2. 当我问,我应该如何提供我的数据时,我想知道,它应该是一个二维数组,其行和特征在其列,或者,它可能是一个二维列表。

    它不会分裂任何东西。它只是一个矩阵,并且每个操作都对矩阵进行了很好的定义。 通常您将示例放在行中,因此在 第一维中,这正是 [batch, n_inputs] 所说的 - 您有 batch 行,每个行都有 n_inputs列。但同样 - 它没有什么特别之处,如果你真的需要,你也可以创建一个接受按列批处理的图表。

    【讨论】:

    • 你能检查一下编辑吗?我让我的回答更具体。谢谢!
    • 对不起,代码中没有[batch, n_inputs]。你能看一下第二版吗
    • [None, n_inputs] 是一回事(None 表示 TF 应该自己推断这个维度)。您的第二次编辑建议您尝试将具有 18 列的单行矩阵推入您定义为 1 列和 1 行的值,因此与您的其余问题无关(您询问是否提供 1x1 和但是你喂了1x18)。它与创建任何张量无关(您不应该这样做)。您只是传递了一些形状奇特的数据,仅此而已。
    • [1x18] 矩阵在这里是一个“批次”。正如您之前所说,将x 分配为 [1x1](输入本身)就足够了,并将整个批次传递到那里,并在矩阵运算或一些魔法的帮助下让 tensorflow 处理它。说得非常具体:如果我想输入一批 18 个 [1x1] 输入,那批应该有什么形式。 y_batch 应该有什么形式(如果一个输出的形状是[1x4])?
    • 你应该通过 18x1 ,这种神经网络的输入是一维的。如果您有一个 convnet(或其他适用于 2d 数据的东西),您将传递 18x1x1 等,但在这里,只需传递 18x1。同样y 将是 18x4
    猜你喜欢
    • 2017-01-06
    • 1970-01-01
    • 2023-03-03
    • 2015-08-14
    • 1970-01-01
    • 2019-04-13
    • 2011-07-01
    • 2011-11-15
    • 2017-09-09
    相关资源
    最近更新 更多