Tensorflow学习笔记day02 + TF损失函数定义和使用正则化

声明一个损失函数需要将系数**(权重和偏置)定义为变量**,将数据集定义为占位符

设 m 是样本数量,n 是特征数量,P 是类别数量

m = 1000
n  = 15
P  = 2

在标准线性回归的情况下,只有一个输入变量和一个输出变量:

import tensorflow as tf

#定义占位符 用于训练数据的输入
X = tf.placeholder(tf.float32, name='X') 
Y = tf.placeholder(tf.float32, name='Y')

#定义变量 用于承载和更新权重和偏置
w0 = tf.Variable(0.0)
w1 = tf.Variable(0.0)

#线性回归模型
Y_hat = X*w1 + w0

#损失函数
loss = tf.square(Y - Y_hat, name='loss') #square 平方

在多元线性回归的情况下,输入变量不止一个,而输出变量仍为一个。现在可以定义占位符X的大小为 [m,n],其中 m 是样本数量,n 是特征数量,代码如下:

import tensorflow as tf

#定义占位符 用于训练数据的输入
X = tf.placeholder(tf.float32, name='X' , shape=[m,n]) 
Y = tf.placeholder(tf.float32, name='Y')

#定义变量 用于承载和更新权重和偏置
w0 = tf.Variable(0.0)
w1 = tf.Variable(tf.random_normal([n,1]))

#线性回归模型
Y_hat = tf.matmul(X, w1) + w0

#多元线性回归损失函数
loss = tf.reduce_mean(tf.square(Y - Y_hat , name='loss'))

在逻辑回归的情况下,损失函数定义为交叉熵。输出 Y 的维数等于训练数据集中类别的数量,其中 P 为类别数量:

import tensorflow as tf

#定义占位符 用于训练数据的输入
X = tf.placeholder(tf.float32, name='X' , shape=[m,n]) 
Y = tf.placeholder(tf.float32, name='Y' , shape=[m,P])

#定义变量 用于承载和更新权重和偏置
w0 = tf.Variable(tf.zeros([1,P]), name='bias')
w1 = tf.Variable(tf.random_normal([n,1]), name='weights')

#线性回归模型
Y_hat = tf.matmul(X, w1) + w0

#损失函数
#entropy = tf.nn.softmax_cross_entropy_with_logits(Y_hat, Y)
#loss = tf.reduce_mean(entropy)

如果想把 L1 正则化加到损失上,那么代码如下:

lamda = tf.constant(0.8)
regularization_param = lamda*tf.reduce_sum(tf.abs(w1))

#New loss
loss +=regularization_param

对于 L2 正则化,代码如下:

lamda = tf.constant(0.8)
regularization_param = lamda*tf.nn.l2_loss(w1)

#New loss
loss +=regularization_param

你可以选择相应的损失函数或设计自己的损失函数。在损失项中也可以结合 L1 和 L2 正则化。

正则化:当有大量的输入特征时,需要正则化来确保预测模型不会 太复杂。正则化可以帮助防止数据过拟合。它也可以用来获得一个凸损失函数。有两种类型的正则化——L1 和 L2 正则化,其描述如下:

当数据高度共线时,L1 正则化也可以工作。在 L1 正则化中,与所有系数的绝对值的和相关的附加惩罚项被添加到损失函数中。L1 正则化的正则化惩罚项如下:

L2 正则化提供了稀疏的解决方案。当输入特征的数量非常大时,非常有用。在这种情况下,惩罚项是所有系数的平方之和:

其中,λ是正则化参数。

发布了52 篇原创文章 · 获赞 40 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_40519315/article/details/104388346
今日推荐