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 相关文章推荐
pycharm 使用心得(八)如何调用另一文件中的函数
Jun 06 Python
Python入门篇之列表和元组
Oct 17 Python
详解Python当中的字符串和编码
Apr 25 Python
Python 将pdf转成图片的方法
Apr 23 Python
mac下给python3安装requests库和scrapy库的实例
Jun 13 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
Mar 01 Python
numpy中的meshgrid函数的使用
Jul 31 Python
python [:3] 实现提取数组中的数
Nov 27 Python
利用Python实现某OA系统的自动定位功能
May 27 Python
Python类绑定方法及非绑定方法实例解析
Oct 09 Python
Python Pandas模块实现数据的统计分析的方法
Jun 24 Python
python画条形图的具体代码
Apr 20 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
利用PHP实现短域名互转
2013/07/05 PHP
laravel获取不到session的三种解决办法【推荐】
2018/09/16 PHP
Laravel实现批量更新多条数据
2020/04/06 PHP
jQuery validate 中文API 附validate.js中文api手册
2010/07/31 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
JS 两日期相减,获得天数的小例子(兼容IE,FF)
2013/07/01 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
常用的JavaScript验证正则表达式汇总
2013/11/26 Javascript
js动态创建标签示例代码
2014/06/09 Javascript
jQuery使用正则表达式限制文本框只能输入数字
2016/06/18 Javascript
jQuery 3.0十大新特性
2016/07/06 Javascript
Bootstrapvalidator校验、校验清除重置的实现代码(推荐)
2016/09/28 Javascript
微信小程序结合Storage实现搜索历史效果
2019/05/18 Javascript
vue 实现移动端键盘搜索事件监听
2019/11/06 Javascript
微信小程序实现图片压缩
2019/12/03 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
python解析基于xml格式的日志文件
2017/02/25 Python
pycharm远程调试openstack的图文教程
2017/11/21 Python
python集合是否可变总结
2019/06/20 Python
Python中turtle库的使用实例
2019/09/09 Python
python 实现按对象传值
2019/12/26 Python
python 错误处理 assert详解
2020/04/20 Python
深入了解Python enumerate和zip
2020/07/16 Python
python如何实时获取tcpdump输出
2020/09/16 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
python定时截屏实现
2020/11/02 Python
python里glob模块知识点总结
2021/01/05 Python
集团公司总经理岗位职责
2013/12/20 职场文书
产假请假条
2014/04/10 职场文书
奥巴马获胜演讲稿
2014/05/15 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
2015年十一国庆节演讲稿
2015/03/20 职场文书
2015年班级工作总结范文
2015/04/03 职场文书
高中地理教学反思
2016/02/19 职场文书
Python可视化学习之seaborn调色盘
2022/02/24 Python