Keras 模型精度没有提高 - 图像分类

Keras model accuracy is not improving - Image Classification

我有 4 个 类 并且正在为图像分类问题构建 Keras 模型。我尝试了几次调整,但准确度没有超过 75%,损失仍然是 64%。

我有 90,400 张图像作为训练集,20,000 张图像用于测试。

这是我的模型。

model = Sequential()
model.add(Conv2D(32, kernel_size = (3, 3),input_shape=(100,100,3),activation = 'relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(64, activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(4, activation = 'softmax'))
model.compile(loss = 'sparse_categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])

batch_size = 64

train_datagen = ImageDataGenerator (rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True)
test_datagen=ImageDataGenerator(rescale=1./255)

training_set = train_datagen.flow_from_directory('/dir/training_set', target_size=(100,100),batch_size=batch_size,class_mode='binary')

test_set = test_datagen.flow_from_directory('/dir/test_set',target_size=(100,100), batch_size=batch_size, class_mode='binary')

# 90,400 images I have under the training_set directory and 20,000 under the test directory.

model.fit(training_set, steps_per_epoch=90400//batch_size, epochs=1,validation_data=test_set, validation_steps= 20000//batch_size)

我尝试调整层和漏失但没有成功。有什么想法吗?

考虑

  • 添加多个卷积层(中间有最大池)使模型能够学习“低级”和“高级”特征
  • 添加更多时期以使模型能够从输入图片中学习。神经网络每次只能沿着梯度学习“一点点”,通常需要多个 epoch 才能得到充分训练的模型。

也许从较少的图片开始但增加纪元(并添加第二个 conv/max 池对)以控制计算时间!

如果我遇到这样的事情,我会做以下事情:

  1. 将我的数据拆分为训练验证和测试。通过验证改进模型并使用测试查看最终结果。

  2. 正在删除 Dropout 层,因为我没有模型过度拟合的证据。

  3. 如果模型欠拟合(你的情况),

    3.a。尝试不同/更大的架构并搜索更好的超参数

    3.b。训练更长时间并尝试不同的优化算法

  4. 如果模型过拟合,

    4.a。尝试获取更多数据

    4.b。正则化(L2、dropout 等)

    4.c。数据扩充

    4.d。搜索更好的超参数

注意:您始终可以考虑 transfer learning. 基本上,迁移学习是使用从成功模型中获得的信息来构建您的模型。

您可以尝试使用 Keras 中的现有模型之一并从头开始训练它。 我以前用过MobileNetV2,效果很好。

当您初始化模型时,您可以加载预训练的权重或 None,并使用您的图像从头开始训练。

我能够使用预训练的 MobileNet 模型通过迁移学习实现准确性。

在这里附上我的代码和混淆矩阵,这可能对某人有帮助。

import pandas as pd
import numpy as np
import os
import keras
import matplotlib.pyplot as plt
from keras.layers import Dense,GlobalAveragePooling2D
from keras.applications import MobileNet
from keras.preprocessing import image
from keras.applications.mobilenet import preprocess_input
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Model
from keras.optimizers import Adam

base_model=MobileNet(weights='imagenet',include_top=False) #imports the mobilenet model and discards the last 1000 neuron layer.

x=base_model.output
x=GlobalAveragePooling2D()(x)
x=Dense(1024,activation='relu')(x) #we add dense layers so that the model can learn more complex functions and classify for better results.
x=Dense(1024,activation='relu')(x) #dense layer 2
x=Dense(512,activation='relu')(x) #dense layer 3
preds=Dense(3,activation='softmax')(x) #final layer with softmax activation

model=Model(inputs=base_model.input,outputs=preds)

for layer in model.layers[:20]:
    layer.trainable=False
for layer in model.layers[20:]:
    layer.trainable=True

train_data_path = '../train_dataset_path'

train_datagen=ImageDataGenerator(preprocessing_function=preprocess_input, validation_split=0.2) #included in our dependencies

train_generator=train_datagen.flow_from_directory(train_data_path,
                                                 target_size=(224,224),
                                                 color_mode='rgb',
                                                 batch_size=32,
                                                 class_mode='categorical',
                                                 shuffle=True,
                                                 subset='training')

test_generator=train_datagen.flow_from_directory(train_data_path, 
                                                 target_size=(224,224),
                                                 color_mode='rgb',
                                                 batch_size=32,
                                                 class_mode='categorical',
                                                 shuffle=False,
                                                 subset='validation')

model.compile(optimizer='Adam',loss='categorical_crossentropy',metrics=['accuracy'])

step_size_train = train_generator.n//train_generator.batch_size
step_size_test  = test_generator.n//test_generator.batch_size


model_history = model.fit(train_generator,
                          steps_per_epoch=step_size_train,
                          epochs=5,
                          validation_data=test_generator,
                          validation_steps=step_size_test)


model.save('tl_interior_model_2')

#Load the model
model = keras.models.load_model('tl_interior_model_2')