目录
前言:
一、加载数据集
二、定义模型架构
三、数据预处理
四、预处理类标签
五、定义回调函数
六、编译模型
七、训练集拟合模型
八、加载保存好的模型
九、测试集评估模型
前面介绍了卷积神经网络cnn每类层的搭建方式,接下来将介绍如何完善整个训练模型,分为哪几步,让我们一起看看吧!
以现阶段学习手势识别模型框架搭建为例:
从网上下载数据集,数据格式为(12000,20,20,20,1),数据 样本个数为12000,形状为三维(20,20,20),通道数为1(比如RGB通道数为3)。接下来加载数据集:
file_name1=np.load('#数据集存放位置')
x,y=file_name1['data'],file_name1['label']
def model():
#cnn
input_shape=layers.Input(shape =(20,20,1))
con=keras.layers.Conv2D(filters=16,kernel_size=3,strides=(1,1),use_bias=True,name='con',padding='same',activation='relu')(input_shape)
pool=layers.MaxPooling2D(pool_size=2,strides=1,padding='same')(con)
fl1=layers.Flatten()(pool)
fc1=layers.Dense(units=64,activation = 'sigmoid')(fl1)
drop1=keras.layers.Dropout(rate=0.1)(fc1)
fc2=layers.Dense(units=64,activation= 'softmax')(drop1)
cnn_model=keras.Model(inputs=input_shape,outputs=drop1)
#rnn
#时序模型 完成一个数据的卷积和循环数据集
time_step=20
input_step=layers.Input(shape=(time_step,20,20,1))
hr=layers.TimeDistributed(cnn_model)(input_step)
gru=keras.layers.GRU(units=128)(hr)
#softmax概率输出
drop2=keras.layers.Dropout(0.1)(gru)
fc3=layers.Dense(units=5 ,activation='softmax')(drop2)
model=Model(inputs= input_step,outputs= fc3)
return model
cnn_rnn_model=model()
这里只做了解,实践中用到的是下面第四点使用 to_categorical函数转换数据形式为独热编码。
参考文献:
https://www.cnblogs.com/andrewwang/p/10700288.html
图像数据预处理参考:https://baijiahao.baidu.com/s?id=1629482916861132742&wfr=spider&for=pc
k折交叉验证:
参考文献:
K 折交叉验证:关于StratifiedKFold 与 KFold 的区别与联系 - JavaShuo
参考文献:
keras中to_categorical函数解析_文科升的博客-CSDN博客_to_categorical
采用StratifiedKFold
方法
kf=StratifiedKFold(n_splits=5,random_state=0,shuffle=True)
hc=1
for train_index,test_index in kf.split(x,y):
x_train=x[train_index]
x_test=x[test_index]
y_train=to_categorical(y[train_index]-2,5)
y_test=to_categorical(y[test_index]-2,5)
参考文献:
一、https://blog.csdn.net/qq_35054151/article/details/108364956
二、https://blog.csdn.net/weixin_35811044/article/details/104203535
#使用回调函数 调整学习率,保存最佳性能的模型的权重
#EarlyStopping 防止冗余运行
#采用列表形式
callbacks_list=[
keras.callbacks.EarlyStopping(
monitor='loss',
patience=2,#能够容忍多少个epoch内都没有下降
verbose=1,
mode='min',
restore_best_weights=True),
#ModelCheckpoint 保存最佳模型权重
keras.callbacks.ModelCheckpoint(
filepath='#权重保存为.h5文件的位置',
monitor='accuracy',
mode='max',
save_best_only=True)
]
参考文献:
https://blog.csdn.net/yunfeather/article/details/106461754
cnn_rnn_model.compile(
optimizer=tf.keras.optimizers.RMSprop(),
#分类交叉熵(False概率分布)
loss=tf.keras.losses.CategoricalCrossentropy(from_logits=False),
metrics=['accuracy']
)
1.如何选择优化器: https://cloud.tencent.com/developer/article/1083486
RMSProp:https://blog.csdn.net/weixin_39228381/article/details/108511882
2.使用交叉熵损失函数,Keras区分binary_crossentropy(2个类)和categorical_crossentropy(> 2个类)
cnn_rnn_model.fit(
x_train,y_train,
epochs=50,
batch_size=25,
callbacks=callbacks_list)
model1=load_model('#上面训练得到的最佳模型的文件位置')
score函数评估模型参看:https://zhuanlan.zhihu.com/p/67706712
score=model1.evaluate(x_test,y_test,batch_size=25)
评估得到的分数R^2越接近1越好,接近于0说明模型很差、严重过拟合。
整体完整代码如下:
#头文件
import tensorflow as tf
import numpy as np
from tensorflow import keras
from tensorflow.keras import Model
from tensorflow.keras import layers
from tensorflow.keras.utils import to_categorical
from sklearn.model_selection import StratifiedKFold
from tensorflow.compat.v1 import ConfigProto
from tensorflow.compat.v1 import InteractiveSession
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.callbacks import ModelCheckpoint
#定义模型框架
def model():
#cnn
input_shape=layers.Input(shape =(20,20,1))
con=keras.layers.Conv2D(filters=16,kernel_size=3,strides=(1,1),use_bias=True,name='con',padding='same',activation='relu')(input_shape)
pool=layers.MaxPooling2D(pool_size=2,strides=1,padding='same')(con)
fl1=layers.Flatten()(pool)
fc1=layers.Dense(units=64,activation = 'sigmoid')(fl1)
drop1=keras.layers.Dropout(rate=0.1)(fc1)
fc2=layers.Dense(units=64,activation= 'softmax')(drop1)
cnn_model=keras.Model(inputs=input_shape,outputs=drop1)
#rnn
#时序模型
time_step=20
input_step=layers.Input(shape=(time_step,20,20,1))
hr=layers.TimeDistributed(cnn_model)(input_step)
gru=keras.layers.GRU(units=128)(hr)
#softmax概率输出
drop2=keras.layers.Dropout(0.1)(gru)
fc3=layers.Dense(units=5 ,activation='softmax')(drop2)
model=Model(inputs= input_step,outputs= fc3)
return model
cnn_rnn_model=model()
#加载数据集
file_name1=np.load('#数据集存放位置')
x,y=file_name1['data'],file_name1['label']
print(y)
#把数据分割为训练集,验证集,测试集
#K折交叉验证充分利用了数据,StratifiedKFold 保证了数据集划分比例与原数据比例一样,但开销比随机划分要高
kf=StratifiedKFold(n_splits=5,random_state=0,shuffle=True)
hc=1
for train_index,test_index in kf.split(x,y):
x_train=x[train_index]
x_test=x[test_index]
y_train=to_categorical(y[train_index]-2,5)
y_test=to_categorical(y[test_index]-2,5)
#使用回调函数 调整学习率,保存最佳性能的模型的权重
#EarlyStopping 防止冗余运行
callbacks_list=[
keras.callbacks.EarlyStopping(
monitor='loss',
patience=2,#能够容忍多少个epoch内都没有下降
verbose=1,
mode='min',
restore_best_weights=True),
# 'acc'没有单设验证集,‘val_loss'有验证集
#ModelCheckpoint 保存最佳模型权重
keras.callbacks.ModelCheckpoint(
filepath='#权重保存为.h5文件的位置',
monitor='accuracy',
mode='max',
save_best_only=True)
]
#训练模型
cnn_rnn_model.summary()
#配置训练方式
cnn_rnn_model.compile(
optimizer=tf.keras.optimizers.RMSprop(),
#分类交叉熵(False概率分布)
loss=tf.keras.losses.CategoricalCrossentropy(from_logits=False),
metrics=['accuracy']
)
#epochs迭代(更新)50次:一次480个batch,一个batch样本个数25个,总样本数为12000(480*25)
#训练集拟合模型
cnn_rnn_model.fit(
x_train,y_train,
epochs=50,
batch_size=25,
callbacks=callbacks_list)
model1=load_model('#最佳模型保存位置')
score=model1.evaluate(x_test,y_test,batch_size=25)
其中代码中的参数要由大量经验才能得到 ,这里将直接参考使用。
下一章任务将学习参数调优~~拜拜