TensorFlowkeras卷积神经⽹络添加L2正则化⽅式
我就废话不多说了,⼤家还是直接看代码吧!
model = dels.Sequential([
#卷积层1
keras.layers.Conv2D(32,kernel_size=5,strides=1,padding="same",data_format="channels_last",lu,kernel_ularizers.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",lu),
#池化层2
keras.layers.MaxPool2D(pool_size=2,strides=2,padding="same"),
#数据整理
keras.layers.Flatten(),
#1024个,全连接层
keras.layers.Dense(1024,lu),
#100个,全连接层
keras.layers.Dense(100,softmax)
])
import os
from tensorflow.python.keras.datasets import cifar100
from tensorflow.python import keras
import tensorflow as tf
class CNNMnist(object):
model = dels.Sequential([
#卷积层1
keras.layers.Conv2D(32,kernel_size=5,strides=1,padding="same",data_format="channels_last",lu,kernel_ularizers.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",lu),
#池化层2
keras.layers.MaxPool2D(pool_size=2,strides=2,padding="same"),
#数据整理
keras.layers.Flatten(),
#1024个,全连接层
keras.layers.Dense(1024,lu),
#100个,全连接层
keras.layers.Dense(100,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):
def fit(self):
def evaluate(self):
test_loss,test_acc = del.evaluate(self.x_test,self.y_test)
print(test_loss,test_acc)
if __name__ == '__main__':
cnn = CNNMnist()
del.summary())
cnnpile()
cnn.fit()
补充知识:初步了解TensorFlow如何实现正则化
为了避免过拟合问题,⼀个⾮常常⽤的⽅法是正则化(regularization),正则化的思想就是在损失函数中加⼊刻画模型复杂程度的指标。
假设⽤于刻画模型在训练数据上表现的损失函数为J(θ),那么在优化时不是直接优化J(θ),⽽是优化J(θ) + λR(w),其中R(w)刻画的是模型的复杂程度,⽽λ表⽰模型复杂损失在总损失中的⽐例,需要注意的是,这⾥的θ表⽰的是⼀个神经⽹络中所有的参数,它包括边上的权重w和偏置项b,但⼀般来说模型复杂度只由权重w决定。
常⽤的刻画模型复杂度的函数R(w)有两种,⼀种是L1正则化,计算公式是:
另⼀种是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.ib.layers.l1_regularizer(0.5)(weights)))
#计算结果为15 * 1/2 = 7.5,L2正则化乘以1/2可以⽅便求导
print(sess.ib.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 = lu(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__collection('losses'))
以上这篇TensorFlow keras卷积神经⽹络添加L2正则化⽅式就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。