基于MNIST设计神经网络识别手写数字
这个项目只用了MNIST的数据集,官网地址是这个点击打开链接。基于tensorflow设计神经网络,网络结构只设计了两层,以后会继续优化。升级版做出来了,链接->基于MNIST设计神经网络识别手写数字(version 2 CNN结构)
1.所有文件
2.主要代码
(1)设计神经网络模块(Network.py)
import random
import numpy as np
from PIL import Image, ImageFilter
import tensorflow as tf
import matplotlib.pyplot as plt
class Network(object):
"""docstring for Network"""
def __init__(self, sizes):
def add_layer(self, inputs, in_size, out_size, activation_function=None):
Weights = tf.Variable(tf.random_normal([in_size, out_size]))
biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
Wx_plus_b = tf.matmul(inputs, Weights) + biases
if activation_function is None:
outputs = Wx_plus_b
else:
outputs = activation_function(Wx_plus_b)
return outputs
def start(self, training_inputs, training_results, epochs, batch_size, testimage):
print(np.shape(training_inputs))
print(np.shape(training_results))
xs = tf.placeholder(tf.float32, [None,784])
ys = tf.placeholder(tf.float32, [None,10])
predition = self.add_layer(xs, 784, 10, activation_function=tf.nn.softmax)
cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(predition), reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
for j in range(epochs):
# 注意不要对训练数据x,y直接使用random.shuffle(),这会是data和label对不上
# random.shuffle(training_inputs)
# random.shuffle(training_results)
j = j % 499
mini_data = training_inputs[j*batch_size:(j+1)*batch_size]
tmp0 = np.reshape(mini_data, [-1,784])
mini_results = training_results[j*batch_size:(j+1)*batch_size]
tmp1 = np.reshape(mini_results, [-1,10])
if j % 50 == 0:
print("epoch ", j)
sess.run(train_step, feed_dict={xs: tmp0, ys:tmp1})
testimage0 = np.reshape(testimage, [-1, 784])
test_y = sess.run(predition, feed_dict={xs:testimage0})
print(test_y)
result = sess.run(tf.argmax(test_y, 1))
return result
(2)识别手写数字入口(在终端运行即可识别)(main.py)
import Network
import mnist_loader
import numpy as np
import sys
import test1
if __name__=='__main__':
training_inputs, training_results, test_inputs, test_results = mnist_loader.load_data_wrapper()
net =Network.Network([784,10])
image1 = test1.imageprepare('D:/Projects/MNIST_test/src/3.png',8)
testimage = np.reshape(image1,(784, -1))
result = net.start(training_inputs, training_results, 1000, 100,testimage )
print(result)
3.测试
测试图片:
测试结果:
4.总结
version 1 这个神经网络设计的太粗糙,只是我的入门之作,准确率不高!
version 1.1(2018.7.10更新)神经网络设计了两层,准确度在95%左右,version 1误用了random.shuffle(),造成有些data和label对不上!后面会接着优化结构。