【问题标题】:Keras model accuracy is not improving - Image ClassificationKeras 模型精度没有提高 - 图像分类
【发布时间】:2021-04-07 15:00:16
【问题描述】:

我有 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)

我尝试调整图层和辍学,但没有运气。有什么想法吗?

【问题讨论】:

标签: python tensorflow keras keras-layer image-classification


【解决方案1】:

考虑

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

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

【讨论】:

  • 感谢您的宝贵时间,让我试试看。
【解决方案2】:

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

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

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

  3. 如果模型拟合不足(您的情况),

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

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

  4. 如果模型过拟合,

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

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

    4.c。数据增强

    4.d。寻找更好的超参数

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

【讨论】:

  • 我可能不得不尝试不同的算法,消除辍学没有帮助。我用于 sigmoid 的二元问题的相同模型并获得 90% 的准确度。我想知道为什么它不适用于多类问题。
  • 这就是我的二进制问题。 model = Sequential() model.add(Conv2D(32, kernel_size = (3, 3),input_shape=(64,64,3),activation = 'relu')) model.add(MaxPooling2D(pool_size = (2, 2) ))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation = 'relu')) model.add(Dropout(0.5)) model.add(Dense( 4、activation = 'sigmoid')) model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
  • 对两个图像组进行分类会容易得多。我期待这个结果。准确性低的原因之一可能是数据不平衡。或者你的两类或更多类数据具有很强的共性。所以你的模型会混淆。你检查结果的混淆矩阵了吗?有时问题不在于模型本身。
  • 不,我没有检查混淆矩阵,好建议让我检查一下。
  • 正如我所说的,原因也可能是数据不平衡
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    我能够使用预训练的 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')
    

    【讨论】:

      猜你喜欢
      • 2019-06-11
      • 2019-08-11
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 2021-02-07
      • 2019-06-22
      • 2018-10-05
      相关资源
      最近更新 更多