作者:爷们郭子 | 来源:互联网 | 2023-09-07 23:22
数据见deep learning,这是一个一元输入、一元输出的线性模型,下面是具体实现过程:
import tensorflow as tf
import numpy as np
#通过numpy.loadtxt()函数解析当前目录数据x.y
x_data=np.loadtxt('./ex2x.dat')
y_data=np.loadtxt('./ex2y.dat')
#设置线性函数参数W、b
#W初始化为均匀随机数
W=tf.Variable(tf.random_uniform([1],-1.0,1.0))
#b初始化为0
b=tf.Variable(tf.zeros([1]))
#参数下输出为y_
y_=W*x_data+b
#设置损失函数
loss=tf.reduce_mean(tf.square(y_data-y_))/2
#定义梯度下降优化器 设置学习率
optimizer=tf.train.GradientDescentOptimizer(0.07)
#定义优化方法
train=optimizer.minimize(loss)#会话执行图
sess=tf.Session()
#初始化变量
init=tf.global_variables_initializer()
sess.run(init)#执行梯度下降优化
for i in range(1500):sess.run(train)if i%100==0:print sess.run(W),sess.run(b)
执行结果如下:
[0.38659847] [0.07704204]
[0.13098377] [0.41046652]
[0.09381685] [0.5863949]
[0.07821415] [0.67140335]
[0.07077159] [0.71229064]
[0.06719442] [0.73195165]
[0.06547432] [0.7414059]
[0.06464729] [0.7459518]
[0.06424948] [0.7481382]
[0.06405827] [0.7491891]
[0.06396635] [0.74969447]
[0.06392214] [0.74993736]
[0.06390087] [0.75005424]
[0.06389064] [0.7501105]
[0.0638857] [0.7501377]
当然实际过程并没有这么顺利,当我令loss=tf.reduce_mean(tf.square(y_data-y_)),学习率设为0.07时,会出现如下结果:
[0.48159832] [0.08058839]
[nan] [nan]
[nan] [nan]
[nan] [nan]
[nan] [nan]
[nan] [nan]
[nan] [nan]
[nan] [nan]
[nan] [nan]
[nan] [nan]
[nan] [nan]
[nan] [nan]
[nan] [nan]
[nan] [nan]
[nan] [nan]
但是调小学习率为0.01时却又可以收敛,由此可以看出产生nan的原因是由于learning rate 过大,那么为什么将loss除2以后就又收敛了呢,这说明learning rate 其实是与loss相对应的;之前让我百思不得其解的是,为什么学习率为0.07,而loss不除以2的时候会出现nan,但是当把loss除以2的时候就收敛了,后来发现学习率其实是乘以loss的梯度的,当loss除2的时候,相当于同等条件下学习率除2.至于产生nan的详细解释,我觉得是学习率过大,导致梯度爆炸,超出数值范围,于是显示为 nan,对于这个问题我也欢迎大家一起讨论,因为的确还存在一些疑问。