您的位置:首页 > 理论基础 > 计算机网络

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

2020-03-05 20:33 656 查看
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上面代码去执行可能有些缩进到问题,自己动手微调一下或者自己码一下,问题不大。

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

  • 点赞
  • 收藏
  • 分享
  • 文章举报
方洋存在 发布了1 篇原创文章 · 获赞 2 · 访问量 63 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: