《python神经网络编程》,3层神经网络的构建

import numpy as np
import scipy.special as sps

# 定义神经网络的类
class neuralnetwork:
	#初始化函数
	def __init__(self,input_nodes, hidden_nodes, output_nodes, learning_rate):
	self.inodes = input_nodes
	self.hnodes = hidden_nodes
	self.onodes = output_nodes
	
	self.lr = learing_rate

	# 初始化权重
	self.wih = np.random.normal(0.0, pow(hidden_nodes,-0.5),(hidden_nodes, input_nodes))
	#使用正态分布函数把权重初始化为均值为0,标准差为后一层个数的-0.5次方
	self.who = np.random.normal(0.0, pow(output_nodes,-0.5),(output_nodes, hidden_nodes))

	# 初始化激活函数
	self.act_function = lambda x: sps.explit(x)
	pass

	# 训练函数
	def train(self, input_list, target_list):
		inputs = np.array(input_list, ndmin=2).T
		targets = np.array(target_list, ndmin=2).T

		## 前向传播 ##
		hidden_inputs = np.dot(self.wih, inputs)
		hidden_outputs = self.act_function(hidden_inputs)

		final_inputs = np.dot(self.who, hidden_outputs)
		final_outputs = self.act_function(final_inputs)

		## 误差反向传播 ##
		# 输出层误差
		error_outlayer = targets - final_outputs
		# 隐藏层误差
		error_hiddenlayer = np.dot(self.who.T, error_outlayer)

		# 更新权重
		self.who += self.lr*np.dot((error_finallayer*final_outputs*(1-final_outputs)),hidden_outputs)
		self.wih += self.lr*np.dot((error_hiddenlayer*hidden_outputs*(1-hidden_outputs)),inputs)
		pass
	
	# 定义输出函数
	def query(self, input_list):
		inputs = np.array(input_list, ndmin=2).T

		hidden_inputs = np.dot(self.wih, inputs)
		hidden_outputs = self.act_function(hidden_inputs)

		final_inputs = np.dot(self.who, hidden_outputs)
		final_outputs = self.act_function(final_inputs)

		return final_outputs
		pass


########### 主函数 #########

input_nodes = 784
hidden_nodes = 200
output_nodes = 10
lr = 0.1
n = neuralnetwork(input_nodes,hidden_nodes,output_nodes,lr)

## 训练数据
# 载入dataset文件下名称为mnist.csv的文本
train_file = open('dataset/mnist_train.csv', 'r')
train_list = train_file.readlines()
train_file.close()  # 读取完文件要记得关闭文件哦,不然会占内存,也可能会出现数据错乱

for record in train_list:
	all_value = record.split(',')# 每读取一个数据用逗号分隔
	
	# 把输入数据范围缩到0.01--1,便于处理
	inputs = np.asfarry(all_value[1:])/255.0*0.99+0.01
	
	# 生成训练标签(正确值)
	targets = np.zeros(output_nodes) + 0.01
	
	n.train(inputs, targets)
	pass

## 测试数据

scores = []

test_file = open('dataset/mnist_test.csv', 'r')
test_list = test_file.readlines()
test_file.close()

for record in test_list:
	all_value = record.split(',')# 每读取一个数据用逗号分隔
	
	# 把文本格式转换为整数,这一步很重要哦!
	correct_label = int(all_value[0])
	
	# 把输入数据范围缩到0.01--1,便于处理
	inputs = np.asfarry(all_value[1:])/255.0*0.99+0.01

	# 输出结果
	result = n.query(inputs)
	pre_label = np.argmax(resul) # pre_label为result数组最大的标签0-9中间一个

	if (pre == correct_label):
		scores.append(1)
	else:
		scores.append(0)
	pass

## 计算得分

score = np.asarray(scores)
print('The neuralnetwork prediction scor is: {}'.format(score.sum()/score.size))

直接copy上面代码去执行可能有些缩进到问题,自己动手微调一下或者自己码一下,问题不大。

要数据集的留言留下邮箱。

发布了4 篇原创文章 · 获赞 3 · 访问量 124

猜你喜欢

转载自blog.csdn.net/asd2390181722/article/details/104296960