应用场景
假设需要判断某工厂生产的零件是否合格,用零件的长度和质量来大致描述一个零件,这样一个物理意义上的零件就可以
被转化成长度和质量这两个数字。
特征向量是神经网络的输入,神经网络的主体结构显示在图3-2 的中间位置。目前主流的神经网络都是分层的结构,第一层是输入层,代表特征向量中每一个特征的取值。比如如果一个零件的长度是0.5 ,那么x1的值就是0.5 。同一层的节点不会相互连接,而且每一层只和下一层连接,直到最后一层作为输出层得到计算的结果。其实判断一个零件是否合格就为一个二分类问题中,神经网络的输出层往往只包含一个节点,而这个节点会输出一个实数值。通过这个输出值和一个事先设定的阀值,就可以得到最后的分类结果。以判断零件合格为例,可以认为当输出的数值大于0 时,给出的判断结果是零件合格,反之则零件不合格。一般可以认为当输出值离阔值越远时得到的答案越可靠。
在输入和输出层之间的神经网络叫做隐藏层, 一般一个神经网络的隐藏层越多,这个神经网络越“深”。
在本文的例子中采用只有一层隐藏层作为例子,以零件的昌都x1与零件的质量x2作为输入层,那么隐藏层的输入为数组[x1,x2],与每条边W1的权重构成一个2*3的矩阵,那么输入层与第一层边权值相乘得到
,那么第二层W2与第一层的输出相结合即为
,当然两项为矩阵相乘,故后面权重为3列一行才对。
import tensorflow as tf
#是一个科学计算的工具包,这里通过NumPy 工具包生成模拟数据袋。
from numpy.random import RandomState
#定义训练数据batch的大小
batch_size = 8
#定义神经网络的参数
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
#在shape 的一个维度上使用None 可以方便使用不同的batch 大小。在训练时需要把数据分
#成比较小的batch , 但是在测试时,可以一次性使用全部的数据。当数据集比较小时这样比较
#方便测试,但数据集比较大时,将大量数据放入一个batch 吁能会导致内存溢出。
x = tf.placeholder(tf.float32,shape=(None,2),name='x-input')
y_ = tf.placeholder(tf.float32,shape=(None,1),name='y-input')
#定义神经网络向前传播的过程
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
#定义损失函数和反向传播算法
#使用sigmoid 函数将y 转换为0 ~ 1 之间的数值。转换后y 代表预测是正样本的概率, 1-y 代表
#预测是负样本的概率。
y = tf.sigmoid(y)
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y,1e-10,1.0))+(1+y)*tf.log(tf.clip_by_value(1-y,1e-10,1.0)))
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
#通过随机数生成一个模拟数据集
rdm = RandomState(1)
dataSet_size = 128
X = rdm.rand(dataSet_size,2)
#定义规则来给出样本的标签。在这里所有xl+x2<1 的样例都被认为是正样本( 比如i 零件合格) ,
#而其他为负样本( 比如零件件不合格)。和Tensor Fl ow 游乐场中的表示法不大一样的地方是,
#在这里使用0 米表示负样本, 1 来表示正样本。大部分解决分类问题的神经网络都会采用
# 0 和1 的表示方法。
Y = [[int(x1+x2 < 1)] for (x1,x2) in X]
#创建一个会话运行TensorFlow程序
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
#初始化变量
sess.run(init_op)
print(sess.run(w1))
print(sess.run(w2))
'''
wl = [ [-0.81131822 , 1 . 48459876 , 0 . 06532937)
[-2 . 44270396 , 0 . 0992484 , 0 . 59122431))
w2 = [ [-0 . 81131822) , [1.48459876) , [0 . 06532937 ) )
'''
#设定训练的轮数
STEP = 5000
for i in range(STEP):
#每次选取batch_size个样本进行训练
start = (i * batch_size) % dataSet_size
end = min(start + batch_size, dataSet_size)
#通过选取的样本训练神经网络并更新参数
sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]})
if i % 1000 ==0:
#每隔一段时间计算在所有数据上的交叉熵并输出
total_cross_entropy = sess.run(cross_entropy,feed_dict={x:X,y_:Y})
print("After %d training steps(s), cross entropy on all data is %g" %(i,total_cross_entropy))
print(sess.run(w1))
print(sess.run(w2))
输出为
D:\pyBench\venv\Scripts\python.exe D:/PyBench/TensorFlow/LossFun.py
2018-12-27 11:25:39.883228: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
[[-0.8113182 1.4845988 0.06532937]
[-2.4427042 0.0992484 0.5912243 ]]
[[-0.8113182 ]
[ 1.4845988 ]
[ 0.06532937]]
After 0 training steps(s), cross entropy on all data is 5.13648
After 1000 training steps(s), cross entropy on all data is 1.00457
After 2000 training steps(s), cross entropy on all data is 0.918709
After 3000 training steps(s), cross entropy on all data is 0.906884
After 4000 training steps(s), cross entropy on all data is 0.902504
[[-0.16001855 0.6211173 1.9281734 ]
[-2.0178566 -0.402541 1.3961848 ]]
[[-0.27705878]
[ 0.67383355]
[-1.1356703 ]]
Process finished with exit code 0
首先是输出了W1与W2两个权重矩阵,之后输出了经过多次训练后的熵的逐渐减小的结果(#每隔一段时间计算在所有数据上的交叉熵并输出),最后输出的是经过该神经网络训练后权值取值多少能够最优的将预测值与实际值吻合。
代码中有注释,可以参考。