检查目标时出错:预期稠密_3有2维,但得到了形状为(5,200,200,1)的数组

2024-04-19 07:51:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚开始用Python 3.7.7学习Tensorflow(2.1.0)和Keras(2.3.7)

我有这个网络:

def vgg16(input_size = (224,224,3)):
    inputs = Input(input_size, name='input')

    conv1 = Conv2D(64, (3, 3), activation = 'relu', padding = 'same', name ='conv1_1')(inputs)
    conv1 = Conv2D(64, (3, 3), activation = 'relu', padding = 'same', name ='conv1_2')(conv1)
    pool1 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_1')(conv1)

    conv2 = Conv2D(128, (3, 3), activation = 'relu', padding = 'same', name ='conv2_1')(pool1)
    conv2 = Conv2D(128, (3, 3), activation = 'relu', padding = 'same', name ='conv2_2')(conv2)
    pool2 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_2')(conv2)

    conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_1')(pool2)
    conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_2')(conv3)
    conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_3')(conv3)
    pool3 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_3')(conv3)

    conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_1')(pool3)
    conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_2')(conv4)
    conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_3')(conv4)

    conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_1')(pool4)
    conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_2')(conv5)
    conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_3')(conv5)
    pool5 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_5')(conv5)    
    flatten = Flatten(name = 'flatten')(pool5)

    dense1 = Dense(units = 4096,activation = "relu", name = 'dense_1')(flatten)
    dense2 = Dense(units = 4096,activation = "relu", name = 'dense_2')(dense1)
    dense3 = Dense(units = 2, activation = "softmax", name = 'dense_3')(dense2)

    opt = Adam(lr=0.001)

    model = Model(inputs = inputs, outputs = dense3, name ='vgg-16')

    model.compile(optimizer=opt, loss=keras.losses.categorical_crossentropy, metrics=['accuracy'])

    return model

这是使用它的代码:

model = vgg16(input_size=(200, 200, 1))

for episode in range(num_episodes):
    selected = np.random.permutation(no_of_samples)[:num_shot + num_query]
    # Create our Support Set.
    support_set = np.array(D[selected[:num_shot]])
    # Create our Query Set.
    query_set = np.array(D[selected[num_query:]])

    X_train = support_set[:,0,:]
    y_train = support_set[:,1,:]

    X_valid = query_set[:,0,:]
    y_valid = query_set[:,1,:]

    results = model.fit(X_train, y_train, epochs=20, batch_size=5,
                        validation_data=(X_valid, y_valid))

X_trainy_trainX_validy_valid有一个这样的形状:(5, 200, 200, 1)

但我得到了这个错误:

Error when checking target: expected dense_3 to have 2 dimensions, but got array with shape (5, 200, 200, 1)

我不明白为什么。我已更改了fit调用以删除batch_size

results = model.fit(X_train, y_train, epochs=20, validation_data=(X_valid, y_valid))

但我得到了同样的错误:

如何修复此错误

也许,问题是我使用的是one频道图像

模型摘要:

Model: "vgg-16"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input (InputLayer)           (None, 200, 200, 1)       0
_________________________________________________________________
conv1_1 (Conv2D)             (None, 200, 200, 64)      640
_________________________________________________________________
conv1_2 (Conv2D)             (None, 200, 200, 64)      36928
_________________________________________________________________
pool_1 (MaxPooling2D)        (None, 100, 100, 64)      0
_________________________________________________________________
conv2_1 (Conv2D)             (None, 100, 100, 128)     73856
_________________________________________________________________
conv2_2 (Conv2D)             (None, 100, 100, 128)     147584
_________________________________________________________________
pool_2 (MaxPooling2D)        (None, 50, 50, 128)       0
_________________________________________________________________
conv3_1 (Conv2D)             (None, 50, 50, 256)       295168
_________________________________________________________________
conv3_2 (Conv2D)             (None, 50, 50, 256)       590080
_________________________________________________________________
conv3_3 (Conv2D)             (None, 50, 50, 256)       590080
_________________________________________________________________
pool_3 (MaxPooling2D)        (None, 25, 25, 256)       0
_________________________________________________________________
conv4_1 (Conv2D)             (None, 25, 25, 512)       1180160
_________________________________________________________________
conv4_2 (Conv2D)             (None, 25, 25, 512)       2359808
_________________________________________________________________
conv4_3 (Conv2D)             (None, 25, 25, 512)       2359808
_________________________________________________________________
pool_4 (MaxPooling2D)        (None, 12, 12, 512)       0
_________________________________________________________________
conv5_1 (Conv2D)             (None, 12, 12, 512)       2359808
_________________________________________________________________
conv5_2 (Conv2D)             (None, 12, 12, 512)       2359808
_________________________________________________________________
conv5_3 (Conv2D)             (None, 12, 12, 512)       2359808
_________________________________________________________________
pool_5 (MaxPooling2D)        (None, 6, 6, 512)         0
_________________________________________________________________
flatten (Flatten)            (None, 18432)             0
_________________________________________________________________
dense_1 (Dense)              (None, 4096)              75501568
_________________________________________________________________
dense_2 (Dense)              (None, 4096)              16781312
_________________________________________________________________
dense_3 (Dense)              (None, 2)                 8194
=================================================================
Total params: 107,004,610
Trainable params: 107,004,610
Non-trainable params: 0
_________________________________________________________________

