本文是在GPU版本的Tensorflow == 2.6.2 , 英伟达显卡驱动CUDA版本 ==11.6,Python版本 == 3.6, 显卡为3060的环境下进行验证实验的!!!
一、构建二维线性拟合步骤
1. 准备数据
首先使用numpy随机产生-1-1之间的100个随机数据,其代码如下:
- 代码中的 np.random.randn(*train_x.shape)语句可以等价于np.random.randn(100),这里的100是trian_X列表的长度,此处的星号作为解构操作符使用的,其他星号使用说明参考python语法:*作为函数中参数调用
- 代码中的np.random.randn()函数可以返回一个或一组服从标准正态分布的随机样本值,参考np.random.rand()函数和np.random.randn()函数说明
import tensorflow as tf
import numpy as np
train_x = np.linspace(-1,1,100)
train_y = 1 * train_x + np.random.randn(*train_x.shape)*0.3
2. 搭建模型
使用占位符构建计算图模型,由于每组数据对模型的贡献值不一致,因此需要将每个输入的 x 值乘以权重 w 再加上偏置项 b 就是该模型的输入,其构建的就是二维线性拟合模型,再初始化变量后设置保存器对象saver
代码中tf.random_normal()函数用于从服从指定正太分布的数值中取出指定个数的值,
x = tf.placeholder(dtype=tf.float32)
y = tf.placeholder(dtype=tf.float32)
w = tf.Variable(tf.random_normal([1]), name='weight')
b = tf.Variable(tf.zeros([1]), name='bias')
z = tf.multiply(x,w)+b
init_op = tf.global_variables_initializer()
saver = tf.train.Saver()
3. 反向传输
由于刚开始的权值 w 以及偏置项 b 是随机分配的,因此可能不是最合适的其正向传播生成的结果与实际结果存在一定的误差,需要将其误差反向传播给权重,使得权值和偏置项进行适当调整从而生成一个合适的值,其对应的即设置的损失函数并使用梯度下降算法进行反向传输
cost = tf.reduce_mean(tf.square(y - z)) #设置损失函数均方差
learning_rate = 0.05
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #使用梯度下降算法
4. 迭代训练模型
设置一个会话管理器,向模型中喂入一开始产生的随机100个数据进行模型训练100轮,寻找使损失函数达到最小值时的变量w、b的值,并将经其每10轮训练后的变量值输出直至结束,再保存训练后的模型相关数据
代码中zip()函数的相关解释为:
zip(a,b)方法的工作原理是创建出一个迭代器,该迭代器可产生出元组(x,y),这里的x取自数组a,而y取自数组b,当其中某个输入数组中没有元素可以继续访问迭代时,整个迭代过程结束。因此整个迭代的长度取决于最短数组长度,参考python中的zip方法详解
training_epochs = 100
display_step = 10
with tf.Session() as sess:
sess.run(init_op)
for epoch in range(training_epochs):
for (x_data, y_data) in zip(train_x, train_y):
sess.run(optimizer, feed_dict={x: x_data, y: y_data})
if epoch % display_step == 0:
loss = sess.run(cost, feed_dict={x: x_data, y: y_data})
print('Epoch:', epoch + 1, 'cost:', loss, 'w:', sess.run(w), 'b:', sess.run(b))
saver.save(sess, save_path="linear/linear.ckpt")
5. 模型预测
加载训练后的模型,重新设置输入的数据进行预测
with tf.Session() as sess:
saver.restore(sess, "linear/linear.ckpt")
print("模型的的预测值为:", sess.run(z, feed_dict={x: 0.6}))
6.模型预测结果
观察结果可以看到训练到最后其变量值区域稳定
Epoch: 0 cost: 0.0023622282 w: [0.08916096] b: [0.65734476]
Epoch: 10 cost: 0.016023537 w: [0.88322157] b: [-0.05873446]
Epoch: 20 cost: 0.016023537 w: [0.88322157] b: [-0.05873446]
Epoch: 30 cost: 0.016023537 w: [0.88322157] b: [-0.05873446]
Epoch: 40 cost: 0.016023537 w: [0.88322157] b: [-0.05873446]
Epoch: 50 cost: 0.016023537 w: [0.88322157] b: [-0.05873446]
Epoch: 60 cost: 0.016023537 w: [0.88322157] b: [-0.05873446]
Epoch: 70 cost: 0.016023537 w: [0.88322157] b: [-0.05873446]
Epoch: 80 cost: 0.016023537 w: [0.88322157] b: [-0.05873446]
Epoch: 90 cost: 0.016023537 w: [0.88322157] b: [-0.05873446]
模型的的预测值为: [0.5330086]