新手学习线性回归的问题
tensorflow吧
全部回复
仅看楼主
level 1
Spring_Sorrow 楼主
代码如下:
def myregression():
"""
实现线性回归预测
return: None
"""
#1、准备好特征和目标值
x = tf.random_normal([100,1],mean = 1.75,stddev = 0.5,name = 'input_data_x')
y_true = tf.matmul(x,[[0.7]]) + 0.8
#2、建立回归模型,1个特征,1个权重
w = tf.Variable(tf.random_normal([1,1],mean = 0.0,stddev = 1.0),name = 'weight')
b = tf.Variable(0.0,name='bias')
y_predict = tf.matmul(x,w) + b
#3、建立损失函数计算损失------均方误差
loss = tf.reduce_mean(tf.square(y_true-y_predict))
#4、梯度下降算法优化损失
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
#定义变量初始化op
init_op = tf.global_variables_initializer()
#通过会话运行训练过程
with tf.Session() as sess:
#初始化变量
sess.run(init_op)
while True:
sess.run(train_op)
print("value of x and w is %f %f"%(w.eval(),b.eval()))
import tensorflow as tf
if __name__ == "__main__":
myregression()
问题:
1、在上下文语句中,运行
xx = x.eval()会触发什么操作?是获取了x的值,还是重新运行了一遍张量x的赋值操作,返回了一个结果?
2、在sess中运行如下语句
sess.run(init_op)
xx = x.eval()
for i in range(100):
print(xx[i])
xx = x.eval()
for i in range(100):
print(xx[i])
return
为什么两次打印的值不一样
3、当生成训练数据时,使用了如下语句
x = tf.random_normal([100,1],mean = 1.75,stddev = 0.5,name = 'input_data_x')
y_true = tf.matmul(x,[[0.7]]) + 0.8
此时训练正常,能够训练出正常数据
但是如果改成
x = tf.random_normal([100,1],mean = 10,stddev = 0.5,name = 'input_data_x')
y_true = tf.matmul(x,[[0.7]]) + 0.8
就导致无法训练,最后训练参数很大很大
为什么?
2018年12月24日 14点12分 1
level 3
1.重新执行x操作
2.因为x每次都是随机生成,两次生成的值不一样,想得到一样的值可以加随机种子
3.mean是初始化值的平均值,stddev是方差,mean=10的时候,x初始化得到的随机值太大,而学习率0.1也很大,导致在迭代过程中梯度爆炸,所以会得到nan无效值,可以减小初始值的mean,也可以减小学习率解决,不过减小学习率意味着需要更多的计算资源,而且容易陷入局部最优,所以最好是合理的设置初始化值,初始化很重要,一般不会太大的。
2018年12月26日 03点12分 2
1