深度学习之卷积神经网络——学习分享(三)

目录

 

前言:

一、加载数据集

二、定义模型架构

三、数据预处理

四、预处理类标签

五、定义回调函数

六、编译模型

七、训练集拟合模型

八、加载保存好的模型

九、测试集评估模型


前言:

前面介绍了卷积神经网络cnn每类层的搭建方式,接下来将介绍如何完善整个训练模型,分为哪几步,让我们一起看看吧!

以现阶段学习手势识别模型框架搭建为例:

深度学习之卷积神经网络——学习分享(三)_第1张图片

一、加载数据集

 从网上下载数据集,数据格式为(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

to_categorical函数:

参考文献:

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)

其中代码中的参数要由大量经验才能得到 ,这里将直接参考使用。

下一章任务将学习参数调优~~拜拜

你可能感兴趣的:(深度学习,cnn,人工智能)