BP算法:由信号的正向传播和误差的反向传播两个过程组成。
正向传播时,输入样本从输入层进入网络,经隐层逐层传递至输出层,如果输出层的实际输出与期望输出(导师信号)不同,则转至误差反向传播;如果输出层的实际输出与期望输出(导师信号)相同,结束学习算法。
反向传播时,将输出误差(期望输出与实际输出之差)按原通路反传计算,通过隐层反向,直至输入层,在反传过程中将误差分摊给各层的各个单元,获得各层各单元的误差信号,并将其作为修正各单元权值的根据。这一计算过程使用梯度下降法完成,在不停地调整各层神经元的权值和阈值后,使误差信号减小到最低限度。
权值和阈值不断调整的过程,就是网络的学习与训练过程,经过信号正向传播与误差反向传播,权值和阈值的调整反复进行,一直进行到预先设定的学习训练次数,或输出误差减小到允许的程度。
全连接存在的问题:
1、需要训练的参数过多
2、容易过拟合
查看mnist的代码如下:
import tensorflow.examples.tutorials.mnist.input_data as input_data
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
import numpy as np
from PIL import Image
print(type(mnist.train.images))
print(mnist.train.images.shape)
print(mnist.train.labels.shape)
img_data = np.array(np.reshape(mnist.train.images[1],(28,28))*255,dtype=np.int8)
img = Image.fromarray(img_data,"L")
img.show()
arr_data = mnist.train.labels[1]
print(np.argmax(arr_data))
MLP代码如下:
import tensorflow.examples.tutorials.mnist.input_data as input_data
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
import numpy as np
class MLPNet:
def __init__(self):
self.x = tf.placeholder(dtype=tf.float32,shape=[None,784])
self.y = tf.placeholder(dtype=tf.float32,shape=[None,10])
self.in_w = tf.Variable(tf.truncated_normal(shape=[784,100],stddev=tf.sqrt(2/100)))
self.in_b = tf.Variable(tf.zeros([100]))
self.out_w = tf.Variable(tf.truncated_normal(shape=[100,10],stddev=tf.sqrt(2/10)))
self.out_b = tf.Variable(tf.zeros(10))
def forward(self):
self.fc1 = tf.nn.relu(tf.matmul(self.x,self.in_w)+self.in_b)
self.output = tf.nn.softmax(tf.matmul(self.fc1,self.out_w)+self.out_b)
def backward(self):
self.loss = tf.reduce_mean((self.output-self.y)**2)
self.opt = tf.train.AdamOptimizer().minimize(self.loss)
if __name__ == '__main__':
net = MLPNet()
net.forward()
net.backward()
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for epoch in range(1000000):
xs,ys = mnist.train.next_batch(100)
_loss,_ = sess.run([net.loss,net.opt],feed_dict={net.x:xs,net.y:ys})
# print(_loss)
if epoch % 100 == 0:
test_xs,test_ys = mnist.test.next_batch(10)
test_output = sess.run(net.output,feed_dict={net.x:test_xs})
test_y = np.argmax(test_ys,axis=1)
test_out = np.argmax(test_output,axis=1)
print("精度:",np.mean(np.array(test_y==test_out,dtype=np.float32)))
print("标签:",test_y,"结果:",test_out)