基于MNIST设计神经网络识别手写数字(version 1.1 两层结构)

基于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对不上!后面会接着优化结构。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值