美文网首页TensorFlow技术帖
用tensorflow搭建简单的神经网络

用tensorflow搭建简单的神经网络

作者: 一个三要不起 | 来源:发表于2018-04-22 19:56 被阅读27次

之前学习神经网络时写代码用的是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%左右,下次尝试用卷积神经网络来识别,识别率用改会更高一些。

相关文章

网友评论

    本文标题:用tensorflow搭建简单的神经网络

    本文链接:https://www.haomeiwen.com/subject/fzbclftx.html