我已经使用卷积神经网络开发了图像分类器。整个代码是使用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左右,并且在测试数据集上计算混淆矩阵时,我意识到它正在预测一切都属于同一类。可能会发生什么?
我尝试了许多不同的实验来确定问题的根源:
这些都没有解决问题,网络仍然预测一切都来自同一类。
当前状态
结果:模型输出的几张图像是有意义的(不是[1,0]),准确度沿着历元上升(至少在训练数据集中,这意味着网络正在学习)。
接下来的步骤将是优化模型,并可能返回到初始标签分类,因为这是项目的初衷。