tensorflow自主学习入门-从零开始篇(一)
本文所有源码及资源都会附在文末,大家各取所需。
- 本文提到的图书源码来自github https://github.com/amusi/TensorFlow-From-Zero-To-One 感谢作者amusi 的分享* 下文有百度云盘源码分享
自己学习tensorlfow已经有一段时间,但是一直停留在入门的边缘,没有办法真正的学习到一定的知识,非常羡慕已经学有所成的人(比如这个B站的视频)
一直没有什么突破,最近有一定的突破与感悟,分享出来,希望对各位有所帮助。
目前我的学习路径是根据由李金洪所著的《深度学习之TensorFlow》感觉非常详细,也非常不错,但是内容一定需要反复琢磨。本文的例子就是书上的第三单元 “线性回归”全部实现代码的详细解答(详细的解释在代码中可看到)。当然,本文讲解的是最终的代码结果,所以各位还是有必要认真的读完第三章的内容,然后结合理解阅读本文。本实例为 “监督学习”,简而言之就是,我们清楚的知道模型(也就是y=2x)并用此引导不知道模型的 “机器” 调整(y=w*x+b)这一模型中的 (w) 与(b)来接近答案
1.第一步
import 所需要的库
分别是:tensorflow用于生成神经节点、numpy用于生成训练数据、matplotlib用于可视化的展示
import tensorflow as tf #tensorflow库
import numpy as np #numpy用于随机产生数据,当然numpy的功能很强,本实例中仅仅用于生成数据
import matplotlib.pyplot as plt
2.第二步
def moving_average(a, w=10):
if len(a) < w:
return a[:]
return [val if idx < w else sum(a[(idx-w):idx])/w for idx, val in enumerate(a)]
3.第三步
使用numpy生成数据,并使用matplotlib用点图的方式展示出来
# 数据准备
# 训练数据x
train_X = np.linspace(-1, 1, 100) #numpy中 linspace的作用是将(-1,1)分为100个数
# 训练标签y,y=2x,但是加入了噪声(噪声即为加入一定的人为误差使数据不是那么精确)
train_Y = 2 * train_X + np.random.randn(*train_X.shape) * 0.3
# *train_x.shape 与 train_x.shape[0] 的结果是一致的 在这里是 100 这么做的目的是确保100个train_X有 100 个b与之对应,以此生成相关的100 个train_Y , 而可能你已经注意到了 w 直接给出了他的正确值(2)这是为了让所有的数据更加接近(y=2x)直线,降低我们的学习曲线
# 以train_X为横坐标以train_Y为纵坐标做图,显示模拟数据点。
plt.plot(train_X, train_Y, 'ro', label="Original data")
# 展示出每个数据对应的名称
plt.legend()
# 显示整个图像
plt.show()
4.第四步
从这一步开始,我们开始构建真正的模型,也就是设置y = wx + b中的可变量w与b,让他们可以根据结果调整接近真实的值。
#### 创建模型
#placeholder是占位符的意思,在tensorflow中类似于函数参数,在执行的时候再赋具体的值。
# 分别设置训练 x,y占位符。
X = tf.placeholder(dtype="float32", name="x") #dtype 用来定义它的“形状”
Y = tf.placeholder(dtype="float32", name="y")
# 模型参数
# tf.Variable(initializer,name),参数initializer是初始化参数
#tf.random_normal()函数用于从服从指定正太分布的数值中取出指定个数的值。
weight = tf.Variable(tf.random_normal([1]), name="weight")
bias = tf.Variable(tf.zeros([1]), name="bias")
5.第五步
# 前向结构
y_pre = tf.multiply(X, weight) + bias
反向优化
损失值计算,这里使用了预测值减真值然后平方的形式来表示预测值与真值的近似程度
cost = tf.reduce_mean(tf.square(Y - y_pre))
学习率,用于控制参数调整的速度,这一部分书上的解释非常形象
learning_rate = 0.01
优化器,封装好的一个梯度下降算法
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
初始化变量,tf与python正常开发不同的是所有的变量在使用之前需要进行初始化变量,是由于tf因为数据的流动(w , b)的变化需要存储
init = tf.global_variables_initializer()
迭代训练
训练参数
将所有数据训练的轮数
training_epochs = 20
每隔几个epoch展示一次数据,也就是print以此目前的情况
display_step = 2
***
#### 6.第六步
开启Session
with tf.Session() as sess:
初始化变量,init我们上面定义好的全局变量,使用sess.run()初始化
sess.run(init)
plotdata = {"batchsize":[], "loss":[]}
# 训练所有的数据
#开始循环
for epoch in range(training_epochs):
# zip:打包为元组的列表,train_X,train_Y就是我们上面定义好的
for (x, y) in zip(train_X, train_Y):
# 开始训练,optimizer就是我们上面定义好的一个tf函数,tensorflow有趣的就是他的各个数据是环环相扣的,所以我们这里只需要调用optimizer,并使用feed_dict传入我们的原始数据即可
sess.run(optimizer, feed_dict={X:x, Y:y})
# 显示训练中的详细信息,我们上面调整的参数是每两次展示一次
if epoch % display_step == 0:
loss = sess.run(cost, feed_dict={X:train_X, Y:train_Y})
print(f"Epoch: {epoch+1}; loss: {loss}; weight: {sess.run(weight)};"
f" bias= {sess.run(bias)}")
if not loss == "NA":
plotdata["batchsize"].append(epoch)
plotdata["loss"].append(loss)
print("Finished!")
print(f"loss: {cost.eval(feed_dict={X:train_X, Y:train_Y})}; weight: {weight.eval()}; bias: {bias.eval()}")
***
#### 7.第七步
注意,接下来的所有均在with tf.Session() as sess:这个语句中,分段讲解的目的是让思路更加清晰,整体代码还需要下载完整的来进一步分析。
*第七步的主要作用就是让我们的数据(训练数据和训练结果)通过图像的方式来展示*
图形化显示
plt.plot(train_X, train_Y, "ro", label="Original data")
plt.plot(train_X, sess.run(weight) * train_X + sess.run(bias), label="Fitted line")
plt.legend()
plt.show()
plotdata["avgloss"] = moving_average(plotdata["loss"])
plt.figure(1)
plt.subplot(211)
plt.plot(plotdata["batchsize"], plotdata["avgloss"], "b--")
plt.xlabel("Minibatch number")
plt.ylabel("Loss")
plt.title("Minibatch run vs. Training loss.")
plt.show()
print(f"x=0.2, y_pre={sess.run(y_pre, feed_dict={X:0.2})}")
最后,我想说tensorflow的学习需要不断的总结与沉淀,很难一蹴而就,所以可能大家看完本文以后感觉收获甚少,这就需要反复的分析,包括读这一本书,个人观点是,目前的中文tensorflow系统学习中,李金洪所著的《深度学习之TensorFlow》最为靠谱,而视频课程还是难以消化,可以留在学习渐入佳境以后再去观看。
***
最后,附上资源:
由于版规,图书+源码资源已经转至电子书区,大家可以前去食用。
本文源码:
链接: https://pan.baidu.com/s/1w8QWmfMIUjqUhW_fRFd5gw 提取码: 2333
***
感谢大家观看,有用可以点击喜欢支持一下,谢谢。