keras 如何根据批量大小构建批次?

How does keras build batches depending on the batch-size?

我正在尝试使用 keras 实现情感分类器。但是我在 batch_size 参数方面遇到了一些问题。这可能是一个特定的问题,我没有在网上找到任何帮助我的东西。

这是模型的外观示例:

Input_1                     Input_2             
(None, 200)                 (None, 200)
  |                            |
  |                            |   
Embedding_1                 Embedding_2
(None, 200, 200)            (None, 200, 200)
  |                            |
  |                            |
Reshape_1                   Reshape_2
(32, 200, 200)              (32, 200, 200)
    \                         /
     \                       /
      -----------        ----
                 \      /
                Concatenate(axis=2)
                (32,200,400)
                     |
                     |
                     ...

重塑是由 Lambda 层使用来自 keras.backend:

的重塑函数完成的
output = Lambda(lambda x: bd.reshape(x, (batch_size, 200, em_dim)), name='Reshape_Batch_size')(embedded)

我重塑两个嵌入的输出(也使用 batch_size),因为 keras Concatenate-Layer 需要在每个轴上具有相同形状的张量,除了你连接的那个。为了能够进行整形,我将样本数调整为 batch_size 的倍数。如果我想训练我的网络,在最后一批 epoch 之前一切正常。 我得到一个错误,input_values 的数量与预期的数量不匹配:

InvalidArgumentError (see above for traceback): Input to reshape is a tensor with 320000 values, but the requested shape has 1280000 [[Node: Reshape_Batch_size/Reshape = Reshape[T=DT_FLOAT, Tshape=DT_INT32, _device="/job:localhost/replica:0/task:0/device:CPU:0"](Embedding_basic_em/Gather, Reshape_Batch_size/Reshape/shape)]]

320000 = 8 * 200 * 200
1280000 = 32 * 200 * 200

这看起来像 keras 正在从最后一批中切割 24 个样本。但是如果我查看训练的输出,它会告诉我还有 32 个剩余样本:

Epoch 1/8 17440/17472 [============================>.] - ETA: 0s - loss: 5.1635 - acc: 0.6796

有人知道 keras 如何根据给定的 batch_size 参数或我在这里遗漏的内容处理批次吗? 或者也许有人暗示我如何在不重塑输出的情况下进行连接。

我的配置:

我正在使用来自 Anaconda 4.4.0 (x86_64) 的 Python 3.5.3,使用 macOS Sierra 版本 10.12.6。 作为 keras 后端,我使用的是 tensorflow(1.4.0)。 keras的版本是2.1.1

提前致谢

样本总量是多少?最后一批有32个样本当然应该是32的倍数。否则,大小将使用 "remaining" 个样本。

测试一下:

assert len(x_train) % 32 == 0

您确定需要整形吗?

为什么需要重塑层?在 keras 中,您不能为模型中的不同张量设置不同的批量大小,除非您在 lambda 层中显式更改这些大小。

此外,如果输入形状是 (None, 200, 200) 并且输出形状是 (32,200,200),那么您什么也没做。张量完全一样。

只需删除那些重塑图层