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

网友评论