CS231N Assignment4 Two Layer Net
CS231N Assignment4 Two Layer Net
Begin
本文主要介绍CS231N系列课程的第四项作业,写一个两层神经网络训练模型。
课程主页:网易云课堂CS231N系列课程
语言:Python3.6
1神经网络
神经网络理解起来比较简单,在线形分类器的基础上加一个非线性激活函数,使其可以表示非线性含义,再增加
多层分类器就成为多层神经网络,如下图所示,由输入X经过第一层计算得到W1X,在后再用隐含层的激活函数max(0,s)
得到隐含层的输出。到输出层乘以W2得到输出层,最后的分类计分。
下图中最左侧为3072代表每幅图像有3072个特征,经过第一层网络到达中间层叫做隐藏层,隐含层变为100个特征了,在经过第二层计算到输出层最终得到10个类的得分。此神经网络叫做两层的神经网络(包含W1、W2)也叫有一个隐含层的神经网络。
对于激活函数只有在隐含层计算时有激活函数。
对于激活函数,有很多种,如下所示,上述中我们采用的是RELU
2编写一个两层神经网络
类似于之前我们书写的SVM等,编写任何一个训练器需要包含以下几部分
1、LOSS损失函数(前向传播)与梯度(后向传播)计算
2、训练函数
3、预测函数
4、参数训练
2.1 loss函数
损失函数计算采用softmaxu损失方法
1、首先计算前向传输,计算分数,就是上面那三个公式的调用
##############################
#Computing the class scores of the input
##############################
Z1 = X.dot(W1) + b1#第一层
S1 = np.maximum(0,Z1)#隐藏层激活函数
score = S1.dot(W2) + b2#输出层
2、计算完之后,插入一句话,当没有y参数时,直接输出分数,主要用在计算预测函数时需要计算分数。
if Y is None:
return score
loss = None
3、之后计算损失softmax计算,具体计算可以参考我的作业3
###############################
#TODO:forward pass
#computing the loss of the net
################################
exp_scores = np.exp(score)
probs = exp_scores / np.sum(exp_scores,axis=1,keepdims=True)
#数据损失
data_loss = -1.0/ N * np.log(probs[np.arange(N),Y]).sum()
#正则损失
reg_loss = 0.5*reg*(np.sum(W1*W1) + np.sum(W2*W2))
#总损失
loss = data_loss + reg_loss
4、计算后向传播梯度
################################