神经网络解决分类问题的4个步骤:
1.提取问题中实体的特征向量作为神经网络的输入(构建输入);
2.定义神经网络的结构,并定义如何从神经网络的输入到输出。这个过程是神经网络前向传播的过程(定义神经网络的结构)。
3.通过训练数据来调整神经网络中参数的取值,这就是训练神经网络的过程(反向传播算法)。
4.使用训练好的神经网络来预测未知的数据(测试数据)。
前向传播算法:
神经元是构建神经网络的最小单元,每个神经元也可以称为节点。神经网络的前向传播算法可以通过tf.matmul函数实现。
反向传播算法:
在神经网络优化算法中,最常用的方法是反向传播算法,在tensorflow中通过tf.train.AdamOptimizer()实现,例如train_step = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)。
Tensorflow提供了placeholder机制用于提供输入数据。placeholder相当于定义了一个位置,这个位置中的数据在程序运行时在指定。在placeholder定义时,这个位置上上的数据类型是需要指定的,同时placeholder的类型也是不可以改变的。Placeholder中数据的维度可以根据数据推导出,所以不一定要给出。在会话中执行时,需要提供一个feed_dict来指定x的取值。Feed_dict是一个字典,字典中需要给出每个用到的placeholder的取值。
训练神经网络可以分为3个步骤:
1.定义神经网络的结构和前向传播算法的结果
2.定义损失函数以及选择反向传播算法优化的算法
3.生成会话并且在训练数据集上反复运行反向传播优化算法。
下面给出了一个完整的程序来训练神经网络解决二分类问题:
- import tensorflow as tf
- #通过Numpy工具包模拟数据集
- from numpy.random import RandomState
- batch_size=8#训练数据batch的大小
- #定义神经网络的参数
- w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
- w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
- #
- 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)
- #定义损失熵和反向传播算法
- cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(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)
- #定义规则来给出样本的标签。所有x1+x2<1的样例都认为是正样本而其他的为负样本。1表示正样本;0表示负样本
- Y=[[int(x1+x2<1)] for (x1,x2) in X]
- with tf.Session() as sess:
- #初始化参数
- init_op=tf.global_variables_initializer()
- sess.run(init_op)
- print(sess.run(w1))
- print(sess.run(w2))
- STEPS=5000#设定训练的次数
- for i in range(STEPS):
- #每次选取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 step(s), cross entropy on all data is %g"%(i,total_cross_entropy))
- print(sess.run(w1))
- print(sess.run(w2))