TensorFlow keras卷积神经网络 添加L2正则化方式


Posted in Python onMay 22, 2020

我就废话不多说了,大家还是直接看代码吧!

model = keras.models.Sequential([
 #卷积层1
 keras.layers.Conv2D(32,kernel_size=5,strides=1,padding="same",data_format="channels_last",activation=tf.nn.relu,kernel_regularizer=keras.regularizers.l2(0.01)),
 #池化层1
 keras.layers.MaxPool2D(pool_size=2,strides=2,padding="same"),
 #卷积层2
 keras.layers.Conv2D(64,kernel_size=5,strides=1,padding="same",data_format="channels_last",activation=tf.nn.relu),
 #池化层2
 keras.layers.MaxPool2D(pool_size=2,strides=2,padding="same"),
 #数据整理
 keras.layers.Flatten(),
 #1024个,全连接层
 keras.layers.Dense(1024,activation=tf.nn.relu),
 #100个,全连接层
 keras.layers.Dense(100,activation=tf.nn.softmax)
 ])
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
 
from tensorflow.python.keras.datasets import cifar100
from tensorflow.python import keras
import tensorflow as tf
 
class CNNMnist(object):
 
 model = keras.models.Sequential([
 #卷积层1
 keras.layers.Conv2D(32,kernel_size=5,strides=1,padding="same",data_format="channels_last",activation=tf.nn.relu,kernel_regularizer=keras.regularizers.l2(0.01)),
 #池化层1
 keras.layers.MaxPool2D(pool_size=2,strides=2,padding="same"),
 #卷积层2
 keras.layers.Conv2D(64,kernel_size=5,strides=1,padding="same",data_format="channels_last",activation=tf.nn.relu),
 #池化层2
 keras.layers.MaxPool2D(pool_size=2,strides=2,padding="same"),
 #数据整理
 keras.layers.Flatten(),
 #1024个,全连接层
 keras.layers.Dense(1024,activation=tf.nn.relu),
 #100个,全连接层
 keras.layers.Dense(100,activation=tf.nn.softmax)
 ])
 
 def __init__(self):
 (self.x_train,self.y_train),(self.x_test,self.y_test) = cifar100.load_data()
 
 self.x_train = self.x_train/255.0
 self.x_test = self.x_test/255.0
 
 
 def compile(self):
 CNNMnist.model.compile(optimizer=keras.optimizers.Adam(),loss=keras.losses.sparse_categorical_crossentropy,metrics=["accuracy"])
 
 def fit(self):
 CNNMnist.model.fit(self.x_train,self.y_train,epochs=1,batch_size=32)
 
 def evaluate(self):
 test_loss,test_acc = CNNMnist.model.evaluate(self.x_test,self.y_test)
 print(test_loss,test_acc)
 
if __name__ == '__main__':
 cnn = CNNMnist()
 print(CNNMnist.model.summary())
 cnn.compile()
 cnn.fit()

补充知识:初步了解TensorFlow如何实现正则化

为了避免过拟合问题,一个非常常用的方法是正则化(regularization),正则化的思想就是在损失函数中加入刻画模型复杂程度的指标。

假设用于刻画模型在训练数据上表现的损失函数为J(θ),那么在优化时不是直接优化J(θ),而是优化J(θ) + λR(w),其中R(w)刻画的是模型的复杂程度,而λ表示模型复杂损失在总损失中的比例,需要注意的是,这里的θ表示的是一个神经网络中所有的参数,它包括边上的权重w和偏置项b,但一般来说模型复杂度只由权重w决定。

常用的刻画模型复杂度的函数R(w)有两种,一种是L1正则化,计算公式是:

TensorFlow keras卷积神经网络 添加L2正则化方式

另一种是L2正则化,计算公式是:

TensorFlow keras卷积神经网络 添加L2正则化方式

TensorFlow可以优化任意形式的损失函数,所以TensorFlow自然也可以优化带正则化的损失函数。

L1正则化和L2正则化,在TensorFlow中分别以不同的函数实现它们,以下列代码为示例:

#含有L1正则化的损失函数:
loss = tf.reduce_mean(tf.square(y_ - y)) + tf.contrib.layers.l1_regularizer(λ)(w)

#含有L2正则化的损失函数:
loss = tf.reduce_mean(tf.square(y_ - y)) + tf.contrib.layers.l2_regularizer(λ)(w)

loss为定义的损失函数,它由两个部分组成,第一个部分是均方误差损失函数,它刻画了模型在训练数据上的表现,第二个部分就是正则化,它防止模型过度模拟训练数据中的随机噪音;

λ表示了正则化项的权重,w为需要计算正则化损失的参数。

TensorFlow提供了tf.contrib.layers.l1_regularizer函数和tf.contrib.layers.l2_regularizer函数用来计算L1正则化和L2正则化,通过以下代码给出使用两个函数的样例:

import tensorflow as tf
weights = tf.constant([[1.0, -2.0], [-3.0, 4.0]])
with tf.Session() as sess:
 #计算结果为5.0
 print(sess.run(tf.contrib.layers.l1_regularizer(0.5)(weights)))
 #计算结果为15 * 1/2 = 7.5,L2正则化乘以1/2可以方便求导
 print(sess.run(tf.contrib.layers.l2_regularizer(0.5)(weights)))

