(1)定义TensorFlow输入节点
a.通过占位符定义[常用]:具体使用tf.placeholder函数
x=tf.placeholder("float")
b.通过字典类型定义
inputdict={
'x'=tf.placeholder("float"),
'y'=tf.placeholder("float")
}
c.直接定义
train_x = np.float32(np.linspace(-1,1,100))
(2)定义“学习参数“的变量
a.直接定义:使用tf.Variable对参数直接定义
w=tf.Variable(tf.random_normal([1]),name="weight")
b=tf.Variable(tf.zeros([1]),name="bias")
b.字典定义 【参数过多,一般使用这种】
#模型参数
paradict={
'w':tf.Variable(tf.random_normal([1])),
'b'=tf.Variable(tf.zeros([1]))
}
#计算
z=tf.multiply(X,paradict['w'])+paradict['b']
(3)定义运算
a.正向传播模型
b.定义损失函数:损失函数主要是计算”输出值“与”目标值“之间的误差,是配合反向传播使用的
(4)优化函数
(5)初始化所有变量
init=tf.global_variables_initializer()
#使用这行代码,必须再所有变量和OP定义完成后,才能保证定义的内容有效
#启动Session
with tf.Session() as sess:
sess.run(init)
(6)迭代更新参数到最优解
在迭代训练环节,都是需要建立一个session来完成的。在session中通过run来运行模型中的节点。
with tf.Session() as sess:
# 向模型输入数据
for epoch in range(training_epochs):
for (x, y) in zip(train_X, train_Y):
sess.run(optimizer, feed_dict={X: x, Y: y})
(7)测试模型:评估模型的好坏
(8)使用模型
完整代码:
mport tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
plotdata = { "batchsize":[], "loss":[] }
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)]
#生成模拟数据
train_X = np.linspace(-1, 1, 100)
train_Y = 2 * train_X + np.random.randn(*train_X.shape) * 0.3 # y=2x,但是加入了噪声
#显示模拟数据点
plt.plot(train_X, train_Y, 'ro', label='Original data')
plt.legend()
plt.show()
# 创建模型
# 占位符
X = tf.placeholder("float")#代表x的输入
Y = tf.placeholder("float")#代表对应的真实值
# 模型参数
W = tf.Variable(tf.random_normal([1]), name="weight")#初始化为[-1,1]的随机数,形状为以维的数字
b = tf.Variable(tf.zeros([1]), name="bias")
# 前向结构
z = tf.multiply(X, W)+ b
#反向优化
'''将正向生成的值,观察其与真实值的差距,再通过反向过程将里面的参数进行调整,
接着再次正向生成预测值并与真实值进行对比,以此循环下去。'''
cost =tf.reduce_mean( tf.square(Y - z))#生成值与真实值的平方差
learning_rate = 0.01#学习速率,值越大,速度越快,但是越不精确,反之
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
#训练模型----迭代
# 初始化所所有变量
init = tf.global_variables_initializer()
# 定义参数
training_epochs = 20
display_step = 2
# 启动session(Session创建好后,第一件事就是初始化)
with tf.Session() as sess:
sess.run(init)
# 向模型输入数据
for epoch in range(training_epochs):
for (x, y) in zip(train_X, train_Y):
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 ("Epoch:", epoch+1, "cost=", loss,"W=", sess.run(W), "b=", sess.run(b))#测试
if not (loss == "NA" ):
plotdata["batchsize"].append(epoch)
plotdata["loss"].append(loss)
print (" Finished!")
print ("cost=", sess.run(cost, feed_dict={X: train_X, Y: train_Y}), "W=", sess.run(W), "b=", sess.run(b))
#print ("cost:",cost.eval({X: train_X, Y: train_Y}))
#图形显示
plt.plot(train_X, train_Y, 'ro', label='Original data')
plt.plot(train_X, sess.run(W) * train_X + sess.run(b), 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 ("x=0.2,z=", sess.run(z, feed_dict={X: 0.2}))