Tags: namenonesizeactivationrelusamepoolpadding
2条回答

您的训练数据有5(200,200,1)个图像,这是正确的,但是目标数据(y)应该是5对应的标签,带有(2,)形状。所以y_train的形状应该是(5,2)。现在它们的形状不对

X_train, y_train, X_valid and y_valid have a this shape: (5, 200, 200,1).

根据您的网络摘要

>> vvg16().summary()

Model: "vgg-16"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input (InputLayer)           [(None, 224, 224, 3)]     0         
_________________________________________________________________
conv1_1 (Conv2D)             (None, 224, 224, 64)      1792      
_________________________________________________________________
conv1_2 (Conv2D)             (None, 224, 224, 64)      36928     
_________________________________________________________________
pool_1 (MaxPooling2D)        (None, 112, 112, 64)      0         
_________________________________________________________________
conv2_1 (Conv2D)             (None, 112, 112, 128)     73856     
_________________________________________________________________
conv2_2 (Conv2D)             (None, 112, 112, 128)     147584    
_________________________________________________________________
pool_2 (MaxPooling2D)        (None, 56, 56, 128)       0         
_________________________________________________________________
conv3_1 (Conv2D)             (None, 56, 56, 256)       295168    
_________________________________________________________________
conv3_2 (Conv2D)             (None, 56, 56, 256)       590080    
_________________________________________________________________
conv3_3 (Conv2D)             (None, 56, 56, 256)       590080    
_________________________________________________________________
pool_3 (MaxPooling2D)        (None, 28, 28, 256)       0         
_________________________________________________________________
conv4_1 (Conv2D)             (None, 28, 28, 512)       1180160   
_________________________________________________________________
conv4_2 (Conv2D)             (None, 28, 28, 512)       2359808   
_________________________________________________________________
conv4_3 (Conv2D)             (None, 28, 28, 512)       2359808   
_________________________________________________________________
pool_4 (MaxPooling2D)        (None, 14, 14, 512)       0         
_________________________________________________________________
conv5_1 (Conv2D)             (None, 14, 14, 512)       2359808   
_________________________________________________________________
conv5_2 (Conv2D)             (None, 14, 14, 512)       2359808   
_________________________________________________________________
conv5_3 (Conv2D)             (None, 14, 14, 512)       2359808   
_________________________________________________________________
pool_5 (MaxPooling2D)        (None, 7, 7, 512)         0         
_________________________________________________________________
flatten (Flatten)            (None, 25088)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 4096)              102764544 
_________________________________________________________________
dense_2 (Dense)              (None, 4096)              16781312  
_________________________________________________________________
dense_3 (Dense)              (None, 2)                 8194      
=================================================================
Total params: 134,268,738
Trainable params: 134,268,738
Non-trainable params: 0
_________________________________________________________________

您的X_trainX_valid需要具有(224,224,3)
的形状 您的y_trainy_valid需要有总计2 classes,并且由于keras.losses.categorical_crossentropy的原因,需要是一个热编码的


编辑:

当输出为N类的数组时:

  1. 最后一层应该是Dense(N,"softmax")
  2. 损失应该是keras.losses.sparse_categorical_crossentropy

当输出为一个热编码N类时:

  1. 如果尚未编码,请使用keras.utils.to_categorical(array, N)
  2. 最后一层应该是Dense(N,"softmax")
  3. 损失应该是keras.losses.categorical_crossentropy

当目的不是分类时:

  1. 最后一层应该产生相同的形状
  2. 您需要使用适当的激活
  3. 您不需要使用扁平化
  4. 检查autoencoder概念,查看如何生成与输入形状相同的输出

相关问题 更多 >