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 相关文章推荐
pyqt和pyside开发图形化界面
Jan 22 Python
python如何通过protobuf实现rpc
Mar 06 Python
Python处理json字符串转化为字典的简单实现
Jul 07 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
May 16 Python
Django ORM框架的定时任务如何使用详解
Oct 19 Python
Python编程中flask的简介与简单使用
Dec 28 Python
使用python 打开文件并做匹配处理的实例
Jan 02 Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 Python
Python实现直播推流效果
Nov 26 Python
python实现将视频按帧读取到自定义目录
Dec 10 Python
Python+logging输出到屏幕将log日志写入文件
Nov 11 Python
字典算法实现及操作 --python(实用)
Mar 31 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
不用数据库的多用户文件自由上传投票系统(2)
2006/10/09 PHP
PHP 强制性文件下载功能的函数代码(任意文件格式)
2010/05/26 PHP
php中模拟POST传递数据的两种方法分享
2011/09/16 PHP
thinkphp 多表 事务详解
2013/06/17 PHP
利用php做服务器和web前端的界面进行交互
2016/10/31 PHP
PHP实现发送微博消息功能完整示例
2019/12/04 PHP
一组JS创建和操作表格的函数集合
2009/05/07 Javascript
jQuery入门问答 整理的几个常见的初学者问题
2010/02/22 Javascript
web css实现整站样式互相切换
2013/10/29 Javascript
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
2015/02/20 Javascript
Jquery实现仿腾讯娱乐频道焦点图(幻灯片)特效
2015/03/06 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
jQuery中 $ 符号的冲突问题及解决方案
2016/11/04 Javascript
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
TypeScript高级用法的知识点汇总
2019/12/17 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
Python抓取百度查询结果的方法
2015/07/08 Python
Python实现快速排序和插入排序算法及自定义排序的示例
2016/02/16 Python
Python闭包执行时值的传递方式实例分析
2018/06/04 Python
Python实战之制作天气查询软件
2019/05/14 Python
python 中pyqt5 树节点点击实现多窗口切换问题
2019/07/04 Python
Django自定义全局403、404、500错误页面的示例代码
2020/03/08 Python
浅谈keras中的目标函数和优化函数MSE用法
2020/06/10 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
html svg生成环形进度条的实现方法
2019/09/23 HTML / CSS
广告语设计及教案
2014/03/21 职场文书
计生工作先进事迹
2014/08/15 职场文书
2014年团支书工作总结
2014/11/14 职场文书
实习单位推荐信
2015/03/27 职场文书
反腐倡廉观后感
2015/06/08 职场文书
实操Python爬取觅知网素材图片示例
2021/11/27 Python