batch_size作为权重

时间:2018-03-13 12:54:40

标签: python python-3.x tensorflow neural-network

在阅读关于TensorFlow的教程时,我遇到了一些示例,其中权重被定义为大小[batch_size,...]

示例:

hidden_state = tf.zeros([batch_size, lstm.state_size])
current_state = tf.zeros([batch_size, lstm.state_size])
initializer=(tf.zeros([batch_size, state_size]), init_state))

据我所知,在使用迷你批次时,您可以通过迷你批次中的所有示例为网络提供信息。所有这些例子都将使用相同的权重进行转换。在基于(例如)各个梯度的平均值处理最后一个示例之后更新权重。

我的假设是扩展张量(由batch_size维度扩大)用于通过减少操作量来加快计算。

问:是否只创建batch_size个权重副本,这些权重最终会平均为下一个小批量的状态?(这也会使变量批量 - 大小直截了当。)

如果是这样,如何将权重初始化为具有均值mu和标准差sd的随机非零值?我是否使用随机值手动创建[input_size,hidden_​​size],然后通过复制batch_size次来创建张量,从而产生[batch_size,input_size,hidden_​​size]形状?

1 个答案:

答案 0 :(得分:1)

您正在查看的是Recurrent Cells的初始单元格状态。请注意,循环单元具有内部单元状态,该状态在每次调用时更新,然后在最后一次调用后作为输出取出。您可以将其视为vanilla神经网络中某层的输出,但您需要为该层更新一些值。

因此,当您第一次调用循环单元格时,您需要为这些单元格状态设定种子,这意味着您需要提供一些占位符值。现在,正如您所看到的,此状态对于每个输入都是唯一的,因此您需要为每个输入设置这些单元格。在这里,在您的示例中,您将播放单元格状态并使用零输出。

正如您在下图中所看到的,我们需要提供一个单元状态和一个输出状态,它会在调用时更新,这就是您需要为两个值设定种子的原因。 enter image description here

您正在谈论的权重实际上是共享的。在上面的图像中,它们对应于多个门(i,f,o),并且也用于输入x,就像在神经层中一样。您可以在this amazing post中了解有关lstms的更多信息。