神经网络总是预测相同的类

时间:2019-10-09 14:04:49

标签: python keras deep-learning computer-vision conv-neural-network

我已经使用卷积神经网络开发了图像分类器。整个代码是使用Keras编写的。该数据集包含大小为360X480的.jpg图像,标签分别为0、1、2和3。数据已经过平衡,因此在训练和验证数据集中,每个标签的图片数量均相同。

我已经在目录中整理了数据,以使用数据生成器功能,该功能将在训练模型时加载图像。

数据的组织如下:

Data:
    Train: 0:  a1.jpg
               a2.jpg
               ...
           1:  b1.jpg
               b2.jpg
               ...
    ...

所有标签和测试数据相同。

用于定义和拟合神经网络的代码如下:

model = Sequential()
model.add(Conv2D(128, kernel_size=3, activation='relu', input_shape=input_shape, padding="valid"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64, kernel_size=3, activation='relu', padding="valid"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(32, kernel_size=3, activation='relu', padding="valid"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(512, activation="relu"))
model.add(Dense(4, activation="softmax"))


opt = SGD(lr=learning_rate)
model.compile(loss="categorical_crossentropy", optimizer=opt,
    metrics=["accuracy"])

train_datagen = ImageDataGenerator(
                width_shift_range=0.05,
                height_shift_range=0.05,
                rescale=1./255,
                horizontal_flip=True)

validate_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        path_data + '/train',
        shuffle = True,
        target_size=input_generator, 
        batch_size=batch_size)

validation_generator = train_datagen.flow_from_directory(
        path_data + '/validate',
        shuffle = True,
        target_size=input_generator,
        batch_size=batch_size)

steps_per_epoch = np.ceil(train_size/batch_size)
validation_steps = np.ceil(validation_size/batch_size)


H = model.fit_generator(
        train_generator,
        steps_per_epoch=steps_per_epoch,
        epochs=epochs,
        validation_data=validation_generator,
        validation_steps=validation_steps)

当我运行网络进行训练时,训练精度保持在0.25左右,并且在测试数据集上计算混淆矩阵时,我意识到它正在预测一切都属于同一类。可能会发生什么?

我尝试了许多不同的实验来确定问题的根源:

  • 我已将网络更改为VGG架构,对所有层进行了训练,并以不同的学习率(0.001、0.01、0.1)将图片的尺寸减小到150x150。
  • 我将数据集更改为仅16张用于训练的照片(每个标签4张)和5张用于验证的照片(三个标签各1张,第四个标签2张)。像上一个要点一样使用VGG,有100个时期(试图强制过度拟合),网络并没有学到任何东西。我什至试图将图片的尺寸减小到50x50,问题仍然存在。
  • 经过这种尝试,我创建了一个包含16张图片(150x150)进行训练的数据集,用于验证每张图片只是纯色(红色,蓝色,黄色,绿色,每个标签一个)的5个数据集,没有形状,没有图像,只有纯色。神经网络无法学习(与前两个要点相同的配置)。

这些都没有解决问题,网络仍然预测一切都来自同一类。

当前状态

  1. 我将数据转换为二进制(合并标签0、1、2、3)。第一步是有道理的,因为标签是管道中的污垢水平(0:0-25%,1:25-50%,...)。
  2. 使用没有初始重量的ResNet50架构。
  3. 将图片裁剪为224x224。

结果:模型输出的几张图像是有意义的(不是[1,0]),准确度沿着历元上升(至少在训练数据集中,这意味着网络正在学习)。

接下来的步骤将是优化模型,并可能返回到初始标签分类,因为这是项目的初衷。

0 个答案:

没有答案