python - 模型精度停留在 0.2505。我的代码有什么问题?

标签 python keras deep-learning conv-neural-network

我正在尝试使用带有 FER2013 数据集的面部表情来制作情绪分类器。它包含 35887 个样本,每个样本具有 2304 个特征和一个 0-6 的整数标签用于情绪。当我使用形状为 (2304,1) 的 Conv1D 时,它达到了 ~86% 的训练精度,但在任何看不见的测试图像上都表现不佳。所以我想为每个样本将它 reshape 为 (48,48,1) 并在其上使用 Conv2D。但是现在它在第二个纪元之后的训练中停留在 0.2505 上并且永远不会增加。发生了什么事?

import pandas as pd
import numpy as np
from PIL import Image
import matplotlib.image as mpimg
from skimage import transform
import random
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense

emotion = {0 : 'Angry', 1 : 'Disgust',2 : 'Fear',3 : 'Happy',
           4 : 'Sad',5 : 'Surprise',6 : 'Neutral'}
df=pd.read_csv('fer.csv')
faces=df.values[:,1]
faces=faces.tolist()
emos=df.values[:,0]

for i in range(len(faces)):
    faces[i]=[int(x) for x in faces[i].split()]
    emos[i]=int(emos[i])

faces=np.array(faces)
faces=transform.resize(faces, (35887,48,48))

faces=np.expand_dims(faces, axis=3)

model = Sequential()

model.add(Conv2D(48, (3,3), padding='same', input_shape=(48,48,1), activation='relu'))
model.add(Conv2D(48, (3,3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(96, (3,3), padding='same', activation='relu'))
model.add(Conv2D(96, (3,3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(192, (3,3), padding='same', activation='relu'))
model.add(Conv2D(192, (3,3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(384, (3,3), padding='same', activation='relu'))
model.add(Conv2D(384, (3,3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())
model.add(Dense(384, activation='relu'))
model.add(Dropout(0.4))

model.add(Dense(192, activation='relu'))
model.add(Dropout(0.4))

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

model.add(Dense(7, activation='softmax'))
    
model.compile(loss='sparse_categorical_crossentropy',
            optimizer='adam',
            metrics=['accuracy'])


model.fit(faces,emos,epochs=100,batch_size=48)
model.save_weights('model.h5')

模型精度曲线

enter image description here

模型损失曲线

enter image description here

最佳答案

在每一层解决问题后归一化输出批处理。

只需添加

model.add(BatchNormalization())

在每一层之后。

编辑:

认为我应该在这里添加更多信息。 所以,这是我最终制作的最终模型。

model = Sequential()

model.add(Conv2D(32, (3, 3), input_shape=(200,200,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.25))

model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(256, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())

model.add(Dense(512, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.3))

model.add(Dense(256, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.4))

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

model.add(Dense(len(classes), activation='softmax'))
            
model.compile(loss='sparse_categorical_crossentropy',
                    optimizer='nadam',
                    metrics=['accuracy'])

这些是我得到的结果。

enter image description here

我增加了节点并更改了优化器,但批归一化显着提高了准确性。使用更多节点和 nadam 优化器进一步有所帮助。

关于python - 模型精度停留在 0.2505。我的代码有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57026595/

相关文章:

python 名称错误 : global name '__file__' is not defined

python - 如何将base64编码的字符串上传到s3并在python中访问html文件中的url

python - 将一张图复制到另一张图

python - 使用 Keras 2 保存的 CoreML 加载模型

python - Keras MSE 定义

python - 使用 PyTorch 的交叉熵损失函数是否需要 One-Hot 编码?

python - 对一组值进行排序

python - 获取 "ValueError: Output of generator should be a tuple `(x,y,sample_weight )` or `(x,y )` "而

machine-learning - 使用我自己的网络在caffe上训练mnist :Message type "caffe.LayerParameter" has no field named "lr_mult"

python - 在colab中找不到kaggle.json?