【问题标题】:Fine tuning Resnet 50 Cant good accuracy and validation is small how i can improve?微调 Resnet 50 不能很好的准确性和验证是小我如何改进?
【发布时间】:2021-08-12 16:17:29
【问题描述】:

我是深度学习的新手,使用 FER 2013 数据集和 resnet 50 模型 我尝试了各种范围的各种学习率,例如我使用 LR= 0.0008 的 ADAM 优化器,但准确性和验证模型都不好过拟合或欠拟合如何使用 Resnet 50 改进我的模型?

我希望模型目标达到 50% 以上的最优,而不会过拟合或欠拟合。

这是我所做的更多: https://github.com/senapahlevi/FER2013-CNN-Resnet-/commits/master/vanilla 这些是我的 LR= 0.0008 的代码

from keras.preprocessing.image import ImageDataGenerator
import keras
from keras.models import Sequential
from keras.layers import Input,Dense
from keras.applications import ResNet50
from keras.applications.resnet50 import preprocess_input
from livelossplot import PlotLossesKeras
from keras.optimizers import Adam
from keras import optimizers
from keras.layers.convolutional import Conv2D,MaxPooling2D,SeparableConv2D
from keras.layers.core import Dropout,Flatten,Dense
from keras.layers.normalization import BatchNormalization
from sklearn import metrics 
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt 
#from keras_hist_graph import plot_history


num_classesft =7
image_resizeft = 48
batch_size_trainingft = 64
batch_size_validationft = 64

path_trainingft = '/content/drive/MyDrive/UjicobaFER/FER2013/train'
path_validationft = '/content/drive/MyDrive/UjicobaFER/FER2013/validation'

data_generator =ImageDataGenerator(
    preprocessing_function = preprocess_input
)

training_generator = data_generator.flow_from_directory(
    path_trainingft,
    target_size = (image_resizeft,image_resizeft),
    batch_size = batch_size_trainingft,
    class_mode='categorical')

validation_generator = test_datagen.flow_from_directory(
    path_validationft,
    target_size = (image_resizeft,image_resizeft),
    batch_size = batch_size_validationft,
    class_mode='categorical',
)

model = Sequential()

model.add(ResNet50(
    include_top = False,
    pooling='avg',
    weights='imagenet',
))

model.add(Dense(num_classesft,activation='softmax'))
model.layers
model.layers[0].layers
model.layers[0].trainable = False
model.summary()
model.compile(optimizer=optimizers.Adam(lr = 0.0008),loss='categorical_crossentropy',metrics=['accuracy'])
steps_per_epoch_training = len(training_generator)/batch_size_trainingft
steps_per_epoch_validation = len(validation_generator)/batch_size_validationft
num_epochs = 45

fit_history = model.fit(
    training_generator,
    steps_per_epoch = steps_per_epoch_training,
    epochs = num_epochs,
    validation_data=validation_generator,
    validation_steps = steps_per_epoch_validation,
    verbose=1)

RESULT MY MODEL

【问题讨论】:

    标签: machine-learning deep-learning conv-neural-network artificial-intelligence


    【解决方案1】:

    首先,您的可训练参数太少。发生这种情况是因为您使用了“imagenet”权重并且您没有从头开始训练 ResNet。我建议如下:

    1.您可以在 Dense 层之前添加另一个密集层:

    model.add(Dense(num_classesft,activation='softmax'))
    

    例如:

    model.add(Dense(250,activation='relu'))
    model.add(Dropout(0.5))
    

    这将在 ResNet 的特征提取层之后添加一个全连接层。

    2。你可以从头开始训练 ResNet

    为此,只需修改代码:

    model.add(ResNet50(
    include_top = False,
    pooling='avg',
    weights='imagenet'))
    

    到这里:

    model.add(ResNet50(
    include_top = False,
    pooling='avg',
    weights=None))
    

    3.使用更重的数据增强

    4.尝试不同的学习率

    【讨论】:

    • 嗨,当我在第 2 点上按照您的步骤操作时,运行 model.layers[0].layers 输出“ModuleWrapper”对象没有属性“层”时出现错误,并且在运行模型后也出现错误.summary() 输出:此模型尚未构建。首先通过调用build() 或使用一些数据调用fit() 来构建模型,或者在第一层中指定input_shape 参数以进行自动构建。
    • 在这种情况下,您可以保持代码原样:“model.add(ResNet50(include_top = False, pooling='avg', weights='imagenet'))”。然后做“model.layers[0].trainable = True”
    • 嗨,Giannis 关于第 1 点你想给我建议为我的模型构建另一个密集层,因为我非常初学者并且不知道确切构建密集层的参数,以避免在 FER 2013 数据集上过度拟合和欠拟合,因为我有很多试验和错误然后结果不令人满意
    • 我建议阅读教程伙伴。那里有很多。第 1 点的主要思想是 Resnet 正在处理图像并从中提取特征。之后,这些特征应该由密集层(或例如 SVM、LSTM)进一步处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 2021-08-12
    • 2017-12-26
    • 2020-10-16
    • 2021-09-07
    • 2019-07-09
    • 2021-11-12
    相关资源
    最近更新 更多