BP神经网络实现mnist分类

1.思路
使用两层隐藏层的神经网络来实现mnist分类,这里不使用卷积神经网络来处理。
两层隐藏层含有神经元数量分别为100和200。
2.代码

# -*- coding: utf-8 -*-

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

def get_data():
    mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
    return mnist

def weight_variable(shape):
    # 产生随机数
    init = tf.truncated_normal(shape,stddev = 0.1)
    return tf.Variable(init)

def bias_variable(shape):
    init = tf.constant(0.1,shape = shape)
    return tf.Variable(init)

def network(mnist):
    # 第一层隐藏层,100个神经元
    X = tf.placeholder(tf.float32,shape = [None,784])
    weight1 = weight_variable([784,100])
    bias1 = bias_variable([100])
    h1 = tf.nn.sigmoid(tf.matmul(X,weight1)+bias1)

    # 第二层隐藏层,100个神经元
    weight2 = weight_variable([100,200])
    bias2 = bias_variable([200])
    h2 = tf.nn.sigmoid(tf.matmul(h1,weight2)+bias2)

    # 输出层
    weight3 = weight_variable([200,10])
    bias3 = bias_variable([10])
    h3 = tf.nn.sigmoid(tf.matmul(h2,weight3)+bias3)

    # 配置dropout层
    keep_prob = tf.placeholder("float")
    h3_drop = tf.nn.dropout(h3, keep_prob)

    # softmax输出层
    y_predict = tf.nn.softmax(h3_drop)

    # 接受label
    y_label = tf.placeholder(dtype=tf.float32,shape = [None,10])

    # 损失函数----交叉熵函数
    loss = -tf.reduce_sum(y_label * tf.log(y_predict))

    # 优化器反向传播
    train_step = tf.train.AdamOptimizer(learning_rate=1e-3).minimize(loss)

    # 准确率
    prediction = tf.equal(tf.argmax(y_predict,1),tf.argmax(y_label,1))
    accuracy = tf.reduce_mean(tf.cast(prediction,"float"))

    # 初始化参数
    sess = tf.InteractiveSession()
    sess.run(tf.initialize_all_variables())

    # 开始训练
    for i in range(1000):
        train_set = mnist.train.next_batch(50)
        if i%100 == 0:
            train_acc = accuracy.eval(feed_dict = {X:train_set[0],y_label:train_set[1],keep_prob:1})
            print("step %d,training accuracy is %g"%(i,train_acc))
        else:
            sess.run(train_step,feed_dict={X:train_set[0],y_label:train_set[1],keep_prob:0.5})

    # 测试网络性能
    point = 0
    for i in range(10):
        test_set = mnist.test.next_batch(50)
        temp_point = sess.run(accuracy,feed_dict={X:test_set[0],y_label:test_set[1],keep_prob : 1})
        print(temp_point)
        point += temp_point
    average_point = point/10
    print("average_point:%g"%(average_point))


if __name__ =="__main__":
    mnist = get_data()
    network(mnist)

3.结果

step 0,training accuracy is 0.16
step 100,training accuracy is 0.44
step 200,training accuracy is 0.72
step 300,training accuracy is 0.86
step 400,training accuracy is 0.92
step 500,training accuracy is 0.92
step 600,training accuracy is 0.86
step 700,training accuracy is 0.86
step 800,training accuracy is 0.92
step 900,training accuracy is 0.96
0.88
0.94
0.92
0.9
0.92
0.9
0.88
0.86
0.98
0.88
average_point:0.906

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值