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中的字符串替换操作示例
Jun 27 Python
Python基于ThreadingTCPServer创建多线程代理的方法示例
Jan 11 Python
浅析python协程相关概念
Jan 20 Python
PyTorch上搭建简单神经网络实现回归和分类的示例
Apr 28 Python
对pandas里的loc并列条件索引的实例讲解
Nov 15 Python
简单了解python中对象的取反运算符
Jul 01 Python
利用Python进行图像的加法,图像混合(附代码)
Jul 14 Python
浅谈Python中函数的定义及其调用方法
Jul 19 Python
python属于软件吗
Jun 18 Python
解析python 中/ 和 % 和 //(地板除)
Jun 28 Python
浅析NumPy 切片和索引
Sep 02 Python
用python制作个视频下载器
Feb 01 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
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
2006/10/09 PHP
php实现微信发红包
2015/12/05 PHP
php投票系统之增加与删除投票(管理员篇)
2016/07/01 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
实例说明js脚本语言和php脚本语言的区别
2019/04/04 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
获取DOM对象的几种扩展及简写
2006/10/09 Javascript
jQuery布局插件UI Layout简介及使用方法
2013/04/03 Javascript
js防止页面被iframe调用的方法
2014/10/30 Javascript
js+CSS实现弹出居中背景半透明div层的方法
2015/02/26 Javascript
浅谈JS中的常用选择器及属性、方法的调用
2017/07/28 Javascript
基于vue-resource jsonp跨域问题的解决方法
2018/02/03 Javascript
LayerClose弹窗关闭刷新方法
2018/08/17 Javascript
微信小程序使用map组件实现获取定位城市天气或者指定城市天气数据功能
2019/01/22 Javascript
5个你不知道的JavaScript字符串处理库(小结)
2020/06/01 Javascript
如何在postman测试用例中实现断言过程解析
2020/07/09 Javascript
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
5个很好的Python面试题问题答案及分析
2018/01/19 Python
python的Crypto模块实现AES加密实例代码
2018/01/22 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
python一键去抖音视频水印工具
2018/09/14 Python
对Python3之方法的覆盖与super函数详解
2019/06/26 Python
python保存字典和读取字典的实例代码
2019/07/07 Python
对Python中小整数对象池和大整数对象池的使用详解
2019/07/09 Python
python和c语言哪个更适合初学者
2020/06/22 Python
python excel多行合并的方法
2020/12/09 Python
Html5 canvas实现粒子时钟的示例代码
2018/09/06 HTML / CSS
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
名人演讲稿范文
2013/12/28 职场文书
学习经验演讲稿
2014/05/10 职场文书
社区先进事迹材料
2014/05/19 职场文书
乡镇民主生活会发言材料
2014/10/20 职场文书
运动会加油稿20字
2014/11/15 职场文书
2015年留守儿童工作总结
2015/05/22 职场文书
新郎婚礼致辞
2015/07/27 职场文书
创业计划书之闲置物品置换中心
2019/12/25 职场文书