深度学习 | BP算法

深度学习 | BP算法

BP算法实现

# -*- coding: UTF-8 -*-

"""
    TensorFlow实现BP神经网络
    手写数字识别
"""

import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib as mpl
import matplotlib.pyplot as plt

from tensorflow.examples.tutorials.mnist import input_data

# 构建BP
def bp(x, y):
    hidden1_size = 256  # 第一层hidden中神经元数目
    hidden2_size = 128  #

    # 初始化w和b
    weights = {
        'w1': tf.Variable(tf.random_normal(shape=[input_size, hidden1_size], stddev=0.1)),
        'w2': tf.Variable(tf.random_normal(shape=[hidden1_size, hidden2_size], stddev=0.1)),
        'out': tf.Variable(tf.random_normal(shape=[hidden2_size, classes_size], stddev=0.1))
    }

    biases = {
        'b1': tf.Variable(tf.random_normal(shape=[hidden1_size], stddev=0.1)),
        'b2': tf.Variable(tf.random_normal(shape=[hidden2_size], stddev=0.1)),
        'out': tf.Variable(tf.random_normal(shape=[classes_size], stddev=0.1))
    }

    layer1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['w1']), biases['b1']))
    layer2 = tf.nn.sigmoid(tf.add(tf.matmul(layer1, weights['w2']), biases['b2']))
    actual = tf.add(tf.matmul(layer2, weights['out']), biases['out'])
    return actual

if __name__ == '__main__':
    mnist = input_data.read_data_sets('../data', one_hot=True)

    train_images = mnist.train.images
    train_labels = mnist.train.labels

    learn_rate = 0.01

    input_size = train_images.shape[1]
    classes_size = train_labels.shape[1]

    x = tf.placeholder(tf.float32, shape=[None, input_size], name='x')
    y = tf.placeholder(tf.float32, shape=[None, classes_size], name='y')

    actual = bp(x, y)
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=actual, labels=y))
    train = tf.train.GradientDescentOptimizer(learning_rate=learn_rate).minimize(loss)
    predict = tf.equal(tf.argmax(actual, axis=1), tf.argmax(y, axis=1))
    accuracy = tf.reduce_mean(tf.cast(predict, tf.float32))

    init = tf.global_variables_initializer()
    batch_size = 100
    display_step = 4
    with tf.Session() as session:
        session.run(init)

        # 模型保存
        saver = tf.train.Saver()
        epoch = 0
        while True:
            avg_cost = 0
            total_batch = int(mnist.train.num_examples / batch_size)
            for i in range(total_batch):
                batch_xs, batch_ys = mnist.train.next_batch(batch_size)
                feeds = {x: batch_xs, y: batch_ys}
                session.run(train, feed_dict=feeds)
                avg_cost += session.run(loss, feed_dict=feeds)
            avg_cost = avg_cost / total_batch

            if (epoch + 1) % display_step == 0:
                print('次数:%03d 损失函数值:%.9f' % (epoch, avg_cost))
                feeds = {x: mnist.train.images, y: mnist.train.labels}
                train_accuracy = session.run(accuracy, feed_dict=feeds)
                print('训练集准确率:%.3f' % train_accuracy)

                feeds = {x: mnist.test.images, y: mnist.test.labels}
                test_accuracy = session.run(accuracy, feed_dict=feeds)
                print('测试集准确率:%.3f' % test_accuracy)

                if train_accuracy > 0.95 and test_accuracy > 0.95:
                    saver.save(session, 'mnist/model')
                    break
            epoch += 1
        writer = tf.summary.FileWriter('mnist/graph', tf.get_default_graph())
        writer.close()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容