一.神经网络概念
神经网络是生物神经网络在某种简化意义下的技术复现,作为一门学科,它的主要任务是根据生物神经网络的原理和实际应用的需要建造实用的人工神经网络模型,设计相应的学习算法,模拟人脑的某种智能活动,然后在技术上实现出来用以解决实际问题。
二.神经网络的结构
而在上章的感知机中有类似的结构,如下:
而感知机的运行过程:
上述感知机的实现和神经网络输入层到中间的其中的一个神经元的信号的传输过程一致。
而神经元信号的传递需要通过激活函数。
三.激活函数
1.sigmoid函数
代码实现:
def sigmoid(self, x): #定义sigmoid函数
return 1 / (1 + np.exp(-x)) #根据sigmoid函数的定义返回对应的值
2.ReLU函数
def relu(x):
return np.maximum(0,x)
3.softmax函数
神经网络在分类问题上一般使用softmax函数
softmax函数输出0.0-1.0之间的实数,并且y 1 , y 2 . . . y n y_1,y_2...y_n y1,y2...yn的和为1,所以把softmax函数的输出解释为“概率”
为防止数值溢出的实现方法:
def softmax(a):
c = np.max(a)
exp_a = np.exp(a - c)#溢出对策
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
四.3层神经网络的实现
实现代码:
import numpy as np #导入numpy库
import pickle #导入pickle库
from dataset.mnist import load_mnist #从dataset文件夹下的mnist.py里读取load_mnist函数
class ThreeLayerNet:
def __init__(self, input_size, hidden_size1, hidden_size2, output_size): # __init__是一个特殊方法用于在创建对象时进行初始化操作
self.network = {} # 定义一个字典
self.network['W1'] = np.random.rand(input_size, hidden_size1) # 随机生成input_size行hidden_size1列的0-1的值并赋值给键W1
self.network['b1'] = np.random.rand(hidden_size1) # 随机生成hidden_size1个的0-1的值并赋值给键b1
self.network['W2'] = np.random.rand(hidden_size1, hidden_size2) # 随机生成hidden_size1行hidden_size2列的0-1的值并赋值给键W2
self.network['b2'] = np.random.rand(hidden_size2) # 随机生成hidden_size2个的0-1的值并赋值给键b2
self.network['W3'] = np.random.rand(hidden_size2, output_size) # 随机生成hidden_size2行output_size列的0-1的值并赋值给键W3
self.network['b3'] = np.random.rand(output_size) # 随机生成output_size个的0-1的值并赋值给键b3
def sigmoid(self, x): #定义sigmoid函数
return 1 / (1 + np.exp(-x)) #根据sigmoid函数的定义返回对应的值
def softmax(self, a): #定义softmax函数
exp_a = np.exp(a) #指数函数
sum_exp_a = np.sum(exp_a) #指数函数的和
return exp_a / sum_exp_a #返回softmax函数的运算的值
def get_data(self):
with open (r"C:\Users\13206\Desktop\【源代码】深度学习入门:基于Python的理论与实现\dataset\mnist.pkl",'rb') as f: #打开数据集文件
dataset =pickle.load(f) #将文件中的数据解析为一个Python对象
x_test,y_test = dataset['test_img'],dataset['test_label'] #将数据分别赋值给x_test和y_test
def predict(self, x):
W1,W2,W3 = self.network['W1'], self.network['W2'], self.network['W3'] #将字典里的键W1,W2,W3对应的值分别赋值
b1,b2,b3 = self.network['b1'], self.network['b2'], self.network['b3'] #将字典里的键b1,b2,b3对应的值分别赋值
a1 = np.dot(x,W1) + b1 #实现从输入层到第一层
z1 = self.sigmoid(a1) #将a1通过激活函数并赋值给z1
a2 = np.dot(z1,W2) + b2 #实现从第一层到第二层
z2= self.sigmoid(a2) #将a2通过激活函数并赋值给z2
a3 = np.dot(z2,W3) + b3 #实现第二次到第三层
y = self.softmax(a3) #将a3的值通过输出层的softmax函数并赋值给y
return y #输出y
batch_size=100 #批数量
net = ThreeLayerNet(input_size = 784, hidden_size1 = 100, hidden_size2 = 50, output_size = 10) #定义net为ThreeLayerNet类对象
x,t =net.get_data() #读入数据
accuracy_cnt = 0 #定义accuracy_cnt并赋值为0
for i in range(0,len(x),batch_size): #以步长为100循环预测10000张图片
x_batch = x[i:i+batch_size] #从输入数据中抽出批数据
y_batch = net.predict(x[i:i+batch_size]) #根据神经网络的运算预测每次循环的批数据
p =np.argmax(y_batch,axis = 1) #按照行索引获得每行最大元素所在的位置
accuracy_cnt+=np.sum(p == t[i:i+batch_size]) #将每次循环的批数据符合神经网络预测的加到accuracy_cnt中
print("Accuracy: ",accuracy_cnt/ len(x)) #得出准确率
输出结果: