前言
计算机视觉系列之学习笔记主要是本人进行学习人工智能(计算机视觉方向)的代码整理。本系列所有代码是用python3编写,在平台Anaconda中运行实现,在使用代码时,默认你已经安装相关的python库,这方面不做多余的说明。本系列所涉及的所有代码和资料可在我的github上下载到,gitbub地址:https://github.com/mcyJacky/DeepLearning-CV,如有问题,欢迎指出。
一、使用正则化抵抗过拟合介绍
上一的篇章已经介绍过抵抗过拟合的几种方法,其中正则化就是其中的一种。使用正则化一般有两种方法:L1正则化和L2正则化,L1正则化可达到模型参数疏化效果,L2正则化使模型参数值衰减,使模型参数值都接近0,使用正则化的目的是:使最后的代价函数减小,但适用于更深层网络,更复杂的任务。其中L1正则化的表达式为:
C
=
C
0
+
λ
n
∑
∣
w
∣
C = C_0 + \frac{λ}{n} \sum \mid w \mid
C=C0+nλ∑∣w∣
其中,
C
C
C为最终求解的代价函数,
C
0
C_0
C0为原始代价函数,
n
n
n为样本个数,
λ
λ
λ为正则项系数,用来权衡正则项与
C
0
C_0
C0项比重。
L2正则化的表达式为:
C
=
C
0
+
λ
2
n
∑
∣
w
2
∣
C = C_0 + \frac{λ}{2n} \sum \mid w^{2} \mid
C=C0+2nλ∑∣w2∣
其中,
C
C
C为最终求解的代价函数,
C
0
C_0
C0为原始代价函数,
n
n
n为样本个数,
λ
λ
λ为正则项系数,用来权衡正则项与
C
0
C_0
C0项比重。
二、使用正则化进行MNIST数据集分类
下面就是加入了正则化项对MNIST数据集进行分类,我们对MNIST数据集使用上一篇的神经网络结构,即784-200-100-10,输入层有784个神经元,有两个隐藏层:第一个隐藏层是200个神经元,第二个隐藏层是100个神经元,输出层是10个神经元。具体如下:
import numpy as np
from keras.datasets import mnist
# keras提供的numpy工具包
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
# 正则化包
from keras.regularizers import l2
# 载入数据
(x_train,y_train), (x_test,y_test) = mnist.load_data()
# (6000,28,28)
print('x_shape:', x_train.shape)
# (6000)
print('y_shape:', y_train.shape)
# 进行数据转换,并归一化
# (60000,28,28) -> (60000, 784)
x_train = x_train.reshape(x_train.shape[0], -1)/255.0
x_test = x_test.reshape(x_test.shape[0], -1)/255.0
# 换one hot格式
y_train = np_utils.to_categorical(y_train, num_classes=10)
y_test = np_utils.to_categorical(y_test, num_classes=10)
# 创建模型: 784-200-100-10, kernel_regularizer表示正则化项使用
model = Sequential([
Dense(units=200, input_dim=784, bias_initializer='one', activation='tanh', kernel_regularizer=l2(0.0003)),
Dense(units=100, bias_initializer='one', activation='tanh', kernel_regularizer=l2(0.0003)),
Dense(units=10, bias_initializer='one', activation='softmax', kernel_regularizer=l2(0.0003))
])
# 定义优化
sgd = SGD(lr=0.2)
# 定义优化器,loss function, 训练过程中的准确率
model.compile(
optimizer = sgd,
loss = 'categorical_crossentropy',
metrics = ['accuracy']
)
# 进行模型训练
model.fit(x_train, y_train, batch_size=32, epochs=10)
# 评估模型
loss, accuracy = model.evaluate(x_test, y_test)
print('\ntest loss:', loss)
print('test accuracy:', accuracy)
loss, accuracy = model.evaluate(x_train, y_train)
print('\ntrain loss:', loss)
print('train accuracy:', accuracy)
# 输出结果:
# x_shape: (60000, 28, 28)
# y_shape: (60000,)
# Epoch 1/10
# 60000/60000 [==============================] - 7s 124us/step - loss: 0.4438 - acc: 0.9103
# Epoch 2/10
# 60000/60000 [==============================] - 7s 121us/step - loss: 0.2617 - acc: 0.9599
# Epoch 3/10
# 60000/60000 [==============================] - 8s 126us/step - loss: 0.2184 - acc: 0.9694
# Epoch 4/10
# 60000/60000 [==============================] - 7s 125us/step - loss: 0.1930 - acc: 0.9744
# Epoch 5/10
# 60000/60000 [==============================] - 7s 120us/step - loss: 0.1802 - acc: 0.9764
# Epoch 6/10
# 60000/60000 [==============================] - 7s 118us/step - loss: 0.1687 - acc: 0.9782
# Epoch 7/10
# 60000/60000 [==============================] - 8s 129us/step - loss: 0.1621 - acc: 0.9791
# Epoch 8/10
# 60000/60000 [==============================] - 8s 126us/step - loss: 0.1571 - acc: 0.9808
# Epoch 9/10
# 60000/60000 [==============================] - 8s 127us/step - loss: 0.1551 - acc: 0.9806
# Epoch 10/10
# 60000/60000 [==============================] - 8s 128us/step - loss: 0.1509 - acc: 0.9812
# 10000/10000 [==============================] - 1s 55us/step
# test loss: 0.1696284313082695
# test accuracy: 0.9735
# 60000/60000 [==============================] - 3s 49us/step
# train loss: 0.14487112503449123
# train accuracy: 0.9829666666666667
使用正则化后,我们观察最终测试集和训练集的预测结果,可以粗略看出两者的结果相差不大,但是在这个案例中体现也不是太明显,如果我们在训练大型复杂数据时,就能切实感受到带来的好处。
【参考】:
1. 城市数据团课程《AI工程师》计算机视觉方向
2. deeplearning.ai 吴恩达《深度学习工程师》
3. 《机器学习》作者:周志华
4. 《深度学习》作者:Ian Goodfellow
转载声明:
版权声明:非商用自由转载-保持署名-注明出处
署名 :mcyJacky
文章出处:https://blog.csdn.net/mcyJacky