【问题标题】:ValueError: Error when checking target: expected dense_44 to have shape (1,) but got array with shape (3,)ValueError:检查目标时出错:预期dense_44的形状为(1,),但数组的形状为(3,)
【发布时间】:2019-01-10 08:41:47
【问题描述】:

我搜索了几个涵盖类似问题的类似主题。例如thisthisthis 等。尽管如此,我仍然没有设法解决它。

我最终要做的是使用 CNN 预测三个参数。输入是初始大小为 (3724, 4073, 3) 的矩阵(现在可以在预处理后绘制为 RGB 图像)。由于数据集的大小,我使用以下生成器分批输入 16 个 CNN:

class My_Generator(Sequence):
""" Generates batches of training data and ground truth. Inputs are the image paths and batch size. """

def __init__(self, image_paths, batch_size, normalise=True):
    self.image_paths, self.batch_size = image_paths, batch_size
    self.normalise = normalise

def __len__(self):
    return int(np.ceil(len(self.image_paths) / float(self.batch_size)))

def __getitem__(self, idx):
    batch = self.image_paths[idx * self.batch_size:(idx + 1) * self.batch_size]        
    matrices, parameters = [], []
    for file_path in batch:
        mat, param, name = get_Matrix_and_Parameters(file_path)
        
        #Transform the matrix from 2D to 3D as a (mat.shape[0], mat.shape[1]) RBG image. Rescale its values to [0,1]
        mat = skimage.transform.resize(mat, (mat.shape[0]//8, mat.shape[1]//8, 3), 
                                       mode='constant', preserve_range=self.normalise) 
        param = MMscale_param(param, name)                                              # Rescale the parameters
        matrices.append(mat)
        parameters.append(param)
        
    MAT, PAM = np.array(matrices), np.array(parameters)
    PAM = np.reshape(PAM, (PAM.shape[0], PAM.shape[1]))
    print("Shape Matrices: {0}, Shape Parameters: {1}".format(MAT.shape, PAM.shape))
    print("Individual PAM shape: {0}".format(PAM[0,:].shape))
    
    return MAT, PAM

生成器还将矩阵大小调整 8 倍以适应内存。 MMscale_param 函数只是将参数重新缩放为 [0, 1]。

生成的批次现在具有形状 (16, 465, 509, 3)。这些现在被输入到以下 CNN 架构中:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 463, 507, 16)      448       
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 231, 253, 16)      0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 229, 251, 32)      4640      
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 114, 125, 32)      0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 112, 123, 64)      18496     
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 56, 61, 64)        0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 54, 59, 128)       73856     
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 27, 29, 128)       0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 25, 27, 256)       295168    
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 12, 13, 256)       0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 39936)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 1000)              39937000  
_________________________________________________________________
dense_2 (Dense)              (None, 100)               100100    
_________________________________________________________________
dense_3 (Dense)              (None, 20)                2020      
_________________________________________________________________
dense_4 (Dense)              (None, 3)                 63        
=================================================================
Total params: 40,431,791
Trainable params: 40,431,791
Non-trainable params: 0
_________________________________________________________________

如上所示,模型中的最后一层期望输入为 (None, 3)。如果我理解正确,“任何”批量大小值可以在此处替换为“无”,因此我的输入 (16, 3) 或 (batch_size, number_of_parameters_to_predict) 应该是有效的。但是,我仍然收到以下错误消息:

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

我觉得很奇怪的是密集层 dense_4 具有形状 (1, ) 的说法。但在上面的架构中,它不是显示为 (3, ) 形状吗?这应该很适合输入数组的形状 (3, )。

我尝试以多种方式重塑和/或转置数组,但均未成功。我什至卸载并重新安装了 TensorFlow 和 Keras,认为那里有问题,但仍然没有。

然而,似乎可行的是仅预测三个参数之一,为我们提供 (1, 0) 的输入形状。 (虽然后来产生了其他与内存相关的错误。)这实际上独立于我如何塑造 dense_4 层,这意味着 (None, 1) 和 (None, 3) 都有效,根据我的知识有限,没有任何意义。

添加编译;

batch_size = 16
my_training_batch_generator_NIR = My_Generator(training_paths_NIR, batch_size)
my_validation_batch_generator_NIR = My_Generator(validation_paths_NIR, batch_size)

model.compile(loss='sparse_categorical_crossentropy', optimizer='adam')

还有训练代码:

model_path = "/Models/weights.best.hdf5"
num_epochs = 10
checkpointer = ModelCheckpoint(filepath=model_path, 
                           verbose=1, 
                           save_best_only=True)

model.fit_generator(generator=my_training_batch_generator_NIR,
                steps_per_epoch=(len(validation_paths_NIR) // batch_size),
                epochs=num_epochs,
                verbose=1,
                callbacks=[checkpointer],
                validation_data=my_validation_batch_generator_NIR, 
                validation_steps=(len(validation_paths_NIR) // batch_size), 
                use_multiprocessing=True, 
                max_queue_size=1,
                workers=1)

所以,总结一下:我在将 (3, ) 数组拟合到我认为是 (3, ) 层时遇到了问题。然而,后者声称是形状 (1, )。我一定错过了这里的一些东西。

任何帮助将不胜感激。

我在 Ubuntu 上使用带有 TensorFlow 1.9.0 后端的 Keras 版本 2.2.2。

【问题讨论】:

    标签: python tensorflow keras conv-neural-network linear-regression


    【解决方案1】:

    这是因为您使用的损失函数。将其替换为

        loss='categorical_crossentropy'
    

    那么代码应该可以工作了。

    【讨论】:

    • 非常感谢@Upasana Mittal!这似乎已经解决了。但是,我正要问你为什么,因为我不明白这是为什么。 categorical_crossentropy 在目标是单热编码时使用,而我没有这样做。阅读有关函数 to_categorical() 的信息,我现在明白它对您提供的数据进行一次性编码。如果我有声望,我会赞成你的回答=)。再次,非常感谢!
    • 不用担心。您使用了 sparse_categorical_crossentropy ,它依次需要一个整数,这不适用于您的情况。这就是 categorical_crossentropy 起作用的原因。
    猜你喜欢
    • 2019-03-05
    • 2019-05-10
    • 2020-02-21
    • 2018-12-29
    • 2020-08-23
    • 2020-08-09
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多