fer2013数据集_Tensorflow2.0CNN实战(4)-Fer2013数据集

fer2013数据集_Tensorflow2.0CNN实战(4)-Fer2013数据集上篇讲到了,如何在kaggle上进⾏GPU加速,这边就使⽤免费的GPU,尝试⼀波。所⽤数据集是fer2013,本篇作为⼀个引⼦来讲,下⼀篇会对FER2013 PLUS数据集进⾏训练,准确度⽐fer2013增加了很多。
1、数据集介绍
fer2013数据集由35886张⼈脸不同表情图⽚组成,其中训练集28708张,验证集和测试集各3589张。每张图⽚的⼤⼩是48*48像素⼤⼩,表情分为7种:0 anger ⽣⽓; 1 disgust 厌恶; 2 fear 恐惧; 3 happy 开⼼;4normal; 5 sad 伤⼼;6 surprised 惊讶。⽹上下载的数据集是⼀个csv⽂件,需要对其进⾏处理,这⾥将每⼀种表情按照不⽤⽂件存储。
2、分⽂件保存数据集
打⼊库函数
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import pandas as pd
import os
import sys
import time
import tensorflow as tf
from tensorflow import keras
import scipy.misc as sm
import scipy
from PIL import Image
按照训练集、验证集、测试集分成不同的csv⽂件
import csv
database_path = 'D:/pythonstudy/jupyter-notebook/face/fer2013_new/'
datasets_path = './fer2013_new/'
csv_file = database_path+'fer2013_newnew.csv'
train_csv = datasets_path+'train.csv'
val_csv = datasets_path+'val.csv'
test_csv = datasets_path+ 'test.csv'
with open(csv_file) as f:
csvr = ader(f)
header = next(csvr)
汽车喷水电机print(header)
rows = [row for row in csvr]
trn = [row[:-1] for row in rows if row[-1] == 'Training']
csv.writer(open(train_csv, 'w+'), lineterminator='n').writerows([header[:-1]] + trn)
print(len(trn))
val = [row[:-1] for row in rows if row[-1] == 'PublicTest']
csv.writer(open(val_csv, 'w+'), lineterminator='n').writerows([header[:-1]] + val)
print(len(val))
tst = [row[:-1] for row in rows if row[-1] == 'PrivateTest']
csv.writer(open(test_csv, 'w+'), lineterminator='n').writerows([header[:-1]] + tst)
print(len(tst))
对不同的csv⽂件进⾏不⽤表情⽂件保存
datasets_path = r'.fer2013_new'
train_csv = os.path.join(datasets_path, 'train.csv')
val_csv = os.path.join(datasets_path, 'val.csv')
test_csv = os.path.join(datasets_path, 'test.csv')
train_set = os.path.join(datasets_path, 'train')
val_set = os.path.join(datasets_path, 'val')
test_set = os.path.join(datasets_path, 'test')
for save_path, csv_file in [(train_set, train_csv), (val_set, val_csv), (test_set, test_csv)]:    if not ists(save_path):
os.makedirs(save_path)
num = 1
with open(csv_file) as f:
csvr = ader(f)
header = next(csvr)
for i, (label, pixel) in enumerate(csvr):
pixel = np.asarray([float(p) for p in pixel.split()]).reshape(48, 48)
subfolder = os.path.join(save_path, label)
if not ists(subfolder):
os.makedirs(subfolder)
空气源热泵热水系统
im = Image.fromarray(pixel).convert('L')
image_name = os.path.join(subfolder, '{:05d}.jpg'.format(i))
#print(image_name)
im.save(image_name)
高压直流供电保存后的⽂件见下图
3、kaggle上传数据并训练
将训练集、验证集、测试集进⾏压缩并上传到kaggle上,具体如何上传可参考上篇‘kaggle免费GPU加速’,并⽤gpu加速进⾏训练。
3.1按照顺序定义class_names
class_names=['anger','disgust','fear','happy',
'normal','sad','surprised',]
train_folder='../input/fer2013/train'
val_folder='../input/fer2013/val'
test_folder='../input/fer2013/test'
3.2增强数据集
height=48
width=48
channels=1
batch_size=64
num_classes=7
train_datagen=keras.preprocessing.image.ImageDataGenerator(    rescale=1./255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
train_generator=train_datagen.flow_from_directory(
train_folder,
target_size=(height,width),
batch_size=batch_size,
蜂窝纸芯
seed=7,
音调控制电路shuffle=True,
class_mode='categorical')
valid_datagen=keras.preprocessing.image.ImageDataGenerator(    rescale=1./255)
valid_generator=train_datagen.flow_from_directory(
val_folder,
target_size=(height,width),
batch_size=batch_size,
seed=7,
shuffle=False,
class_mode='categorical')
test_datagen=keras.preprocessing.image.ImageDataGenerator(    rescale=1./255)
相册加工设备
test_generator=test_datagen.flow_from_directory(
test_folder,
target_size=(height,width),
batch_size=batch_size,
seed=7,
shuffle=False,
class_mode='categorical')
train_num=train_generator.samples
valid_num=valid_generator.samples
print(train_num,valid_num)
3.3、建⽴模型结构
model = dels.Sequential()
model.add(keras.layers.Conv2D(filters=32,kernel_size=3,
padding='same',activation='relu',
input_shape=(width,height,3)))
# model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Conv2D(filters=32,kernel_size=3,
padding='same',activation='relu'))
# model.add(keras.layers.BatchNormalization())
model.add(keras.layers.MaxPool2D(pool_size=2))
model.add(keras.layers.Conv2D(filters=64,kernel_size=3,
padding='same',activation='relu'))
# model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Conv2D(filters=64,kernel_size=3,
padding='same',activation='relu'))
# model.add(keras.layers.BatchNormalization())
model.add(keras.layers.MaxPool2D(pool_size=2))
model.add(keras.layers.Conv2D(filters=128,kernel_size=3,
padding='same',activation='relu'))
# model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Conv2D(filters=128,kernel_size=3,
padding='same',activation='relu'))
# model.add(keras.layers.BatchNormalization())
model.add(keras.layers.MaxPool2D(pool_size=2))
model.add(keras.layers.Flatten())
# model.add(keras.layers.AlphaDropout(0.5))
model.add(keras.layers.Dense(128,activation='relu'))
model.add(keras.layers.Dropout(0.4))
model.add(keras.layers.Dense(num_classes,activation='softmax'))
# adam=tf.optimizers.Adam(lr=0.01)
# callbacks=[keras.callbacks.EarlyStopping(patience=5,min_delta=1e-3)]
loss='categorical_crossentropy',
metrics=['accuracy'],
)
model.summary()
3.4进⾏训练
可以发现⼀次迭代49秒,⽽在本⼈计算机cpu计算有100秒,最终训练下来的数据集准确度⽐较低,只
有54%,也尝试调参,但准确度依然没怎么增加。后来百度了⼀波,发现这是因为数据集误差导致。在数据集中有些不是⼈物,甚⾄不是表情图;有的表情类别标错。这样就导致了数据集⽐较杂乱。但百度的过程中,发现⼀个惊喜,有FER2013 PLUS这个数据集存在,这个数据集就是把不是表情标识出来,对表情的识别也做了进⼀步的分类。
epochs=50
# batch_size=256
history=model.fit_generator(
train_generator,
steps_per_epoch=train_num//batch_size,
epochs=epochs,
validation_data=valid_generator,
validation_steps=valid_num//batch_size
)

本文发布于:2024-09-22 13:42:22,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/116181.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   表情   训练   测试   导致   集进   验证
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议