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)
,那么您什么也没做。张量完全一样。
只需删除那些重塑图层
我正在尝试使用 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)
,那么您什么也没做。张量完全一样。
只需删除那些重塑图层