符号解释

 一、前向传播

前向传播:从输入层到输出层,用于求得初始状态下,实际输出和期望输出之间的总误差Δ

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])))

Logo

更多推荐