使用 numpy.random.normal 创建矩阵用于表示权重 0~1之间
这个函数是符合正态分布的
(这个应该是回归算法的神经网络,具体等到后期再做详细分类)
神经网络工作流程
组合输入信号
↓
应用连接
↓
权重调节
↓
应用激活函数
↓
生成这些层的输出信号
入门感悟:
其实机器学习的原理是比较简单的(目前来看),无非就是让你的代码为
你传入的参数设定一个权重(回归法),这样等用的时候就可以将权重和你的数据
结合计算一下,得到你的数据的一个预测
传入的参数(训练样本)是一个Key - Value形式,训练时根据参数与权重
的计算后得到一个值,计算出误差之后继而反馈给权重,然后用这种方式
经过大量的样本训练后得到的权重是比较符合的,然后我们再传入数据,经
计算得到的值已经很大几率符合我们的预期了。
记录一下自己写的一个神经网络(其实是按照 塔里克.希拉德的原文手敲的QAQ)
第一个AI代码
2019年9月30日
17:09
--------------------------------------------------MAIN--------------------------------------------------------
from xiuwenapi import *
import matplotlib.pyplot as plt
import pylab
input_nodes = 784#输入数据个数
hidden_nodes = 200#
output_nodes = 10
learning_rate = 0.2
n = neuralnetwork(input_nodes,hidden_nodes,output_nodes,learning_rate)
#-------------------------------训练阶段↓
traning_data_file = open("E:\\MNIST\\MNIST_CSV格式\\mnist_train.csv",'r')
traning_data_list = traning_data_file.readlines()#读入CVS数据
traning_data_file.close()
epochs = 1
for x in range(epochs):
for record in traning_data_list:
all_values = record.split(',')
inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01#缩小范围
targets = numpy.zeros(output_nodes) + 0.01
targets[int(all_values[0])] = 0.99
n.train(inputs,targets)
pass
print(x)
pass
#-------------------------------训练阶段↑
#torch.save(n, "E:\\MNIST\\MNIST_CSV格式\\pzwj.pkl")
#----------------------------------测试阶段↓
print("train OVER\r\n ");
test_data_file = open("E:\\MNIST\\MNIST_CSV格式\\mnist_test.csv", 'r')
test_data_list = test_data_file.readlines()
test_data_file.close()
scorecard = []
for record in test_data_list:
all_values = record.split(',')
correct_label = int(all_values[0])
inputs = (numpy.asfarray(all_values[1:])/255.0*0.99)+0.01
outputs = n.query(inputs)
label = numpy.argmax(outputs)
if (label==correct_label):
scorecard.append(1)
else:
scorecard.append(0)
pass
pass
#----------------------------------测试阶段↑
scorecard_array = numpy.asarray(scorecard)
print("performance=",scorecard_array.sum()/scorecard_array.size)
print("test OVER\r\n ");
-------------------------------------------------------------------API---------------------------------------------------------------------
#第一炮 2019_9_25
import numpy
import scipy.special
class qz:
global wih
global who
pass
class neuralnetwork:
def __init__(self, inputnodes, hiddennodes,outputnodes,learningrate):
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
self.lr = learningrate#学习率
self.wih = numpy.random.normal( 0.0 , pow( self.hnodes , -0.5 ),( self.hnodes , self.inodes ) )#正态分布的权重
self.who = numpy.random.normal( 0.0 , pow( self.onodes , -0.5 ),( self.onodes , self.hnodes ) )#+1
self.activation_function = lambda x:scipy.special.expit(x)#s函数
def train(self,inputs_list,targets_list):
inputs = numpy.array(inputs_list,ndmin = 2).T
targets = numpy.array(targets_list,ndmin = 2).T
hidden_inputs = numpy.dot(self.wih,inputs)
hidden_outputs = self.activation_function(hidden_inputs)
final_inputs = numpy.dot(self.who,hidden_outputs)
final_outputs = self.activation_function(final_inputs)
output_errors = targets - final_outputs
hidden_errors = numpy.dot(self.who.T,output_errors)
self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)),numpy.transpose(hidden_outputs))
self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)),numpy.transpose(inputs))
qz.who = self.who
qz.wih = self.wih
def query(self,inputs_list):
inputs = numpy.array( inputs_list , ndmin=2 ).T
hidden_inputs = numpy.dot( self.wih,inputs )#权重与输入点乘
hidden_outputs = self.activation_function(hidden_inputs)#阶跃函数
final_inputs = numpy.dot( self.who, hidden_outputs)#权重与中间层点乘
final_outputs = self.activation_function( final_inputs )#阶跃函数
return final_outputs