多层感知机针对于中间有隐藏层的神经网络结构,对于数据的每一层传递都会相应的多一层[w,b],这中间使用的传参函数称之为激活函数,如果激活函数是线性的话,那么就没什么意义,无论中间有多少层,其实和没有隐藏层是一样的,所以需要非线性的函数作为激活函数。
常使用的有sigmoid(),tanh(),Relu()等,sigmoid()函数在比较深的神经网络中容易出现梯度消失的情况,这是因为sigmoid在越远离原点的位置梯度趋近于零,Relu()函数在输入小于零时,会将数据转化为零,会丢失一些信息,不过影响不大,没什么关系,Relu()的优点主要是计算比较简单。
本次感知机的实现采用的激活函数为Relu(),多层感知机手动实现:
%matplotlib inline
import gluonbook as gb
from mxnet import nd
from mxnet.gluon import loss as gloss
#参数初始化
batch_size = 256
train_iter,test_iter = gb.load_data_fashion_mnist(batch_size)
num_inputs,num_outputs,num_hiddens = 784,10,512
w1 = nd.random.normal(scale = 0.01,shape = (num_inputs,num_hiddens))
b1 = nd.zeros(num_hiddens)
w2 = nd.random.normal(scale = 0.01,shape = (num_hiddens,num_outputs))
b2 = nd.zeros(num_output