本文示例的模块版本:
python 3.6
tensorflow 1.15(会有很多警告,但不妨碍运行。另2.0很坑,API都变了T-T)
使用随机的方法成样两个样本集,使用逻辑回归的方法对两个样本集进行分类。步骤如下:
步骤1. 建立数据源(样本库)——使用随机初始化的方式。由于需要进行逻辑分类,需要建立2个数据类,并合并在一起。如下:
num_points=1000 # 样本数目 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,0]) 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,假设函数 ,代价函数,优化算法选择梯度下降法,并设置步长:
theta=tf.Variable(np.zeros([3,1]),dtype=tf.float32) # 新建变量和占位符 x_input=tf.placeholder(tf.float32,shape=[num_points,3]) y_input=tf.placeholder(tf.float32)
h_theta=1/(1+tf.exp(-tf.matmul(x_input,theta))) # 构建假设函数
cost=-tf.reduce_mean(y_input*tf.log(h_theta)+(1-y_input)*tf.log(1-h_theta)) # 构建代价(损失)函数 optimizer = tf.train.GradientDescentOptimizer(0.99) # 选择梯度下降法,并设置步长。 train_step = optimizer.minimize(cost) |
步骤3.初始化流图:
sess = tf.Session() init = tf.global_variables_initializer() sess.run(init) |
步骤4.开始训练,同时记录训练过程:
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.输出训练结果,主要为训练参数theta和损失值(代价值):
print("Finnally Result") print("Theta:" ,sess.run(theta)) print("Cost: %f" % sess.run(cost, feed_dict=feed)) |
步骤6.在样本集中绘制训练后的直线,和“训练次数-损失”曲线,一边观察训练结果:
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: [[-10.052092] [ -2.693136] [ 27.155874]] Cost: 0.084509 |
绘制的曲线: |
虽然代价值比较大,但从途中可以看出直线已经拟合的比较好了。