KerasMNIST过拟合的处理03

1、Keras手写数字练习(单层网络)

from keras.datasets import mnist  #直接从keras里面应用数据集
from keras.utils import np_utils  #keras 里面用到的一个 np 的工具包
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD  #优化函数;


#载入数据
(x_train,y_train),(x_test,y_test)=mnist.load_data() #分为测试集和训练集

print(x_train.shape)
print(y_train[5])

# (6000,28,28) -> (6000,784)

#reshape改变数组的维度
x_train=x_train.reshape(x_train.shape[0],-1)/255.0 #-1表示是自动判断,/225是表示归一化。
x_test=x_test.reshape(x_test.shape[0],784)/255.0#行数是 x_train.shape[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个神经元,输出10个神经元
model=Sequential()
# 偏置的初始值. 激活函数.
model.add(Dense(units=10,input_dim=784,bias_initializer="one",activation='softmax'))
# 优化器,训练过程种计算准确率。
# lr 表示学习率
sgd=SGD(lr=0.2)
model.compile(optimizer=sgd,loss='mse',metrics=['accuracy'])#同时计算精确度.

#训练的方式
#训练的批次是32,迭代周期是 10 把6w 张图片训练完一次是一次轮回,现在是 10 次轮回.
model.fit(x_train,y_train,batch_size=32,epochs=10)

#评估模型;
loss,accuracy=model.evaluate(x_test,y_test)

print("loss*********",loss)
print("accuracy*******",accuracy)

 2、加多层网络的简单写法

#创建模型的简单写法
# 偏置的初始值. 激活函数改为双曲正切.
model=Sequential([
    Dense(units=200,input_dim=784,bias_initializer='one',activation="tanh"),
    Dense(units=100,bias_initializer='one',activation="tanh"),
    Dense(units=10, bias_initializer='one', activation="softmax")
])

bias_initializer表示初始化输入,都是1,还有初始化都是0

activation:表示激活函数(tanh、softmax)

import numpy as np
from keras.datasets import mnist  #直接从keras里面应用数据集
from keras.utils import np_utils  #keras 里面用到的一个 np 的工具包
from keras.models import Sequential
from keras.layers import Dense,Dropout #导入Dropt
from keras.optimizers import SGD  #优化函数;


#载入数据
(x_train,y_train),(x_test,y_test)=mnist.load_data() #分为测试集和训练集

print(x_train.shape)
print(y_train[5])

# (6000,28,28) -> (6000,784)

x_train=x_train.reshape(x_train.shape[0],-1)/255.0 #-1表示是自动判断,/225是表示归一化。
x_test=x_test.reshape(x_test.shape[0],784)/255.0#行数是 x_train.shape[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)



#创建模型的简单写法
# 偏置的初始值. 激活函数改为双曲正切.
model=Sequential([
    Dense(units=200,input_dim=784,bias_initializer='one',activation="tanh"),
    Dense(units=100,bias_initializer='one',activation="tanh"),
    Dense(units=10, bias_initializer='one', activation="softmax")
])

# 优化器,训练过程种计算准确率。
sgd=SGD(lr=0.2)
#把损失函数换成交叉熵
lossa="categorical_crossentropy"
model.compile(optimizer=sgd,loss=lossa,metrics=['accuracy'])#同时计算精确度.


#训练的方式
#训练的批次是32,迭代周期是 10 把6w 张图片训练完一次是一次轮回,现在是 10 次轮回.
model.fit(x_train,y_train,batch_size=32,epochs=10)

#评估模型;
loss,accuracy=model.evaluate(x_test,y_test)
print("test-loss*********",loss)
print("test-accuracy*****",accuracy)

#也可以放入训练的数据做一个测试:
loss,accuracy=model.evaluate(x_train,y_train)
print("train-loss*********",loss)
print("train-accuracy*****",accuracy)

3、防止过拟合出现,增加dropout

减少神经元参加训练

#创建模型的简单写法
model=Sequential([
    Dense(units=200,input_dim=784,bias_initializer='one',activation="tanh"),
    Dropout(0.4),#让40%的神经元不工作.
    Dense(units=100,bias_initializer='one',activation="tanh"),
    Dropout(0.4), #让40的神经元不工作.
    Dense(units=10, bias_initializer='one', activation="softmax")
])

4、增加正则化项,防止过拟合现象L1和L2

让权值 w 减小,甚至趋近到0,L1 到0,L2是趋近与0,有点像 dropout。

λ 对正则化项的影响
可以看出 λ 越大,对消除过拟合的处理效果越好。

正则化可以在三个地方加

  • kernel_regularizer :在权重上加
  • bias_regularizer: 在偏置值上加
  • activity_regularizer :在激活函数上加

一般用的最多的是添加在权重上。

#创建模型的简单写法
model=Sequential([
    #添加正则化项的参数是0.0003
    # kernel_regularizer 是权值的正则化项.
    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))
])

 5、Keras的优化器介绍

Optimizer 常用的是 梯度下降法,除此之外,还有其他的几种:

  • SGD :误差反向传播法
  • Adagrad
  • AAdadelta

SGD

其实梯度下降法也分三种:

  1. 标准梯度下降法:计算所有样本,汇总误差,然后根据误差来更新权值
  2. 随机梯度下降法:随机抽取一个样本,计算误差,然后更新权值
  3. 批量梯度下降法:这是一种折中的方案,从总样本中抽取一个批次(例如抽取100个),然后计算一个 batch 的总误差,最后根据总误差来更新权值。

一般情况下我们默认使用的是批量梯度下降法。

Momentum

当前权重的改变,会受上一次权值改变的影响,类似于小球向下滚动的时候,带上了惯性,这样可以加快小球的向下速度。

NAG

相当于一个预先知道方向的更聪明的小球。

Adagrad

优势在于不需要人为的调节学习率,他可以自动的调节,他的缺点在于,随着迭代次数的增加,学习率会越来越低,最终趋向于 0 。

Adam

是常用的优化器,Adam会存储之前衰减的平方梯度,同时会保存之前衰减的梯度,经过一些处理以后,在用来更新权值 W

# 优化器,训练过程种计算准确率。
sgd=SGD(lr=0.2)
adam=Adam(lr=0.001)#默认的就是0.001
#把损失函数换成交叉熵
lossa="categorical_crossentropy"
model.compile(optimizer=adam,loss=lossa,metrics=['accuracy'])#同时计算精确度.

总结:

防止过拟合的方法:

1、增大数据量(数据比模型重要)

2、Early Stopping (早停)

  • 一般的做法是记录到目前为止,最好的 validation accuracy,当连续 10 个 Epoch 没有达到最佳 accuracy 时,这认为 accuracy 不再提高了,就可以停止迭代了( Early Stopping)

3、drapout减少神经元参与训练

4、正则化(L1和L2正则)

一般情况下特征比训练数据还要多,选择使用L1,大多数情况下都使用L2正则,也叫做岭回归

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值