深度学习4:全连接MLP(mnist)

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值