这就是mlp的意义所在。让我一开始就告诉自己一件事。Nerf使用最快的relu激活,因为relu不存在梯度消失的现象,所以速度很快。
至于这个现象的解释请看下图:
好吧,我们开始讨论MLP。MLP实际上是具有多层神经网络的所谓多层感知器。感知器用于分类。
从上图可以看出,mlp最大的作用就是实现非线性分类。之所以能够进行非线性分类,是因为这个隐藏层进行了空间变换,这就是我在之前的博客中所说的,要想实现非线性,就必须进行运算。
MLP有很多缺点。其中之一是速度慢。难怪纳夫跑得这么慢。下面是从别人博客转载的MLP代码:
from__future__importprint_function,除法
将numpy导入为np
导入数学
从sklearn导入数据集
从mlfromscratch.utils导入train_test_split、to_categorical、标准化、accuracy_score、绘图
从mlfromscratch.deep_learning.activation_functions导入Sigmoid、Softmax
从mlfromscratch.deep_learning.loss_functions导入CrossEntropy
多层感知器类():
'''多层感知器分类器。一种具有一个隐藏层的全连接神经网络。
展开以显示整个前向和后向传递。
参数:
----------
n_hidden:int:
隐藏层中处理节点的数量。
n_iterations:浮点数
算法将调整权重的训练迭代次数。
Learning_rate:浮动
更新权重时将使用的步长。
'''
def__init__(自我,n_hidden,n_iterations=3000,learning_rate=0.01):
self.n_hidden=n_hidden
self.n_iterations=n_iterations
自我学习率=学习率
self.hidden_activation=Sigmoid()
self.output_activation=Softmax()
self.loss=CrossEntropy()
def_initialize_weights:
n_samples,n_features=X.shape
_,n_outputs=y.shape
#隐藏层
限制=1/math.sqrt(n_features)
self.W=np.random.uniform(-limit,limit,(n_features,self.n_hidden))
self.w0=np.zeros((1,self.n_hidden))
#输出层
limit=1/math.sqrt(self.n_hidden)
self.V=np.random.uniform(-limit,limit,(self.n_hidden,n_outputs))
self.v0=np.zeros((1,n_outputs))
deffit(自身,X,y):
self._initialize_weights(X,y)
对于范围内的i(self.n_iterations):
#…………
#ForwardPass
#…………
#隐藏层
隐藏输入=X.dot(self.W)+self.w0
隐藏输出=self.隐藏激活
#输出层
输出层输入=隐藏输出.dot(self.V)+self.v0
y_pd=self.output_activation(output_layer_input)
#...
#向后传递
#...
#输出层
#毕业。w.r.t输出层的输入
grad_wrt_out_l_input=self.loss.gradient(y,y_pd)*self.output_activation.gradient(output_layer_input)
grad_v=hide_output.T.dot(grad_wrt_out_l_input)
grad_v0=np.sum(grad_wrt_out_l_input,axis=0,keepdims=True)
#隐藏层
#毕业。隐藏层的w.r.t输入
grad_wrt_hidden_l_input=grad_wrt_out_l_input.dot(self.V.T)*self.hidden_activation.gradient(hidden_input)
grad_w=X.T.dot(grad_wrt_hidden_l_input)
grad_w0=np.sum(grad_wrt_hidden_l_input,axis=0,keepdims=True)
#更新权重
#逆梯度移动以最小化损失
self.V-=self.learning_rate*grad_v
self.v0-=self.learning_rate*grad_v0
self.W-=self.learning_rate*grad_w
self.w0-=self.learning_rate*grad_w0
#使用训练好的模型来预测X的标签
defpdict(self,X):
#转发:
隐藏输入=X.dot(self.W)+self.w0
隐藏输出=self.隐藏激活
输出层输入=隐藏输出.dot(self.V)+self.v0
y_pd=self.output_activation(output_layer_input)
返回y_pd
defmain():
数据=datasets.load_digits()
X=标准化(数据.数据)
y=数据.目标
#将名义y值转换为二进制
y=to_categorical(y)
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.4,种子=1)
#MLP
clf=多层感知器(n_hidden=16,
n_迭代=1000,
学习率=0.01)
clf.fit(X_train,y_train)
y_pd=np.argmax(clf.pdict(X_test),axis=1)
y_test=np.argmax(y_test,轴=1)
准确度=准确度_分数
print('Accuracy:',准确度)
#使用PCA将维度降为2并绘制结果
Plot().plot_in_2d(X_test,y_pd,title='多层感知器',precision=accuracy,legend_labels=np.unique(y))
如果__name__=='__main__':
主要的
这里的隐藏层是一个全连接层,因为隐藏层必须改变的空间,意味着这一层的所有神经元都与上一层相连。根据每个神经元的参数不同,全连接层的作用自然也不同)。卷积用于分类。
这里全连接层的神经元是激活函数经过全连接层再经过激活函数处理,用处就是利用激活函数来判断是否激活某个条件,我看到Alexnet用的是relu激活data。我想可能是因为它是非饱和的,取值范围比较大。是的,但是relu似乎在梯度下降方面表现不错,所以我们暂时忽略这个))。
如果上一层的神经元和权重的组合达到一定的条件,那么本层的某些神经元就会被激活,而最终的输出层只需要把这些激活的东西放进去就可以了一起看看它们是什么。
有人告诉我,如果全连接的输出维度比输入维度小,是为了更好的拟合。我认为这是有道理的,因为它减少了输入的原始特征。它们只能被迫组合,因此必须得出一个组合产品。称其为合适也是正常的。放一个转载的连接层代码,方便理解:
将torch.nn导入为nn
导入torch.nn.function作为F
类Net(nn.Module):
def__init__(self):
#nn.Module子类函数必须在构造函数中执行父类的构造函数
#下面的公式等价于nn.Module.__init__(self)
超级.__init__()
#卷积层“1”表示输入图像是单通道,“6”表示输出通道数,“5”表示卷积核为5*5
self.conv1=nn.Conv2d(1,6,5)
#卷积层
self.conv2=nn.Conv2d(6,16,5)
#全连接层,y=Wx+b
self.fc1=nn.Linear(16*5*5,120)
#参考第3节,这里第一层的kernel大小是前一个卷积层的输出,kernel大小为16*5*5,总共120层
self.fc2=nn.Linear(120,84)
#后续各层的内核大小为1*1
self.fc3=nn.Linear(84,10)
def前进:
#卷积--激活--池化
x=F.max_pool2d(F.relu(self.conv1(x)),(2,2))
x=F.max_pool2d(F.relu(self.conv2(x)),2)
#reshape,'-1'表示自适应
x=x.view(x.size()[0],-1)
x=F.relu(self.fc1(x))
x=F.relu(self.fc2(x))
x=自我.fc3
返回x
净=净()
打印
我想我应该把这些功能的特点列出来,以便我以后能够了解它们各自的功能。
本文主要介绍Linux中用于终止进程的kill、pikill和killall命令的用法。是入门学习Linux的基础知识。有需要的朋友可以参考一下.16-01-1…
Win11已经发布了开发者预览版。与Win10相比,Win11在很多地方都发生了翻天覆地的变化。下面小编就为大家详细介绍一下。我们来看看.21-07-08Win…
今天脚本之家小编给大家推荐几个Win1021H1好用的右键菜单项。都是热心网友推荐的。希望大家喜欢.21-05-06Win1021H1系统好用的右键菜单设置方法…
Windows11已经使用了一段时间了。今天小编为大家带来五个你肯定不知道的Win11隐藏功能。我们来看看.21-06-21近日,微软新一代操作系统Window…
一些用户在升级Windows11时收到0x8007007f错误。这是怎么回事?下面小编就为大家带来详细的解决方案。有需要的朋友可以看看.21-10-06现在大家…
2024-05-17 14:09:02
2024-05-17 13:57:02
2024-05-17 13:39:48
2024-05-17 13:06:54
2024-05-17 12:33:15
大家好,今天小编关注到一个比较有意思的话题,就是关于培训机构教学改进建议的问题,…
大家好,今天小编关注到一个比较有意思的话题,就是关于欧美裸体培训学校的问题,于是…