符号解释
一、前向传播
前向传播:从输入层到输出层,用于求得初始状态下,实际输出和期望输出之间的总误差Δ
import torch
import numpy as np
from matplotlib import pyplot as plt
#sigmoid函数实现
def sigmoid(x):
return 1 / (1 + np.exp(-x))
#恒等函数
def identity_function(x):
return x
#进行权重和偏置的初始化
def init_network():
#使用字典存储网络初始化数据
network = {}
#第一层
network['W1'] = np.array([0.1, 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
def net_compute():
network = init_network()
x = np.array([1.0, 0.5])
y = forward(network, x)
print(y)
if __name__ == '__main__':
net_compute()
二、输出层的设计
神经网络可以用在分类问题和回归问题上,不过需要根据情况改变输出的激活函数。一般而言,回归问题用恒等函数,分类问题用softmax函数
- 机器学习的问题大致分为 分类问题 和 回归问题
- 分类问题是数据属于哪一个类别的问题
- 回归问题是根据某个输入预测一个(连续的)数值的问题
1、恒等函数
恒等函数会将输入按照原样输出,对于输入信息,不加任何改动地直接输出。因此,在输出层使用恒等函数的时候,输入信号会原封不动地被输出。
2、softmax函数
函数实现
import torch
import numpy as np
from matplotlib import pyplot as plt
#softmax基础实现
#会出现 溢出问题
def softmax(a):
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
#解决溢出问题
def softmax_plus(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
if __name__ == '__main__':
#输入大的数字会出现溢出
print(softmax(np.array([1010, 1000, 990])))
#解决了溢出问题
print(softmax_plus(np.array([1010, 1000, 990])))