神经网络学习笔记1


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))) #比较神经网络预测答案与正确解标签,将回答正确概率作为识别精度

代码结果截图如下:

原文地址:https://www.cnblogs.com/AKsnoopy/p/13460887.html