1、矩阵乘积
A=np.array([[1,2],[3,4]])
B=np.array([[5,6],[7,8]])
np.dot(A,B)
必须要使得矩阵中对应维度的元素个数一致
神经网络中就是通过乘积进行神经网络的运算
2、简单的三层神经网络实现(入门)
※层与层间进行乘积运算
使用了Numpy多维数组,高效地实现了神经网络。
其中定义了init_network()和forward()函数,init_network()函数会进行权重和偏置的初始化,并将它们保存在字典变量network[]中。forward()函数则封装了将输入信号转换为输出信号的处理过程。
代码实现如下,此时神经网络的前向处理就完成了。
# coding: utf-8 import sys, os sys.path.append(os.pardir) # 为了导入父目录的文件而进行的设定 import pickle import numpy as np from collections import OrderedDict from common.layers import * from common.gradient import numerical_gradient def init_network(): network = {} #第一层 network['W1']=np.array([[1.0,0.3,0.5],[0.2,0.4,0.6]]) #第一层权重 network['b1']=np.array([0.1,0.2,0.3]) #偏置 #第二层 network['W2']=np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]]) #第二层权重 network['b2']=np.array([0.1,0.2]) #第三层 network['W3']=np.array([[0.1,0.3],[0.2,0.4]]) network['b3']=np.array([0.1,0.2]) return network def forward(network,x): W1,W2,W3=network['W1'],network['W2'],network['W3'] b1,b2,b3=network['b1'],network['b2'],network['b3'] a1=np.dot(x,W1)+b1 #对第一层进行乘积运算 z1=sigmoid(a1) a2=np.dot(z1,W2)+b2 z2=sigmoid(a2) a3=np.dot(z2,W3)+b3 y=identity_function(a3) return y network=init_network() x=np.array([1.0,0.5]) y=forward(network,x) print(y)
通过使用对mnist数据集实现神经网络推理处理。
函数要分为get_data()、init_network、preditct()三个函数
正规化处理:把load_mnist函数参数normalize设置为true,函数内部进行转换,将图像各个像素值除以255,使得数据在0.0~1.0之内
具体函数作用见注释
1 # coding: utf-8 2 import sys, os 3 sys.path.append(os.pardir) # 为了导入父目录的文件而进行的设定 4 import numpy as np 5 import pickle 6 from dataset.mnist import load_mnist 7 from common.functions import sigmoid, softmax 8 9 #读入数据 10 def get_data(): 11 (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False) 12 return x_test, t_test 13 14 #读入保存在pickle文件中学习到的权重参数 15 def init_network(): 16 with open("sample_weight.pkl", 'rb') as f: 17 network = pickle.load(f) 18 return network 19 20 #将参数取出,定义神经网络 21 def predict(network, x): 22 W1, W2, W3 = network['W1'], network['W2'], network['W3'] 23 b1, b2, b3 = network['b1'], network['b2'], network['b3'] 24 25 a1 = np.dot(x, W1) + b1 26 z1 = sigmoid(a1) 27 a2 = np.dot(z1, W2) + b2 28 z2 = sigmoid(a2) 29 a3 = np.dot(z2, W3) + b3 30 y = softmax(a3) 31 32 return y 33 34 35 x, t = get_data() #获取mnist数据集 36 network = init_network() #生成网络 37 accuracy_cnt = 0 38 39 # 使用for语句逐一取出保存于x中的图像数据,使用predict()函数进行分类 40 # predict()函数使用numpy数组形式输出各个标签对应概率,使用概率列表中最大值索引作为预测结果 41 for i in range(len(x)): 42 y = predict(network, x[i]) 43 print(y) 44 p= np.argmax(y) # 获取概率最高的元素的索引 45 if p == t[i]: 46 accuracy_cnt += 1 47 48 print("Accuracy:" + str(float(accuracy_cnt) / len(x))) #比较神经网络预测答案与正确解标签,将回答正确概率作为识别精度
代码结果截图如下: