检查目标时出错:预期的 dense_1 有 4 个维度,但得到了形状为 (3456, 1) 的数组

数据挖掘 喀拉斯
2022-02-20 10:19:14

我已经为 CNN 训练了一个模型,并且在密集层上出现了错误。

型号代码:

def model(input_img):
conv1 = Conv2D(5, (3, 3), padding='same')(input_img) #28 x 28 x 32
conv1 = BatchNormalization()(conv1)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1) #14 x 14 x 32
relu1 = Activation('relu')(pool1)
drop1 = Dropout(rate = 0.5)(relu1)
conv2 = Conv2D(5, (3, 3), padding='same')(pool1) #14 x 14 x 64
conv2 = BatchNormalization()(conv2)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2) #7 x 7 x 64
relu2 = Activation('relu')(pool2)
drop2 = Dropout(rate=0.5)(relu2)
dense = Dense(2, activation='softmax')(drop2) # 28 x 28 x 1
return dense

型号总结:

Layer (type)                 Output Shape              Param #   
=================================================================
input_2 (InputLayer)         (None, 242, 242, 1)       0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 242, 242, 5)       50        
_________________________________________________________________
batch_normalization_4 (Batch (None, 242, 242, 5)       20        
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 121, 121, 5)       0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 121, 121, 5)       230       
_________________________________________________________________
batch_normalization_5 (Batch (None, 121, 121, 5)       20        
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 60, 60, 5)         0         
_________________________________________________________________
activation_4 (Activation)    (None, 60, 60, 5)         0         
_________________________________________________________________
dropout_4 (Dropout)          (None, 60, 60, 5)         0         
_________________________________________________________________
dense_1 (Dense)              (None, 60, 60, 2)         12        
=================================================================
Total params: 332
Trainable params: 312
Non-trainable params: 20

但是当我试图训练模型时

model_train = model.fit(train_X, train_ground, batch_size=batch_size,epochs=epochs,verbose=1,validation_data=(valid_X, valid_ground))

我收到以下错误

ValueError                                Traceback (most recent call last)
<ipython-input-51-0fec3a3d04b9> in <module>()
----> 1 model_train = model.fit(train_X, train_ground, 
batch_size=batch_size,epochs=epochs,verbose=1,validation_data=(valid_X, 
valid_ground))

2 frames
/usr/local/lib/python3.6/dist-packages/keras/engine/training.py in fit(self, 
x, y, batch_size, epochs, verbose, callbacks, validation_split, 
validation_data, shuffle, class_weight, sample_weight, initial_epoch, 
steps_per_epoch, validation_steps, **kwargs)
950             sample_weight=sample_weight,
951             class_weight=class_weight,
--> 952             batch_size=batch_size)
953         # Prepare validation data.
954         do_validation = False

/ usr/local/lib/python3.6/dist-packages/keras/engine/training.py in 
_standardize_user_data(self, x, y, sample_weight, class_weight, 
check_array_lengths, batch_size)
787                 feed_output_shapes,
788                 check_batch_axis=False,  # Don't enforce the batch size.
--> 789                 exception_prefix='target')
790 
791             # Generate sample-wise weight values given the 
`sample_weight` and

/usr/local/lib/python3.6/dist-packages/keras/engine/training_utils.py in 
standardize_input_data(data, names, shapes, check_batch_axis, 
exception_prefix)
126                         ': expected ' + names[i] + ' to have ' +
127                         str(len(shape)) + ' dimensions, but got array '
--> 128                         'with shape ' + str(data_shape))
129                 if not check_batch_axis:
130                     data_shape = data_shape[1:]

ValueError: Error when checking target: expected dense_1 to have 4 
dimensions, but got array with shape (3456, 1)

任何帮助将不胜感激。

谢谢

2个回答

在将张量馈送到图层之前,您需要将其展平。Dense

from keras.layers import Flatten

def model(input_img):
    conv1 = Conv2D(5, (3, 3), padding='same')(input_img) #28 x 28 x 32
    conv1 = BatchNormalization()(conv1)
    pool1 = MaxPooling2D(pool_size=(2, 2))(conv1) #14 x 14 x 32
    relu1 = Activation('relu')(pool1)
    drop1 = Dropout(rate = 0.5)(relu1)
    conv2 = Conv2D(5, (3, 3), padding='same')(pool1) #14 x 14 x 64
    conv2 = BatchNormalization()(conv2)
    pool2 = MaxPooling2D(pool_size=(2, 2))(conv2) #7 x 7 x 64

    # Added this layer to flatten the input to Dense layer
    flattened = Flatten()(pool2)

    relu2 = Activation('relu')(flattened)
    drop2 = Dropout(rate=0.5)(relu2)
    dense = Dense(2, activation='softmax')(drop2) # 28 x 28 x 1
    return dense

另外,我想您的目标数据是分类的 ( ) ndim=2,因此? 我只是注意到,因为如果您的目标数据有但您当前的模型期望目标数据为.Denseouput=2ndim=1ndim=2

当我尝试展平新摘要时

Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 242, 242, 1)       0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 242, 242, 5)       50        
_________________________________________________________________
batch_normalization_3 (Batch (None, 242, 242, 5)       20        
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 121, 121, 5)       0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 121, 121, 5)       230       
_________________________________________________________________
batch_normalization_4 (Batch (None, 121, 121, 5)       20        
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 60, 60, 5)         0         
_________________________________________________________________
flatten_2 (Flatten)          (None, 18000)             0         
_________________________________________________________________
activation_4 (Activation)    (None, 18000)             0         
_________________________________________________________________
dropout_4 (Dropout)          (None, 18000)             0         
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 36002     
=================================================================
Total params: 36,322
Trainable params: 36,302
Non-trainable params: 20

但是得到了错误

ValueError                                Traceback (most recent call last)
<ipython-input-29-0fec3a3d04b9> in <module>()
----> 1 model_train = model.fit(train_X, train_ground, 
batch_size=batch_size,epochs=epochs,verbose=1,validation_data=(valid_X, 
valid_ground))

2 frames
/usr/local/lib/python3.6/dist-packages/keras/engine/training.py in fit(self, x, y, 
batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, 
class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, 
**kwargs)
950             sample_weight=sample_weight,
951             class_weight=class_weight,
--> 952             batch_size=batch_size)
953         # Prepare validation data.
954         do_validation = False

/usr/local/lib/python3.6/dist-packages/keras/engine/training.py in 
_standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, 
batch_size)
787                 feed_output_shapes,
788                 check_batch_axis=False,  # Don't enforce the batch size.
--> 789                 exception_prefix='target')
790 
791             # Generate sample-wise weight values given the `sample_weight` and

/usr/local/lib/python3.6/dist-packages/keras/engine/training_utils.py in 
standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
136                             ': expected ' + names[i] + ' to have shape ' +
137                             str(shape) + ' but got array with shape ' +
--> 138                             str(data_shape))
139     return data
140 

ValueError: Error when checking target: expected dense_2 to have shape (2,) but got 
array with shape (1,)