Tensorflow学习第二天

TensorFlow损失函数

线性回归

#定义全局变量
m=1000
n=15
p=2
 
#标准线性回归
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*W0+W1
#计算loss
loss=tf.square(Y-Y_hat,name='loss')
 
#多元线性回归
X=tf.placeholder(tf.float32,name='X',shape=[m,n])#多个输入
Y=tf.placeholder(tf.float32,name='Y')#一个输出
W0=tf.Variable(tf.random_normal([n,1]))
W1=tf.Variable(0.0)
Y_hat=tf.matmul(X,W0)+W1
loss=tf.reduce_mean(tf.square(Y-Y_hat),name='loss')

逻辑回归

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

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=dtf.matmul(X*W1)+W0 #[m,p]形式
entropy=tf.nn.softmax_cross_entropy_with_logits(Y_hat,Y) #求单loss
loss=tf.redduce_mean(entropy) #求平均

正则化

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=dtf.matmul(X*W1)+W0 #[m,p]形式
entropy=tf.nn.softmax_cross_entropy_with_logits(Y_hat,Y) #求单loss
loss=tf.reduce_mean(entropy) #求平均
 
#L1正则化
lamda=tf.constant(0.8)#系数
param=lamda*tf.reduce_sum(tf.abs(W1))#对权重张量的每个元素求和
loss+=prama #new loss
 
#L2正则化
lamda=tf.constant(0.8)#系数
prama=lamda*tf.nn.l2_loss(W1)#对权重张量的每一个元素平方,然后求和,最后乘1/2
loss+=prama #new loss

TensorFlow优化器使用

函数在一阶导数为零的地方达到其最大值和最小值。梯度下降算法基于相同的原理,即调整系数(权重和偏置)使损失函数的梯度下降.

首先确定想用的优化器。

optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01)
# learning_rate 参数可以是一个常数或张量,值介于0-1之间。
 
#必须为优化器给定要优化的函数minimize,实现loss最小化。该方法计算梯度并将梯度应用于系数的学习。
train_step=optimizer.minimize(loss)
 
with tf.Session() as sess:
 sess.run(train_step)

梯度下降中的另一个变化是增加了动量项,如:

optimizer=tf.train.MomentumOptimizer(learning_rate=0.01,momentum=0.5).minimize(loss)

衰减学习率

通常建议从较大学习率开始,并在学习过程中将其降低。这有助于对训练进行微调,可以使用 TensorFlow 中的 tf.train.exponential_decay 方法来实现这一点。

变量

  • earning_rate:标量float32或float64张量或者Python数字。初始学习率。
  • global_step:标量int32或int64张量或者Python数字。指一次epoch的总共迭代次数,值是等于图像数量/batchsize,用于衰减计算的全局步数,非负。
  • decay_steps:标量int32或int64张量或者Python数字。也是指迭代次数,当迭代decay_step次后,改变一次学习率,正数。
  • decay_rate:标量float32或float64张量或者Python数字。衰减率。
  • staircase:布尔值。若为真则以离散的间隔衰减学习率。
  • name:字符串。可选的操作名。默认为ExponentialDecay。

返回

与learning_rate类型相同的标量张量,即衰减的学习率。

global_step=tf.Variable(0,trainable=false)
initial_learning_rate=0.2
learning_rate=tf.train.exponential_decay(initial_learning_rate,global_step,decay_steps=100000,decay_rate=0.95,staircase=True)

TensorFlow实现简单线性回归

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt #绘图
 
#为了使训练有效,输入应该被归一化,所以定义一个函数来归一化输入数据.
def normalize(X)
 mean=np.mean(X)#计算全局平均值
 std=np.std(X) #计算全局标准差
 X=(X-mean)/std#标准化:对原始数据进行变换到均值为0,标准差为1范围内
 return X
 
#Boston房屋价格数据集中data即为特征变量,target为目标变量。选取data中的RM,target是MEDV变量进行单变量线性回归
#使用TensorFlow contrib数据集加载波士顿房价数据集,并将其分解为 X_train 和 Y_train。可以对数据进行归一化处理:
boston=tf.contrib.learn.datasets.load_dataset('boston')
X_train,Y_train=boston.data[:,5],boston.target #X_train第六列全部数据
X_train=normalize(X_train)
n_sample=len(X_train)
 
#为训练数据声明 TensorFlow 占位符:
X=tf.placeholder(tf.float32,name='X')
Y=tf.placeholder(tf.float32,name='Y')
 
#创建 TensorFlow 的权重和偏置变量且初始值为零:
b=tf.Variable(0.0)
w=tf.Variable(0.0)
 
#定义用于预测的线性回归模型
Y_hat=X*w+b
 
#定义损失函数
loss=tf.square(Y-Y_hat,name='loss')
 
#选择梯度优化器
tf.train.GredientDescentOptimizer(learning_rate=0.01).minimize(loss)
 
#初始化操作符:
init_op=tf.globle_variables_initializer()
total=[]
 
#计算图
with tf.Session() as sess:
 sess.run(init_op)
 writer=tf.summary.FileWriter('graphs',sess.graph)
 for i in range(100):
   total_loss=0
   for x,y in zip(X_Train,Y_train) 
     _,l=sess.run([optimizer,loss],feed_dict={X:x,Y=y}) #返回一次迭代的loss为l
     total_loss+=l #total_loss为总的loss值
   total.append(total_loss/n_sample) #n_sample为迭代次数,这里默认为len,即batch_size=1
   print('Epoch{0}:Loss{1}'.format(i,total_loss/n_sample))  
writer.close()
b_value,w_value=sess.run([b,w])
 
#查看结果
Y_pred=X_train*w_value+b_value
pringt('done')
plt.plot(X_train,Y_train,label='real data')
plt.plot(X_train,Y_pred,label='predict data')
plt.legend()#给图加上图例,没有参数则根据lable自动识别
plt.show()
plt.plot(total)
plt.show()

posted @ 2022-04-04 08:00  Gazikel  阅读(19)  评论(0编辑  收藏  举报