用tensorflow搭建简单的神经网络

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

一、材料准备

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

二、实现代码

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

《用tensorflow搭建简单的神经网络》

我解压到了如下的目录

《用tensorflow搭建简单的神经网络》

读取数据
offsettypevaluedescription
000032 bit integer0x00000801(2049)magic number (MSB first)
000432 bit integer60000number of items
0008unsigned byte??label
0009unsigned byte??label
……..

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

offsettypevaluedescription
000032 bit integer0x00000801(2049)magic number (MSB first)
000432 bit integer60000number of items
0008unsigned byte??label
0009unsigned byte??label
……..

The labels values are 0 to 9.

offsettypevaluedescription
000032 bit integer0x00000803(2051)magic number
000432 bit integer60000number of images
000832 bit integer28number of rows
001232 bit integer28number of columns
0016unsigned byte??pixel
0017unsigned byte??pixel
……..

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

offsettypevaluedescription
000032 bit integer0x00000803(2051)magic number
000432 bit integer60000number of images
000832 bit integer28number of rows
001232 bit integer28number of columns
0016unsigned byte??pixel
0017unsigned byte??pixel
……..

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

offsettypevaluedescription
000032 bit integer0x00000801(2049)magic number (MSB first)
000432 bit integer10000number of items
0008unsigned byte??label
0009unsigned byte??label
……..

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

offsettypevaluedescription
000032 bit integer0x00000801(2049)magic number (MSB first)
000432 bit integer10000number of items
0008unsigned byte??label
0009unsigned byte??label
……..

The labels values are 0 to 9.

offsettypevaluedescription
000032 bit integer0x00000803(2051)magic number
000432 bit integer10000number of images
000832 bit integer28number of rows
001232 bit integer28number of columns
0016unsigned byte??pixel
0017unsigned byte??pixel
……..

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

offsettypevaluedescription
000032 bit integer0x00000803(2051)magic number
000432 bit integer10000number of images
000832 bit integer28number of rows
001232 bit integer28number of columns
0016unsigned byte??pixel
0017unsigned 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

神经网络模型:

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

《用tensorflow搭建简单的神经网络》

训练代码:
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%左右,下次尝试用卷积神经网络来识别,识别率用改会更高一些。

《用tensorflow搭建简单的神经网络》

    原文作者:一个三要不起
    原文地址: https://www.jianshu.com/p/a499fda7427d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