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

时间:2017-11-29 14:38:39

标签: keras reshape

我尝试使用keras实现Sentiment-Classifier。但我在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)
                     |
                     |
                     ...

使用keras.backend中的reshape函数通过Lambda-Layer完成整形:

output = Lambda(lambda x: bd.reshape(x, (batch_size, 200, em_dim)), name='Reshape_Batch_size')(embedded)

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

  

InvalidArgumentError(参见上面的回溯):重塑的输入是a   张量为320000的值,但请求的形状有1280000            [[Node:Reshape_Batch_size / Reshape = Reshape [T = DT_FLOAT,Tshape = DT_INT32,   _device =" /作业:本地主机/复制:0 /任务:0 /装置:CPU:0"](Embedding_basic_em /聚集,   Reshape_Batch_size /整形/形状)]]

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

提前致谢

1 个答案:

答案 0 :(得分:0)

样品总量是多少?它应该是32的倍数,最后一批有32个样本。否则,大小将使用“剩余”样本。

测试它:

assert len(x_train) % 32 == 0

您确定需要重塑吗?

为什么需要重塑层?在keras中,除非在lambda图层中明确更改这些尺寸,否则模型中的不同张量不能有不同的批量大小。

此外,如果输入形状为(None, 200, 200)且输出形状为(32,200,200),则根本不执行任何操作。张量完全相同。

只需移除这些重塑图层