Keras 分类交叉熵 softmax input.dim_size 错误
Keras categorical cross entropy softmax input.dim_size error
我正在开发一个非常复杂的管道,我在其中从 TFRecords 文件构建 tf.Datasets 并将这些文件与数据扩充和许多健全性检查和验证一起提供给 Keras 模型。所以,请允许我为无法提供完全可重现的示例而道歉。
无论如何,我正在尝试训练图像分类模型,我的图像数据为 192*256 灰度张量,标签为单热编码三维向量。
当我尝试拟合模型时出现问题,它似乎来自 softmax 激活 and/or 分类交叉熵损失函数。
output_len = 3
activation = 'softmax'
loss = 'categorical_crossentropy'
optimizer = keras.optimizers.Adam()
categorical_model = keras.Sequential([
keras.layers.Flatten(input_shape=(192, 256, 1)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(output_len, activation='softmax')
])
categorical_model.summary()
categorical_model.compile(optimizer=optimizer,
loss=loss)
print(aug_data[0])
print(aug_data[1])
categorical_model.fit(aug_data, steps_per_epoch = 1070, epochs=2)
在上面,'aug_data[0]'是训练样本,[1]是标签(将tf.data集提供给Keras需要样本和标签在元组中)。 运行 以上内容让我:
Model: "sequential_27"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten_27 (Flatten) (None, 49152) 0
_________________________________________________________________
dense_54 (Dense) (None, 128) 6291584
_________________________________________________________________
dense_55 (Dense) (None, 3) 387
=================================================================
Total params: 6,291,971
Trainable params: 6,291,971
Non-trainable params: 0
_________________________________________________________________
Tensor("IteratorGetNext_26:0", shape=(?, 192, 256, 1), dtype=float32)
Tensor("IteratorGetNext_26:1", shape=(?, 3), dtype=float32)
Train on 1070 samples
Epoch 1/2
---------------------------------------------------------------------------
InvalidArgumentError Traceback (most recent call last)
<ipython-input-77-12cc2cbea62b> in <module>()
18 print(aug_data[1])
19
---> 20 categorical_model.fit(aug_data, steps_per_epoch = 1070, epochs=2)
4 frames
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/client/session.py in __call__(self, *args, **kwargs)
1470 ret = tf_session.TF_SessionRunCallable(self._session._session,
1471 self._handle, args,
-> 1472 run_metadata_ptr)
1473 if run_metadata:
1474 proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)
InvalidArgumentError: 2 root error(s) found.
(0) Invalid argument: Expected begin[0] == 0 (got 1) and size[0] == 0 (got 1) when input.dim_size(0) == 0
[[{{node loss_27/dense_55_loss/softmax_cross_entropy_with_logits/Slice_1}}]]
(1) Invalid argument: Expected begin[0] == 0 (got 1) and size[0] == 0 (got 1) when input.dim_size(0) == 0
[[{{node loss_27/dense_55_loss/softmax_cross_entropy_with_logits/Slice_1}}]]
[[loss_27/mul/_1495]]
0 successful operations.
0 derived errors ignored.
我正在打印输入和标签张量的形状(在模型摘要的正下方)以确认形状符合预期。但是,我遇到了一个我一生都无法解决的奇怪错误。使用稀疏交叉熵,我又遇到了另一个错误,同样是批次变暗。
有趣的是,放置二元交叉熵允许模型运行(虽然没有学到太多...)。
我以前从未尝试过将 tf.datasets 和 Keras 组合在一起,这似乎是一个很大的挑战。对此的任何意见都会有所帮助,非常感谢!
干杯
尝试替换下面的代码行:
categorical_model.fit(aug_data, steps_per_epoch = 1070, epochs=2)
这一行:
categorical_model.fit(aug_data[0], aug_data[1], steps_per_epoch = 1070, epochs=2)
因为 categorical_model.fit()
函数的输入必须是 (aug_data[0], aug_data[1])
的元组,而不是包含沿第 0 维堆叠的输入和标签的输入。
我正在开发一个非常复杂的管道,我在其中从 TFRecords 文件构建 tf.Datasets 并将这些文件与数据扩充和许多健全性检查和验证一起提供给 Keras 模型。所以,请允许我为无法提供完全可重现的示例而道歉。
无论如何,我正在尝试训练图像分类模型,我的图像数据为 192*256 灰度张量,标签为单热编码三维向量。
当我尝试拟合模型时出现问题,它似乎来自 softmax 激活 and/or 分类交叉熵损失函数。
output_len = 3
activation = 'softmax'
loss = 'categorical_crossentropy'
optimizer = keras.optimizers.Adam()
categorical_model = keras.Sequential([
keras.layers.Flatten(input_shape=(192, 256, 1)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(output_len, activation='softmax')
])
categorical_model.summary()
categorical_model.compile(optimizer=optimizer,
loss=loss)
print(aug_data[0])
print(aug_data[1])
categorical_model.fit(aug_data, steps_per_epoch = 1070, epochs=2)
在上面,'aug_data[0]'是训练样本,[1]是标签(将tf.data集提供给Keras需要样本和标签在元组中)。 运行 以上内容让我:
Model: "sequential_27"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten_27 (Flatten) (None, 49152) 0
_________________________________________________________________
dense_54 (Dense) (None, 128) 6291584
_________________________________________________________________
dense_55 (Dense) (None, 3) 387
=================================================================
Total params: 6,291,971
Trainable params: 6,291,971
Non-trainable params: 0
_________________________________________________________________
Tensor("IteratorGetNext_26:0", shape=(?, 192, 256, 1), dtype=float32)
Tensor("IteratorGetNext_26:1", shape=(?, 3), dtype=float32)
Train on 1070 samples
Epoch 1/2
---------------------------------------------------------------------------
InvalidArgumentError Traceback (most recent call last)
<ipython-input-77-12cc2cbea62b> in <module>()
18 print(aug_data[1])
19
---> 20 categorical_model.fit(aug_data, steps_per_epoch = 1070, epochs=2)
4 frames
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/client/session.py in __call__(self, *args, **kwargs)
1470 ret = tf_session.TF_SessionRunCallable(self._session._session,
1471 self._handle, args,
-> 1472 run_metadata_ptr)
1473 if run_metadata:
1474 proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)
InvalidArgumentError: 2 root error(s) found.
(0) Invalid argument: Expected begin[0] == 0 (got 1) and size[0] == 0 (got 1) when input.dim_size(0) == 0
[[{{node loss_27/dense_55_loss/softmax_cross_entropy_with_logits/Slice_1}}]]
(1) Invalid argument: Expected begin[0] == 0 (got 1) and size[0] == 0 (got 1) when input.dim_size(0) == 0
[[{{node loss_27/dense_55_loss/softmax_cross_entropy_with_logits/Slice_1}}]]
[[loss_27/mul/_1495]]
0 successful operations.
0 derived errors ignored.
我正在打印输入和标签张量的形状(在模型摘要的正下方)以确认形状符合预期。但是,我遇到了一个我一生都无法解决的奇怪错误。使用稀疏交叉熵,我又遇到了另一个错误,同样是批次变暗。
有趣的是,放置二元交叉熵允许模型运行(虽然没有学到太多...)。
我以前从未尝试过将 tf.datasets 和 Keras 组合在一起,这似乎是一个很大的挑战。对此的任何意见都会有所帮助,非常感谢!
干杯
尝试替换下面的代码行:
categorical_model.fit(aug_data, steps_per_epoch = 1070, epochs=2)
这一行:
categorical_model.fit(aug_data[0], aug_data[1], steps_per_epoch = 1070, epochs=2)
因为 categorical_model.fit()
函数的输入必须是 (aug_data[0], aug_data[1])
的元组,而不是包含沿第 0 维堆叠的输入和标签的输入。