用tensorflow搭建简单的神经网络

之前学习神经网络时写代码用的是C++ 写的,代码冗长而且容易出错。现在学了Python发现用Python-tensorflow写神经网络代码非常的简洁。

一、材料准备

Python 3.5,可通过官网下载
tensorflow,可用pip install tensorflow 命令安装
Pycharm 2017,百度有一大堆破解教程
MNIST数据集,下载地址

二、实现代码

先把下载到的这几个压缩包解压出来:


我解压到了如下的目录

读取数据
offset type value description
0000 32 bit integer 0x00000801(2049) magic number (MSB first)
0004 32 bit integer 60000 number of items
0008 unsigned byte ?? label
0009 unsigned byte ?? label
........

数据的内容格式如下:
训练标签数据(labels-idx1-ubyte):

offset type value description
0000 32 bit integer 0x00000801(2049) magic number (MSB first)
0004 32 bit integer 60000 number of items
0008 unsigned byte ?? label
0009 unsigned byte ?? label
........

The labels values are 0 to 9.

offset type value description
0000 32 bit integer 0x00000803(2051) magic number
0004 32 bit integer 60000 number of images
0008 32 bit integer 28 number of rows
0012 32 bit integer 28 number of columns
0016 unsigned byte ?? pixel
0017 unsigned byte ?? pixel
........

训练图像数据 (images-idx3-ubyte):

offset type value description
0000 32 bit integer 0x00000803(2051) magic number
0004 32 bit integer 60000 number of images
0008 32 bit integer 28 number of rows
0012 32 bit integer 28 number of columns
0016 unsigned byte ?? pixel
0017 unsigned byte ?? pixel
........

Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).

offset type value description
0000 32 bit integer 0x00000801(2049) magic number (MSB first)
0004 32 bit integer 10000 number of items
0008 unsigned byte ?? label
0009 unsigned byte ?? label
........

测试标签数据 (t10k-labels-idx1-ubyte):

offset type value description
0000 32 bit integer 0x00000801(2049) magic number (MSB first)
0004 32 bit integer 10000 number of items
0008 unsigned byte ?? label
0009 unsigned byte ?? label
........

The labels values are 0 to 9.

offset type value description
0000 32 bit integer 0x00000803(2051) magic number
0004 32 bit integer 10000 number of images
0008 32 bit integer 28 number of rows
0012 32 bit integer 28 number of columns
0016 unsigned byte ?? pixel
0017 unsigned byte ?? pixel
........

测试图像数据 (t10k-images-idx3-ubyte):

offset type value description
0000 32 bit integer 0x00000803(2051) magic number
0004 32 bit integer 10000 number of images
0008 32 bit integer 28 number of rows
0012 32 bit integer 28 number of columns
0016 unsigned byte ?? pixel
0017 unsigned byte ?? pixel
........

Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).

读取数据代码:
def read_train_data():
    file = open('mnist_data/images-idx3-ubyte','rb')
    '''
        跳过了魔术码(4 byte)
        图像数量读取(4 byte)
        行(4 byte)、列(4 byte)
    '''
    file.seek(4*4)
    img = []
    for i in range(60000):
        tmp = []
        for j in range(784):
            t = struct.unpack('b',file.read(1))
            if t[0] > -1:
                tmp.append(0)
            else:
                tmp.append(1)
        img.append(tmp)

    file = open('mnist_data/labels-idx1-ubyte','rb')
    
    '''
        跳过了魔术码(4 byte)
        标签数量(4 byte)
    '''

    file.seek(4*2)
    label = []
    for i in range(60000):
        t = struct.unpack('b', file.read(1))
        tmp = []
        for j in range(10):
            if t[0] == j:
                tmp.append(1)
            else:
                tmp.append(0)
        label.append(tmp)
    return img,label

神经网络模型:

我要构建的神经网络模型如下:

