- 源码
#倒入相关包
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D, BatchNormalization
from tensorflow.keras.optimizers import SGD
from keras import regularizers
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
from keras.callbacks import ModelCheckpoint
import os
import numpy as np
import tensorflow as tf
import tensorflow.keras
import pandas as pd
import cv2
import skimage
import skimage.io
import skimage.transform
#CNN网络结构
model = Sequential()
#输入层,输入维度224*224*3.激活函数为relu,初始化方式为'uniform'
#卷积层1,有128个过滤器,过滤器大小为5*5,移动步长为(1,1),填充方式为valid
model.add(Conv2D(128,(5,5),strides=(1,1),input_shape=(224, 224, 3),padding='valid',activation='relu',kernel_initializer='uniform'))
#最大池化层1,下采样,大小为2
model.add(MaxPooling2D(pool_size=(2,2)))
#卷积层2
model.add(Conv2D(256,(5,5),strides=(1,1),padding='valid',activation='relu',kernel_initializer='uniform'))
#最大池化层
model.add(MaxPooling2D(pool_size=(2,2)))
#降维:将三维数据变成一维数据
model.add(Flatten())
#全连接层1:有512个神经元
model.add(Dense(512,activation='relu'))
#使得50%的神经元失活(失效)(对抗过拟合手段)
model.add(Dropout(0.5))
#输出层(全连接层2):激活函数为softmax,五分类
model.add(Dense(5,activation='softmax'))
#导入早停法,模型检查点
from keras.callbacks import EarlyStopping,ModelCheckpoint
#val_accuracy在10轮之内没有上升,则停止训练
early_stopping = EarlyStopping(monitor = 'val_accuracy',patience =10,mode = 'max')
#权重保存路径
filepath = "weights-improvement-{epoch:02d}-{val_acc:.2f}.hdf5"
# 中途训练效果提升, 则将文件保存, 每提升一次, 保存一次
checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True,
mode='max')
callbacks_list = [checkpoint]
#打印模型各个层的组成。也能看到数据经过每个层后,输出的数据维度。
model.summary()
#定义损失函数SGD。学习率为lr,衰减为weight_decay,
sgd = SGD(lr=lr, decay=weight_decay, momentum=0.9, nesterov=True)
#组建模型
model.compile(loss='categorical_crossentropy', optimizer=sgd,metrics=['accuracy'])
#载入数据(我的数据是处理好的npy格式)
X_test = np.load("../data/X_test.npy")
Y_test = np.load("../data/Y_test.npy")
X_train = np.load("../data/X_train.npy")
Y_train = np.load("../data/Y_train.npy")
#定义参数
lr = 0.001 #学习率
weight_decay = 0.000001 #权重衰减
nb_epoch = 50 #训练轮次
batch_size = 64 #训练批次(输入宽度,64张图为1批次)
#训练:放入训练集,根据检查点保存模型
#validation_split=0.2:表示把80%当作训练集,20%当作测试集
#shuffle=True:打乱(随机选取数据)
#verbose=1:打印输出
history = model.fit(X_train, Y_train, epochs=nb_epoch, batch_size=batch_size,callbacks = [callbacks_list],
validation_split=0.2, verbose=1,shuffle=True)
#保存模型
model.save("CNN.model")
#绘制准确率,损失模型
import matplotlib.pyplot as plt
from keras.callbacks import Callback
#准确率图像
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.savefig('accuracy' +".jpg")
plt.show()
plt.close()
#损失图像
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['loss', 'val_loss'], loc='upper left')
plt.savefig('loss' +".jpg")
plt.show()
plt.close()
#验证,输出在验证集的准确率和损失
loss,accuracy = model.evaluate(X_test,Y_test, batch_size=batch_size)
print(loss)
print(accuracy)
Momentum
使用动量(Momentum)的随机梯度下降法(SGD),主要思想是引入一个积攒历史梯度信息动量来加速SGD。
从训练集中取一个大小为nn的小批量{X(1),X(2),...,X(n)}{X(1),X(2),...,X(n)}样本,对应的真实值分别为Y(i)Y(i),则Momentum优化表达式为:
{vt=αvt−1+ηtΔJ(Wt,X(is),Y(is))Wt+1=Wt−vt
{vt=αvt−1+ηtΔJ(Wt,X(is),Y(is))Wt+1=Wt−vt
其中,vtvt表示tt时刻积攒的加速度。αα表示动力的大小,一般取值为0.9(表示最大速度10倍于SGD)。ΔJ(Wt,X(is),Y(is))ΔJ(Wt,X(is),Y(is))含义见SGD算法。WtWt表示tt时刻模型参数。
动量主要解决SGD的两个问题:一是随机梯度的方法(引入的噪声);二是Hessian矩阵病态问题(可以理解为SGD在收敛过程中和正确梯度相比来回摆动比较大的问题)。
理解策略为:由于当前权值的改变会受到上一次权值改变的影响,类似于小球向下滚动的时候带上了惯性。这样可以加快小球向下滚动的速度。
原文链接:https://blog.csdn.net/weixin_40170902/article/details/80092628
怎么收藏这篇文章?
看的我热血沸腾啊www.jiwenlaw.com
《我喜欢的样子你都有》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/17903.html
你的才华让人瞩目,期待你的更多文章。 https://www.yonboz.com/video/57761.html
你的才华让人瞩目,期待你的更多文章。 https://www.yonboz.com/video/57761.html
《灵笼》国产动漫高清在线免费观看:https://www.jgz518.com/xingkong/7459.html
你的文章充满了智慧,让人敬佩。 https://www.yonboz.com/video/30894.html
《社长之路》港台综艺高清在线免费观看:https://www.jgz518.com/xingkong/34611.html
你的文章让我感受到了生活的美好,谢谢! https://www.yonboz.com/video/10434.html