在简单的神经网络中,这样的方式就可以很好地计算带正则化的损失函数了,但当神经网络的参数增多之后,这样的方式首先可能导致损失函数loss的定义很长,可读性差且容易出错,更主要的是,当网络结构复杂之后定义网络结构的部分和计算损失函数的部分可能不在同一个函数中,这样通过变量这种方式计算损失函数就不方便了。

为了解决这个问题,可以使用TensorFlow中提供的集合(collection)来维护需要计算的正则化损失,以下列代码为示例给出通过集合计算一个5层神经网络带L2正则化的损失函数的计算方法:

import tensorflow as tf

#获取一层神经网络边上的权重,并将这个权重的L2正则化损失加入名称为losses的集合中
def get_weight(shape, r):
 #生成一个变量
 var = tf.Variable(tf.random_normal(shape, stddev=1, seed=1), dtype=tf.float32)
 '''add_to_collection函数将这个新生成变量的L2正则化损失项加入集合
 这个函数的第一个参数losses是集合的名字,第二个参数是要加入这个集合的内容'''
 tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(r)(var))
 return var

x = tf.placeholder(tf.float32, shape=(None, 2))
y_ = tf.placeholder(tf.float32, shape=(None, 1))

#定义了每一层网络中节点的个数
layer_dimension = [2, 10, 10, 10, 1]
#神经网络的层数
n_layers = len(layer_dimension)

#这个变量维护前向传播时最深层的节点,开始的时候就是输入层
cur_layer = x
#in_dimension为当前层的节点个数
in_dimension = layer_dimension[0]

#通过一个循环来生成5层全连接的神经网络结构
for i in range(1, n_layers):
 #out_dimension为下一层的节点个数
 out_dimension = layer_dimension[i]
 #生成当前层中权重的变量,并将这个变量的L2正则化损失加入losses集合
 weight = get_weight([in_dimension, out_dimension], 0.001)
 bias = tf.Variable(tf.fill([1, out_dimension], 0.1))
 #使用ReLU激活函数
 cur_layer = tf.nn.relu(tf.matmul(cur_layer, weight) + bias)
 #进入下一层之前将下一层的节点个数更新为当前层节点个数
 in_dimension = out_dimension

'''在定义神经网络前向传播的同时已经将所有的L2正则化损失加入了losses集合
这里只需要计算刻画模型在训练数据上表现的损矣函数。'''
mse_loss = tf.reduce_mean(tf.square(y_ - cur_layer))

#将均方误差损失函数加入损失集合
tf.add_to_collection('losses', mse_loss)

'''get_collection返回一个列表,这个列表包含所有这个集合中的元素
在这个样例中这些元素就是损失函数的不同部分,将它们加起来就可以得到最终的损失函数。'''
loss = tf.add_n(tf.get_collection('losses'))

以上这篇TensorFlow keras卷积神经网络 添加L2正则化方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
Mar 31 Python
关于numpy中np.nonzero()函数用法的详解
Feb 07 Python
深入理解Python对Json的解析
Feb 14 Python
Python常用内置模块之xml模块(详解)
May 23 Python
Python Pexpect库的简单使用方法
Jan 29 Python
Python英文文本分词(无空格)模块wordninja的使用实例
Feb 20 Python
python如何求数组连续最大和的示例代码
Feb 04 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
Apr 07 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
Aug 19 Python
python exit出错原因整理
Aug 31 Python
Python基础之教你怎么在M1系统上使用pandas
May 08 Python
pycharm代码删除恢复的方法
Jun 26 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
May 22 #Python
python实现猜单词游戏
May 22 #Python
Django使用rest_framework写出API
May 21 #Python
使用keras根据层名称来初始化网络
May 21 #Python
关于Keras Dense层整理
May 21 #Python
Django如何使用redis作为缓存
May 21 #Python
如何打包Python Web项目实现免安装一键启动的方法
May 21 #Python
You might like
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
PHP源代码数组统计count分析
2011/08/02 PHP
为你总结一些php信息函数
2015/10/21 PHP
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
php微信公众号开发之快递查询
2018/10/20 PHP
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
2013/10/14 Javascript
通过实例理解javascript中没有函数重载的概念
2015/06/03 Javascript
基于javascript实现右下角浮动广告效果
2016/01/08 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
深入浅析Vue组件开发
2016/11/25 Javascript
jQuery实现动态添加和删除input框实例代码
2019/03/26 jQuery
JS如何把字符串转换成json
2020/02/21 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
2020/10/28 Javascript
[01:23:45]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第一场 1月22日
2021/03/11 DOTA
Python实现在线程里运行scrapy的方法
2015/04/07 Python
Python设计模式之享元模式原理与用法实例分析
2019/01/11 Python
Python3.5装饰器典型案例分析
2019/04/30 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
Python warning警告出现的原因及忽略方法
2020/01/31 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
python如何建立全零数组
2020/07/19 Python
python实现简单文件读写函数
2021/02/25 Python
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
Html5游戏开发之乒乓Ping Pong游戏示例(一)
2013/01/21 HTML / CSS
运动服饰每月订阅盒:Ellie
2018/04/29 全球购物
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
村干部培训班主持词
2014/03/28 职场文书
四风查摆问题及整改措施
2014/10/10 职场文书
2014年小学德育工作总结
2014/12/05 职场文书
师德标兵事迹材料
2014/12/19 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
Go gRPC进阶教程gRPC转换HTTP
2022/06/16 Golang