tensorflow-1. Tensorflow入门
程序员文章站
2022-07-13 13:10:24
...
Tensorflow入门
深度学习,我的通俗理解就是:系统根据用户提供的大量数据,慢慢推算出条件和结果之间的关系,这个过程叫“训练”,当训练完善后,这个系统就可以根据用户给的条件,从而推算出结果了,这就是“预测”。
这里以酸奶的浓稠度和含糖量对酸奶销量的影响为案例。设酸奶的销量为y,浓稠度为x1,含糖量为x2。我们假设他们有以下关系:
当然事先我们是不知道这个关系的,这个关系是系统根据我们给的大量数据推算出来的,推算出来后,系统就可以根据我们给的和,从而预测出销量了。
这里,我们称和为特征数据,为目标数据
1. 引入tensorflow模块
1.1. 安装
pip install tensorflow
1.2. 导入
import tensorflow as tf # tensorflow库
import numpy as np # 科学计算库
2. 准备数据集
由于这里没有数据集,我就随机产生一些数据,模拟这个案例:
# 产生随机的32行两列的数组,模拟案例中的x1和x2
X = np.random.rand(32, 2)
# 人为计算销售量,并加上一些随机上下浮动0.05,更好模拟真实情况。Y_是一个32行1列的数组
Y_ = [[(x1 + x2 + np.random.rand() / 10 - 0.05)] for (x1, x2) in X]
3. 前向传播
前向传播指的就是定义系统的一个大概模型,指出数据的计算过程。
这里的参数w1其实就是我们案例中和的系数,我们就是要让系统自己学习找到这个系数,由于我们事先不清楚正确的参数,我们就设置两个随机值好了。
# 设置占位变量x,是一个多行2列的矩阵,tf.float32类型,用来表示我们要输入给系统的特征数据
x = tf.placeholder(tf.float32, shape=(None, 2))
# 设置占位变量y,是一个多行1列的矩阵,tf.float32类型,用来表示我们要输入给系统的目标数据
y_ = tf.placeholder(tf.float32, shape=(None, 1))
# 设置参数w1,是一个随机的2行1列的矩阵,通过后面不断训练来慢慢精确这个参数
w1 = tf.Variable(tf.random_normal([2, 1], stddev=1, seed=1))
# 设置计算过程,这里设置y=x*w1,注意这里是矩阵相乘,y就是预测的目标值
y = tf.matmul(x, w1)
4. 后向传播
后向传播就是输入数据,优化w1的训练过程了。
正式训练前,还需要给系统一个训练目标和训练方法。
# 定义loss,这里采用均方误差函数。loss大体都是表示真实值与预测值的差距,也就是训练目标,loss越小越好
loss = tf.reduce_mean(tf.square(y - y_))
# 定义训练方法,这里采用梯度下降方法,学习率0.001,目标是最小化loss
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
定义好了之后,我们就可以开始正式训练了。
with tf.Session() as sess:
# 初始化所有参数,也就是w1
sess.run(tf.global_variables_initializer())
# 训练训练3000轮
for i in range(3000):
# 这里对32取余是因为一共只有32组数据,为了循环反复训练,8表示一轮训练8组数据
start = (i * 8) % 32
end = start + 8
# 开始训练,传入训练方法,特征值,目标值
sess.run(train_step, feed_dict={x: X[start:end], y_: Y_[start:end]})
# 每500次,打印一下loss值下降到多少了
if i % 500 == 0:
total_loss = sess.run(loss_mse, feed_dict={x: X, y_: Y_})
print("After %d training step(s), loss on all data is %g" % (i, total_loss))
5. 预测
训练完成之后,我们就可以拿着我们的模型去预测啦,现在我们看看我们的模型预测的准不准确。
# result就是系统根据x预测出的y值
result = sess.run(y, feed_dict={x: X})
# 并排打印出预测的result 和 真是值Y_,看看正确率如何
print("result,result_:\n", np.hstack((result, Y_)))
我这预测的还是相差不大的,哈哈?
[[0.72301422 0.71865559]
[1.27136859 1.2960012 ]
[0.74490749 0.7199052 ]
[0.74679013 0.76019734]
[0.78995933 0.81218135]
[1.65195199 1.597808 ]
[1.24874102 1.28705704]
[1.36946537 1.39100718]
[0.22747003 0.22981407]
[0.85180104 0.84842145]
[1.09721163 1.05556405]
[1.73587869 1.72872591]
[0.73553694 0.73203117]
[1.45073273 1.45101547]
[1.44788887 1.46239066]
[0.10793123 0.1587979 ]
[1.10899451 1.14675248]
[1.35090976 1.37091422]
[0.80118365 0.84230471]
[1.70304778 1.66415489]
[1.48338411 1.47217536]
[1.52690139 1.54503202]
[1.22733201 1.19195855]
[0.96426405 0.96259636]
[0.68815553 0.72996151]
[1.22227358 1.25809622]
[1.39231608 1.34931302]
[0.97089912 0.94200033]
[0.93892394 0.93816322]
[1.80368738 1.83667779]
[0.73639447 0.74155629]
[1.1033923 1.11230731]]
最后附上完整代码:点击GitHub,可以关注一下哦