本文主要借鉴并综合了以下两个博客的内容(样本生成和流图构建训练),并在其基础上绘制了拟合后的直线和“训练次数-代价函数值”曲线,可更直观的观察训练效果:
https://www.cnblogs.com/xianhan/p/9090426.html
https://www.cnblogs.com/selenaf/p/9102398.html
具体步骤如下:
步骤1.在很多情况下,初学者都没有样本库,一般可自建样本库。使用random函数随机初始化样本库:
num_points=1000 # 生成的样本数 vectors_set=[] # 初始化样本集,为空 for i in range(num_points): x1=np.random.normal(0.0,0.55) #横坐标,进行随机高斯处理化,以0为均值,以0.55为标准差 y1=x1*0.1+0.3+np.random.normal(-0.03,0.03) #纵坐标,数据点在y1=x1*0.1+0.3上小范围浮动 vectors_set.append([x1,y1])
# 将样本集分为输入集x_data和输出集y_data x_data=[v[0] for v in vectors_set] y_data=[v[1] for v in vectors_set]
# 绘制散点图,查看生成样本的分布情况 plt.scatter(x_data,y_data,c='r') plt.show() |
步骤2.建立计算流图,包含“假设函数”“代价函数”和“训练函数”。如下,训练函数为梯度下降:
x = tf.placeholder(tf.float32) W = tf.Variable(tf.zeros([1])) b = tf.Variable(tf.zeros([1])) y_ = tf.placeholder(tf.float32)
y = W * x + b
lost = tf.reduce_mean(tf.square(y_-y)) # 设置代价函数 optimizer = tf.train.GradientDescentOptimizer(0.01) # 设置梯度下降及其步长0.01 train_step = optimizer.minimize(lost) |
步骤3.初始化流图,主要是初始化运行环境。如:
sess = tf.Session() init = tf.global_variables_initializer() sess.run(init) |
步骤4.开始训练:向占位符中输入数据,使用sess.run()方法进行训练。如下:
x_plot=[] y_plot=[] steps = 2000 # 训练的步数 for i in range(steps): xs = x_data ys = y_data feed = { x: xs, y_: ys } # 向占位符中输入数据 sess.run(train_step, feed_dict=feed) if i % 50 == 0 : print("After %d iteration:" % i) # print(xs,ys) print("W: %f" % sess.run(W)) # 查看当前训练的W值 print("b: %f" % sess.run(b)) print("lost: %f" % sess.run(lost, feed_dict=feed)) if i>200: x_plot.append(i) y_plot.append(sess.run(lost, feed_dict=feed)) |
步骤5.绘制“训练次数-代价函数值”曲线,观察训练的收敛趋势。如下:
x_result=[-2,2] W_result=sess.run(W) b_result=sess.run(b) y_result=[] for x_temp in x_result: # 如果直接赋值y_result=x_result*W+b,则y_result类型为Tensor,不能直接打印 y_result.append(x_temp*W_result+b_result) plt.subplot(1,2,1) plt.scatter(x_data,y_data,c='r') plt.plot(x_result,y_result,'-y') plt.subplot(1,2,2) plt.plot(x_plot,y_plot,'-') plt.show() |
输出结果大致如下:
打印结果(最后一次): After 1950 iteration: W: 0.102901 b: 0.270892 lost: 0.000836 |