开发基本步骤:
- 定义输入节点
- 定义学习参数的变量
- 定义运算
- 优化函数,优化目标
- 初始化所有变量
- 迭代更新参数到最优解
- 测试模型
- 使用模型
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
# 制造数据
train_X = np.linspace(-1,1,100)
train_Y = 2*train_X+np.random.randn(*train_X.shape)*0.3
# y =2x+b
#常见的无衬线字体有 Trebuchet MS, Tahoma, Verdana, Arial, Helvetica, 中文的幼圆、隶书等等。
plt.rcParams['font.sans-serif']=['SimHei'] #指定默认字体 SimHei为黑体
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
#创建模型
X = tf.placeholder("float")
Y = tf.placeholder("float")
W = tf.Variable(tf.random_normal([1]),name="weight")
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()
train_epochs = 20
display_step =2 #展示模型参数
def moving_average(a,w=10):
if len(a)<w:
return a[:]
return [val if i<w else sum(a[(i-w):i])/w for i,val in enumerate(a)]
with tf.Session() as sess:
sess.run(init)
pltdata = {'batchsize':[],"loss":[]}#存放批次值和损失值
# 向模型填充数据
for epoch in range(train_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'):
pltdata['batchsize'].append(epoch)
pltdata['loss'].append(loss)
print('完成了。')
print('cost=',sess.run(cost,feed_dict={X:train_X,Y:train_Y}),'W=',sess.run(W),'b=',sess.run(b))
plt.plot(train_X, train_Y, 'ro', label='原始数据')
plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='fiitedline')
plt.legend()
plt.show()
pltdata["avgloss"] = moving_average(pltdata["loss"])
plt.figure(1)
plt.subplot(211)
plt.plot(pltdata['batchsize'], pltdata['avgloss'], 'b--')
plt.xlabel("minibatch number")
plt.ylabel("Loss")
plt.title('minibatch run vs.training loss')
plt.show()
#使用模型预测
print(sess.run(z,feed_dict={X:0.2}))
随着不断训练,损失值越来越低,最后趋于平稳。
损失函数用于计算输出值与目标值之间的误差,用于反向传播是计算梯度使用,损失函数必须是可导的。损失函数使用tensorflow的就可以。
优化函数也是使用tensorflow有的几种就可以