如何在Keras中正确应用单热编码进行2D像素图像分类CNN?

时间:2018-01-25 01:54:58

标签: python deep-learning keras conv-neural-network one-hot-encoding

我正在通过卷积神经网络(CNN)研究基于2D RGB像素的图像分类问题。我将充分描述我的问题,并提供尽可能多的细节。

我将培训和验证分成如下:

x_trn, x_val, y_trn, y_val = train_test_split(img, msk,test_size=0.2, random_state=42)

其中img(number_of_image_patches x image_rows x image_columns x number_of_image_channels的数组。所以我每个128x128有200个RGB(即3个通道)图像补丁。因此,img数组是(200 x 128 x 128 x 3)

此外,msk是一个数组,其中包含将用于训练CNN的每个图像补丁的类标签,其大小为(200 x 128 x 128)。每个msk补丁都是带有类标签的128x128数组。在我的问题中,我有7 classes

由于我的问题是多类分类,我使用categorical_crossentropy作为我的损失函数。并softmax作为输出结果的激活函数。我的完整CNN模型可以找到here

y_trn的形状为(160 x 128 x 128)y_val的形状为(40 x 128 x 128)

现在,categorical_crossentropy要求y_trny_val变量进行单热编码。我这样做如下:

from keras.utils import to_categorical

y_trn= to_categorical(y_trn, num_classes=len(np.unique(y_trn)))
y_val= to_categorical(y_val, num_classes=len(np.unique(y_val)))

应用单热编码后y_trn的新形状为(2621440 x 7),因为我有7 classes2621440来自160x128x128

的乘法

之后,我执行以下操作来训练/适应CNN模型:

model =  my_CNN_unet()

model_checkpoint = ModelCheckpoint('unet6_test_{epoch:02d}.hdf5')
model.fit(x_trn, y_trn, batch_size=50, epochs=3, verbose=1, shuffle=True,
          callbacks=[model_checkpoint], validation_data=(x_val, y_val))

但是我收到以下错误:

ValueError: Error when checking target: expected conv2d_138 to have 4 dimensions, but got array with shape (2621440 , 7)

这意味着我的单热编码显然没有正确应用,因为它期望单热阵列为4D。我假设y_trn的正确大小应为:(160 x 128 x 128 x 7)

我是Python和Keras的新手,不知道如何克服这个错误。任何见解都是受欢迎的。

0 个答案:

没有答案