【问题标题】:Keras model shape incompatible / ValueError: Shapes (None, 3) and (None, 3, 3) are incompatibleKeras 模型形状不兼容 / ValueError: Shapes (None, 3) 和 (None, 3, 3) 不兼容
【发布时间】:2021-07-07 04:58:22
【问题描述】:

我正在尝试训练我的 keras 模型,但形状不兼容。 错误说

ValueError: Shapes (None, 3) and (None, 3, 3) are incompatible

我的 train set 的形状是 (2000, 3, 768),lable 的形状是 (2000, 3)。

错在哪里?

模型定义和拟合代码

input_shape = x_train.shape[1:]
model = my_dnn(input_shape, 3)
model.fit(x_train, y_train, epochs=25, verbose=1)

型号代码

def my_dnn(input, num_classes):

    model = Sequential()
    model.add(tf.keras.Input(input))
    model.add(Dense(1024))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(512))
    model.add(Activation('relu'))
    model.add(Dense(225))
    model.add(Activation('relu'))
    model.add(Dense(100))
    model.add(Activation('relu'))
    model.add(Dense(num_classes))
    model.add(Activation('sigmoid'))


    model.compile( loss='categorical_crossentropy', 
                   optimizer='adam', 
                   metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])

    return model

【问题讨论】:

  • 不应该是softmax而不是sigmoid吗?
  • 您的问题是多标签还是多类问题?你的 y one-hot 编码了吗?
  • 如果您有 OneHot 编码标签(形状 (batch,3)),则不能使用 SparseCategoricalAccuracy(),但需要 CategoricalAccuracy()

标签: numpy tensorflow keras reshape tf.keras


【解决方案1】:

有两个可能的原因:

  1. 您的问题是多类分类,因此您需要softmax 而不是sigmoid + accuracyCategoricalAccuracy() 作为指标。
  2. 您的问题是多标签分类,因此您需要binary_crossentropytf.keras.metrics.BinaryAccuracy()

根据您的数据集的构建方式/您要解决的任务,您需要选择其中之一。

对于案例 1,确保您的数据是 OHE(one-hot 编码)。

此外,Marco Cerliani 和 Amir(在下面的评论中)指出,数据输出需要采用 2D 格式而不是 3D 格式:您应该在将数据输入网络之前对数据进行相应的预处理,或者按照建议使用在下面的评论中,一个Flatten() (可能在最后一个Dense() 之前)

【讨论】:

  • 这是正确的......网络也是错误的......输出是 2D 而网络正在生成 3D
【解决方案2】:

除了所说的之外,您似乎正在携带输入数据的第二维直到模型结束。所以你的模型总结是这样的:

Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 3, 1024)           787456    
_________________________________________________________________
activation_1 (Activation)    (None, 3, 1024)           0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 3, 1024)           0         
_________________________________________________________________
dense_2 (Dense)              (None, 3, 512)            524800    
_________________________________________________________________
activation_2 (Activation)    (None, 3, 512)            0         
_________________________________________________________________
dense_3 (Dense)              (None, 3, 225)            115425    
_________________________________________________________________
activation_3 (Activation)    (None, 3, 225)            0         
_________________________________________________________________
dense_4 (Dense)              (None, 3, 100)            22600     
_________________________________________________________________
activation_4 (Activation)    (None, 3, 100)            0         
_________________________________________________________________
dense_5 (Dense)              (None, 3, 3)              303       
_________________________________________________________________
activation_5 (Activation)    (None, 3, 3)              0         
=================================================================
Total params: 1,450,584
Trainable params: 1,450,584
Non-trainable params: 0

如您所见,模型(None, 3, 3) 的输出形状与标签形状(None, 3) 不兼容,在某些时候,您需要使用Flatten 层。

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2020-08-27
    • 2021-09-24
    相关资源
    最近更新 更多