训练代码:
if __name__ == "__main__":
    x = tf.placeholder("float", [None, 784])
    w1 = tf.Variable(tf.random_uniform([784, 120], -1.0, 1.0))
    b1 = tf.Variable(tf.random_uniform([120], -1.0, 1))
    w2 = tf.Variable(tf.random_uniform([120, 10], -1.0, 1.0))
    b2 = tf.Variable(tf.random_uniform([10], -1.0, 1.0))

    hid = tf.nn.sigmoid(tf.matmul(x, w1) + b1)

    output = tf.nn.softmax(tf.matmul(hid, w2) + b2)

    output_ = tf.placeholder("float", [None, 10])

    cross_entropy = -tf.reduce_sum(output_ * tf.log(output))
    train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

    init = tf.initialize_all_variables()
    sess = tf.Session()
    sess.run(init)

    IMG, LABEL = read_train_data()
    # 训练200次
    for i in range(200):
        j = 0
        while j < 60000:
            batch_xs, batch_ys = get_batch(IMG, LABEL, j, 100)
            sess.run(train_step, feed_dict={x: batch_xs, output_: batch_ys})
            j += 100

    W1 = sess.run(w1)
    W2 = sess.run(w2)
    B1 = sess.run(b1)
    B2 = sess.run(b2)
    # 把神经网络模型参数保存下来
    save_para(W1,W2,B1,B2)
    sess.close()

测试代码:

import tensorflow as tf
import struct

def restore_para():
    W1 = []
    W2 = []
    B1 = []
    B2 = []
    #   载入weight
    file = open('mnist_para/w1', 'rb')
    for i in range(784):
        tmp = []
        for j in range(120):
            t = struct.unpack("f", file.read(4))
            tmp.append(t[0])
        W1.append(tmp)
    file.close()

    file = open('mnist_para/w2', 'rb')
    for i in range(120):
        tmp = []
        for j in range(10):
            t = struct.unpack("f", file.read(4))
            tmp.append(t[0])
        W2.append(tmp)
    file.close()
    #   载入bias
    file = open('mnist_para/b1', 'rb')
    for i in range(120):
        t = struct.unpack('f', file.read(4))
        B1.append(t[0])
    file.close()

    file = open('mnist_para/b2', 'rb')
    for i in range(10):
        t = struct.unpack('f', file.read(4))
        B2.append(t[0])
    file.close()

    w1 = tf.constant(W1)
    b1 = tf.constant(B1)
    w2 = tf.constant(W2)
    b2 = tf.constant(B2)

    return w1, b1, w2, b2

def read_test_data():
    file = open('mnist_data\\t10k-images-idx3-ubyte', 'rb')
    file.seek(4 * 4)
    img = []
    for i in range(10000):
        tmp = []
        for j in range(784):
            t = struct.unpack('b', file.read(1))
            if t[0] > -1:
                tmp.append(0)
            else:
                tmp.append(1)
        img.append(tmp)

    file = open('mnist_data\\t10k-labels-idx1-ubyte', 'rb')
    file.seek(4 * 2)
    label = []
    for i in range(10000):
        t = struct.unpack('b', file.read(1))
        tmp = []
        for j in range(10):
            if t[0] == j:
                tmp.append(1)
            else:
                tmp.append(0)
        label.append(tmp)

    return img, label

if __name__ == "__main__":

    x = tf.placeholder("float",[None,784])

    w1, b1, w2, b2 = restore_para()

    hid = tf.nn.sigmoid(tf.matmul(x,w1)+b1)
    output = tf.nn.softmax(tf.matmul(hid,w2)+b2)

    output_ = tf.placeholder("float",[None,10])

    init = tf.initialize_all_variables()
    sess = tf.Session()
    sess.run(init)

    IMG, LABEL = read_test_data()

    correct_prediction = tf.equal(tf.argmax(output, 1), tf.argmax(output_, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
    print("识别率:")
    print(sess.run(accuracy, feed_dict={x: IMG, output_:LABEL}))

    sess.close()

最后的识别率能达到95.93%左右,下次尝试用卷积神经网络来识别,识别率用改会更高一些。

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容