本文示例的模块版本:
python 3.6
tensorflow 1.15(会有很多警告,但不妨碍运行。另2.0很坑,API都变了T-T)
系统构建的具体步骤如下:
步骤1.使用随机的方式建立样本库。在进行标签数据的设置分类时,注意分类需要分正负(值随意):
num_points=200 # 样本数目 vectors_set=[] x1_PlotData=[] # 用于后期绘图的数据 y1_PlotData=[] x2_PlotData=[] y2_PlotData=[] for i in range(int(num_points/2)): 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,1]) # 注意标签数据的值,要有正负之分 x2 = np.random.normal(0.0, 0.55) y2 = x2 * 0.1 + 0.5 + np.random.normal(-0.03, 0.03) vectors_set.append([x2, y2,-1]) # 注意标签数据的值,要有正负之分 x1_PlotData.append(x1) y1_PlotData.append(y1) x2_PlotData.append(x2) y2_PlotData.append(y2) x1_data=[v[0] for v in vectors_set] # 使用np.mat将list转化为numpy中的矩阵格式 x2_data=[v[1] for v in vectors_set] y_data=[v[2] for v in vectors_set] |
步骤2.建立计算流图,包含 “代价函数”和“训练函数”。如下,训练函数为梯度下降:
theta=tf.Variable(np.zeros([3,1]),dtype=tf.float32) # 新建变量和占位符 x_input=tf.placeholder(tf.float32,shape=[None,3]) y_input=tf.placeholder(tf.float32,shape=[None,1])
h_theta=tf.matmul(x_input,theta) # 构建分割直线
cost=tf.reduce_mean(tf.maximum(0.0,1.0-h_theta*y_input))+0.01*tf.reduce_mean(tf.square(theta)) # 构建代价(损失)函数 optimizer = tf.train.GradientDescentOptimizer(0.2) # 选择梯度下降法,并设置步长。 train_step = optimizer.minimize(cost) |
步骤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=np.column_stack((np.ones([num_points]), np.mat(x1_data).T,np.mat(x2_data).T)) ys = np.mat(y_data).T feed = { x_input: xs, y_input: ys } sess.run(train_step, feed_dict=feed) if i % 100 == 0 : # 每训练100次,记录训练结果 print("After %d iteration:" % i) print("Theta:", sess.run(theta)) print("Cost: %f" % sess.run(cost, feed_dict=feed)) x_plot.append(i) y_plot.append(sess.run(cost, feed_dict=feed)) |
步骤5.绘制分类结果和“训练次数-代价函数值”曲线,观察训练的收敛趋势。如下:
# 打印最终结果 print("Finnally Result") print("Theta:" ,sess.run(theta)) print("Cost: %f" % sess.run(cost, feed_dict=feed))
# 绘制结果曲线 x_result=[-2,2] Theta_result=sess.run(theta) y_result=[] for x_temp in x_result: # 如果直接赋值y_result=x_result*W+b,则y_result类型为Tensor,不能直接打印 y_result.append((-Theta_result[0]-x_temp*Theta_result[1])/Theta_result[2]) plt.subplot(1,2,1) plt.scatter(x1_PlotData,y1_PlotData,c='g') plt.scatter(x2_PlotData,y2_PlotData,c='r') plt.plot(x_result,y_result,'-y') plt.subplot(1,2,2) plt.plot(x_plot,y_plot,'-') plt.show() |
输出结果大致如下:
Finnally Result Theta: [[ 3.0790575] [ 0.884045 ] [-8.339388 ]] Cost: 0.470947 |