Numpy Keras模型形状不兼容/值错误:形状(无,3)和(无,3,3)不兼容

Numpy Keras模型形状不兼容/值错误:形状(无,3)和(无,3,3)不兼容,numpy,tensorflow,keras,reshape,tf.keras,Numpy,Tensorflow,Keras,Reshape,Tf.keras,我试图训练我的keras模型,但形状不兼容。 错误是 ValueError: Shapes (None, 3) and (None, 3, 3) are incompatible 我的火车组的形状是(2000,3768),标签的形状是(2000,3) 问题出在哪里 模型定义与拟合代码 input_shape = x_train.shape[1:] model = my_dnn(input_shape, 3) model.fit(x_train, y_train, epochs=25, verb

我试图训练我的keras模型,但形状不兼容。 错误是

ValueError: Shapes (None, 3) and (None, 3, 3) are incompatible
我的火车组的形状是(2000,3768),标签的形状是(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
    +
    准确度
    分类准确度()
  • 您的问题是多标签分类,因此需要
    binary\u crossentropy
    tf.keras.metrics.binaryAccurance()
  • 根据数据集的构建方式/您试图解决的任务,您需要选择其中之一

    对于案例1,确保您的数据是OHE(一个热编码)


    此外,Marco Cerliani和Amir(在下面的评论中)指出,数据输出需要采用2D格式,而不是3D格式:您应该在将数据传送到网络之前对其进行相应的预处理,或者按照下面的评论中的建议,在某个点(可能在最终的
    密集()
    之前)使用
    展平()

    除了上面所说的,您似乎一直在携带输入数据的第二维度,直到模型结束。因此,您的模型摘要如下所示:

    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
    

    如您所见,模型的输出形状
    (无,3,3)
    与标签的形状
    (无,3)
    不兼容,在某些情况下,您需要使用
    展平
    层。

    它不应该是
    softmax
    而不是
    sigmoid
    ?您的问题是多标签还是多类问题?您的y是热编码的吗?您不能使用
    SPARSECATEGORICALCACURACY()
    ,但需要
    CategoricalAccuracy()
    如果您有一个热编码标签(形状(批次,3)),这是正确的。。。网络也是错误的。。。当网络生成3D时,输出为2D