本篇文章主要介绍了利用张量流训练简单的二分类神经网络模型的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
利用张量流实现《神经网络与机器学习》 一书中4.7模式分类练习
具体问题是将如下图所示双月牙数据集分类。
使用到的工具:
python 3.5张量流1。2 .1 numpy matplotlib
1.产生双月环数据集
定义生成的数据(r,w,d,num):
r1=r-w/2
r2=r w/2
#上半圆
1=NP随机均匀(0,NP,num)
x _ col 1=NP。随机的。制服(R1 * NP。cos(1),R2 * NP。cos(1),num)[:np.newaxis]
x _ row 1=NP。随机的。制服(R1 * NP。sin(1),R2 * NP。sin(1),num)[:np.newaxis]
Y_label1=np.ones(num) #类别标签为一
#下半圆
2=NP随机均匀(-NP,0,num)
x _ col 2=(NP。随机的。制服(R1 * NP。cos(2),R2 * NP。cos(2),num) r)[:np.newaxis]
x _ row 2=(NP。随机的。制服(R1 * NP。sin(2),R2 * NP。sin(2),num) -d)[:np.newaxis]
Y_label2=-np.ones(num) #类别标签为-1,注意:由于采取双曲正切函数作为激活函数,类别标签不能为0
#合并
X_Col=np.vstack((X_Col1,X_Col2))
X_Row=np.vstack((X_Row1,X_Row2))
X=np.hstack((X_Col,X_Row))
Y_label=np.hstack((Y_label1,Y_label2))
Y_label.shape=(num*2,1)
返回x,Y _标签
其中r为月环半径,w为月环宽度,d为上下月环距离(与书中一致)
2.利用TensorFlow搭建神经网络模型
2.1 神经网络层添加
定义添加层(层名,输入,输入大小,输出大小,激活功能=无):
#再添加一层并返回该层的输出
用TF。variable _ scope(图层名,reuse=None):
重量=TF。get _ variable( weights ,shape=[in_size,out_size],
初始化器=TF。truncated _ normal _ initializer(stddev=0.1))
bias=TF。get _ variable( bias ,shape=[1,out_size),
初始化器=TF。truncated _ normal _ initializer(stddev=0.1))
Wx_plus_b=tf.matmul(输入,权重)偏差
如果激活_功能为无:
输出=Wx _加_b
否则:
输出=激活功能(Wx_plus_b)
返回输出
2.2 利用张量流建立神经网络模型
输入层大小:2
隐藏层大小:20
输出层大小:1
激活函数:双曲正切函数
学习率:0.1(与书中略有不同)
(具体的搭建过程可参考莫烦的视频,链接就不附上了自行搜索吧.)
# # #为网络输入定义占位符
xs=tf.placeholder(tf.float32,[None,2])
ys=tf.placeholder(tf.float32,[None,1])
###添加隐藏层
l1=add_layer(layer1 ,xs,2,20,activation_function=tf.tanh)
###添加输出层
prediction=add_layer(layer2 ,l1,20,1,activation_function=tf.tanh)
###MSE均方误差
损失=TF。reduce _均值(TF。减少总和(TF。square(ys-预测),reduction _ indexes=[1])
###优化器选取学习率设置此处学习率置为0.1
训练_步骤=TF。火车。梯度下降优化器(0.1).最小化(损失)
# # #张量流变量初始化,打开会话
init=TF。global _ variables _ initializer()#张量流更新后初始化所有变量不再用tf.initialize _ all _变量()
sess=tf .会话()
sess.run(初始化)
2.3 训练模型
###训练2000次
对于在编人员(2000年):
sess.run(train_step,feed_dict={xs: x_data,ys: y_label})
3.利用训练好的网络模型寻找分类决策边界
3.1 产生二维空间随机点
def produce_random_data(r,w,d,num):
X1=np.random.uniform(-r-w/2,2*r w/2,num)
X2=np.random.uniform(-r - w/2-d,r w/2,num)
X=np.vstack((X1,X2))
返回X.transpose()
3.2 用训练好的模型采集决策边界附近的点
向网络输入一个二维空间随机点,计算输出值大于-0.5小于0.5即认为该点落在决策边界附近(双曲正切函数)
定义收集边界数据(v_xs):
全球预测
X=np.empty([1,2])
X=列表()
对于范围内的I(len(v _ xs)):
x_input=v_xs[i]
x_input.shape=[1,2]
y_pre=sess.run(prediction,feed_dict={xs: x_input})
如果abs(y_pre - 0) 0.5:
X.append(v_xs[i])
返回np.array(X)
3.3使用numpy工具将边界附近采集的点拟合成决策边界曲线,使用matplotlib.pyplot画图。
# # #生成空间随机数据
X_NUM=produce_random_data(10,6,-4,5000)
# # #边界数据采样
X_b=收集边界数据(X_NUM)
# # #绘制数据
图=plt.figure()
ax=fig.add_subplot(1,1,1)
# # #设置坐标轴名称
plt.xlabel(x1 )
plt.ylabel(x2 )
ax.scatter(x_data[:0],x_data[:1],marker=x )
# # #最好用采样的边界数据来拟合7次的边界曲线。
z1=np.polyfit(X_b[:0],X_b[:1],7)
p1=np.poly1d(z1)
x=X_b[:0]
x.sort()
yvals=p1(x)
plt.plot(x,yvals, r ,label=边界线)
plt.legend(位置=4)
#plt.ion()
plt.show()
4.效果
5.附上源码Github链接
https://github.com/Peakulorain/Practices.git的PatternClassification.py文件
注意:让我们用softmax做分类问题.我只是把这当作一个书本练习。
(初学者水平有限,有问题请指出,大家可以轻喷)
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。