小编Con*_*son的帖子

Tensorflow/keras:“logits 和标签必须具有相同的第一维”如何​​压缩 logits 或扩展标签?

我正在尝试制作一个简单的 CNN 分类器模型。对于我的训练图像 (BATCH_SIZEx227x227x1) 和标签 (BATCH_SIZEx7) 数据集,我使用的是通过ImageDataGenerator. 我使用的损失函数是 tf.nn.sparse_categorical_crossentropy。当模型试图训练时,问题就出现了;模型(这里的批量大小为 1,用于我的简化实验)输出形状为 [1, 7],标签为形状 [7]。

我几乎可以肯定我知道原因,但我不确定如何解决它。我的假设是 sparse_categorical_crossentropy 正在压缩我的标签的维度(例如,当 BATCH_SIZE 为 2 时,输入的真实标签形状从 [2, 7] 压缩到 [14]),使我无法修复标签形状,而我所有修复 logits 形状的尝试都没有结果。

我最初尝试使用np.expand_dims. 但是无论我如何扩展维度,损失函数总是会使标签变平。

之后,我尝试tf.keras.layers.Flatten()在模型末尾添加 a以摆脱无关的第一维,但没有效果;我仍然遇到相同的确切错误。之后,尝试使用tf.keras.layers.Reshape((-1,))挤压所有尺寸。但是,这导致了不同的错误:

在 sparse_categorical_crossentropy logits = array_ops.reshape(output, [-1, int(output_shape[-1])]) TypeError: int返回非 int (type NoneType)

问题:如何将 logits 的形状压缩为与 sparse_categorical_crossentropy 返回的标签形状相同?

 ### BUILD SHAPE OF THE MODEL ###

 model = tf.keras.Sequential([
   tf.keras.layers.Conv2D(32, (3,3), padding='same', activation=tf.nn.relu, 
                          input_shape=(227,227,1)),
   tf.keras.layers.MaxPooling2D((2,2), strides=2),
   tf.keras.layers.Conv2D(64, (3,3), padding='same', activation=tf.nn.relu),
   tf.keras.layers.MaxPooling2D((2,2), strides=2), …
Run Code Online (Sandbox Code Playgroud)

python machine-learning keras tensorflow

7
推荐指数
1
解决办法
7565
查看次数

标签 统计

keras ×1

machine-learning ×1

python ×1

tensorflow ×1