Frank He 3/10/2018
约定数据源用椭圆形,数据池用方形,函数用同心圆,变量用圆形,loss用菱形,计算流用实线,控制流用虚线
一、一个简单的例子:线性回归
1.模型
Model图中浅绿色的部分就是要训练的模型,这个例子中为y=Ax+b的线性模型
2.TensorFlow的Code模板
- 加载库和数据集
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
from tensorflow.python.framework import ops
ops.reset_default_graph()
sess=tf.Session()
…………
- 定义节点(数据源,数据池,变量)
注意变量需要初始化,比如:
width=np.array([x[3] for x in iris.data])
length=np.array([x[0] for x in iris.data])
x0=tf.placeholder(shape=[None,1],dtype=tf.float32)#x0和y0都是一维列向量,此处不能定义为1*1矩阵
y0=tf.placeholder(shape=[None,1],dtype=tf.float32)
A=tf.Variable(tf.random_normal(shape=[1,1]))#正态随机数初始化A和b
b=tf.Variable(tf.random_normal(shape=[1,1]))
- 构建模型(线性、非线性)
- 选取损失函数(L1,L2,Psuedo-Huber,Hinge,Cross-Entroy)
- 初始化任务
init=tf.global_variables_initializer()
sess.run(init)
- 定义训练步骤
rate=0.05 #rate可以选
GDO=tf.train.GradientDescentOptimizer(rate) #也可以用其他优化器
TrainStep=GDO.minimize(loss)
- 开始训练
for i in range(100):
num=np.random.choice(len(width),size=BatchSize)
x0_rand=np.transpose([width[num]])
y0_rand=np.transpose([length[num]])
sess.run(TrainStep,feed_dict={x0:x0_rand,y0:y0_rand})
注意一下sess.run(),只有TrainStep和Loss的sess.run()需要feed
- 取回训练结果并评估
完整代码如下:
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
from sklearn import datasets
from tensorflow.python.framework import ops
ops.reset_default_graph()
sess=tf.Session()
iris=datasets.load_iris()
width=np.array([x[3] for x in iris.data])
length=np.array([x[0] for x in iris.data])
x0=tf.placeholder(shape=[None,1],dtype=tf.float32)#x0和y0都是一维列向量,此处不能定义为1*1矩阵
y0=tf.placeholder(shape=[None,1],dtype=tf.float32)
A=tf.Variable(tf.random_normal(shape=[1,1]))#正态随机数初始化A和b
b=tf.Variable(tf.random_normal(shape=[1,1]))
y=tf.add(tf.matmul(x0,A),b)#模型是y=Ax+b
loss=tf.reduce_mean(tf.square(y-y0))#误差用残差平方和计量
init=tf.global_variables_initializer()
sess.run(init)
rate=0.05
GDO=tf.train.GradientDescentOptimizer(rate)
TrainStep=GDO.minimize(loss)
losslist=[]
BatchSize=25
for i in range(100):
num=np.random.choice(len(width),size=BatchSize)#在0~len(width)之间随机采样BatchSize个数据
x0_rand=np.transpose([width[num]])#标量经过转置变为一维列向量
y0_rand=np.transpose([length[num]])
sess.run(TrainStep,feed_dict={x0:x0_rand,y0:y0_rand})#投喂训练
TempLoss=sess.run(loss,feed_dict={x0:x0_rand,y0:y0_rand})
losslist.append(TempLoss)
if((i+1)%25==0):
print('Step #'+str(i+1)+' '+str(TempLoss))
[slope]=sess.run(A)
[intercept]=sess.run(b)
bestfit=[]
for i in width:
bestfit.append(slope*i+intercept)
plt.plot(width,length,'o',label="OriginalData")
plt.plot(width,bestfit,'r-',label="BestLine")
plt.show()
plt.plot(losslist,'k-')
plt.show()
拟合效果如图:
BestLine
偏差随训练次数增加而下降:
Loss
3.讨论一下损失函数的选择
-
学习速率为0.05时,各损失函数下降曲线比较
学习速率为0.05时,各损失函数下降曲线
其中蓝色为残差平方和,绿色为绝对差和,橙色为垂直距离和,红色为交叉熵
-
学习速率为0.4时,各损失函数下降曲线比较
学习速率为0.4时,各损失函数下降曲线
网友评论