简单的线性回归
前面五篇都是很基础的。很没有趣味。这一篇我就写一个最简单的线性回归的小小例子。只有是是十几行代码
废话不多说。
import tensorflow as tf
#1 准备数据
x = tf.random_normal(shape=[100,1])
y_1 = tf.matmul(x,[[0.8]]) + 0.7
#2 构造模型
weights = tf.Variable(initial_value=tf.random_normal(shape=[1,1]))
bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]))
y_2 = tf.matmul(x,weights) + bias
#3 构造损失函数
error = tf.reduce_mean(tf.square(y_2 - y_1))
#4 优化损失
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(error)
#变量初始化
init = tf.global_variables_initializer()
#开启会话
with tf.Session() as sess:
#初始化变量
sess.run(init)
print('训练前模型参数:权重%f,偏重%f,损失%f' %(weights.eval(), bias.eval(), error.eval()))
print('*' * 30)
#开始训练
for i in range(100):
sess.run(optimizer)
print('%f次参数:权重%f,偏重%f,损失%f' %(i,weights.eval(), bias.eval(),error.eval()))
显示结果
代码说明
x = tf.random_normal(shape=[100,1])
随机生成的谢数据。
y_1 = tf.matmul(x,[[0.8]]) + 0.7
是一个矩阵乘法x乘以0.8在家0.7
weights = tf.Variable(initial_value=tf.random_normal(shape=[1,1]))
bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]))
定义的两个变量。分别是权重和偏置。我们是initial_value=是确定初始化值
机器学习就是在不断的迭代。不断有优化变量。以达到和目标值
y_2 = tf.matmul(x,weights) + bias
和上面一句的差不多。也是一个矩阵乘法在加上一个数。
但是weights,和bias都只有一个初始值。在本例子中就是经过不断的迭代,使weights接近0.8,bias接近0.7.由于本例很简单。最后进过不断迭代后。weights=0.8,bias=0.7
error = tf.reduce_mean(tf.square(y_2 - y_1))
这一句就是损失函数。
tf.square(y_2 - y_1)
就是y_2 - y_1的平方
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(error)
是梯度下降法。还有很多方法。。根据具体情况而定。可以参考官方文档
优化损失。learning_rate=0.1是学习率
学习率如果太小训练就很慢。
如果太大。就会造成管道破裂。不能训练。
==minimize(error)==就是你要优化的对象
for i in range(100):
sess.run(optimizer)
print('%f次参数:权重%f,偏重%f,损失%f' %(i,weights.eval(), bias.eval(),error.eval()))
这一段就是训练。我们的训练次数是100次
sess.run(optimizer)
是不是感觉神奇怪不可思议。我们并没有对weights 和** bias进行迭代,为什么训练结果就是weights** 和** bias**在不断的迭代和改变
我们每训练一次就有实例化一次optimizer
然而optimizer就是优化的损失,优化的是error
error是tf.reduce_mean(tf.square(y_2 - y_1))
其中就用到了。y_2 - y_1
y_1我们确定了的。来自** tf.matmul(x,[[0.8]]) + 0.7**
但是 y_2我们确定了的。来自** tf.matmul(x,weights) + bias**。到这里我们才用到了weights和bias
然后每一次迭代。都会有一个weights和bias的值。
迭代的次数多了就不断的接近我们0.8和0.7
==print(’%f次参数:权重%f,偏重%f,损失%f’ %(i,weights.eval(), bias.eval(),error.eval()))已经在会话中了。我们在看weights,bias,error的值只需要.eval()==就可以了。
不能在开启会话。因为已经开启会话了。
很晚了。下一节我在介绍模型保存和加载。希望对你有一丢丢用。以上代码都是我子手敲的。可以运行的。我差不多是训练了45次基本接近目标值了。欢迎转载。