Torch7入门续集(三)----Simple Layers的妙用

本文介绍了Torch7中的Simple Layers,包括Parameterized Modules如Dropout、Cosine,以及基本Tensor变换如Identity、Reshape/View。Simple Layers提供了一种便捷的方式在神经网络中添加常见操作,例如使用内置的Dropout进行正则化,用Cosine进行向量相似度计算。Reshape/View功能强大,View(-1)结合setNumInputDims(2)用于处理minibatch输入。

总说

先看一段代码,一般来说传入VGG的数据要先经过预处理,无非是先将BGR变成RGB,然后减去整个训练集的平均RGB值。写的最精简的可能是下面这样写。

function preprocess(img)
    local mean_pixel = torch.FloatTensor({
  
  103.939, 116.779, 123.68}):type(img:type())
    local perm = torch.LongTensor{
  
  3, 2, 1}
    img = img:index(1, perm):mul(255.0)
    mean_pixel = mean_pixel:view(3, 1, 1):expandAs(img)
    img:add(-1, mean_pixel)
    return img
end

然而。。请看下面的这种写法:

function getPreprocessConv()
    local mean_pixel = torch.Tensor({
  
  103.939, 116.779, 123.68})
    local conv = nn.SpatialConvolution(3,3, 1,1)
    conv.weight:zero()
    conv.weight[{
  
  1,3}] = 255
    conv.weight[{
  
  2,2}] = 255
    conv.weight[{
  
  3,1}] = 255
    conv.bias = -mean_pixel
    conv.gradBias = nil
    conv.gradWeight = nil
    conv.parameters = function() --[[nop]] end
    conv.accGradParameters = function() --[[nop]] end
    return conv
end

没错,直接用内置的卷积层进行操作!这启发我们一件事情:很多常见操作,我们都可以用内置的已有的各种层进行!而不是自己单独写,这就相当于nn层式编码!。。自创的词,大概知道就行。
Simple Layers就是一些常见的层操作,利用这些函数可以便捷的在某层后面加入各种操作层,这些操作层可以直接进行反向传播。

Simple Layers主要分为4个部分:
带参的Module—-> 基本Tensor变换——->数学Tensor运算——>其他Module
前面两篇写的就是Tensor和Math的,而在这里第二三正是利用这些简单层来替代Tensor变换和Math操作。

Parameterized Modules

  1. Linear
  2. Bilinear
  3. Dropout
  4. Abs
  5. Add
  6. CAdd
  7. Mul
  8. CMul
  9. Euclidean
  10. WeightedEuclidean
  11. Cosine

从名字就可以大概看出这些层的作用,比如Linear就是全连接层。Bilinear就是进行双线性插值。

Dropout

module= nn.Dropout(p)
训练前向:使得输入每个值按照p的概率丢弃,即使得该位置的值为0。同时输出大小的值被放大1/(1-p),主要是用来进行正规化的。
训练反向:被前向丢弃的位置仍旧为0,gradOutputinput都被放大1/(1-p)倍。

在深度学习领域,卷积神经网络(Convolutional Neural Networks,CNNs)、长短期记忆网络(Long Short - Term Memory,LSTM)和全连接深度神经网络(fully connected Deep Neural Networks )是非常重要的网络架构。 ### 卷积神经网络(CNN) 卷积神经网络是一类特殊的神经网络,它主要通过卷积层、池化层和全连接层构建,被广泛应用于图像、语音等领域。CNNs通过卷积操作来提取数据的局部特征,卷积核在数据上滑动进行卷积计算,这种操作使得网络具有平移不变性。 在图像领域,许多研究都使用了CNN进行图像分析。如通过3D卷积神经网络进行人类动作识别的研究,Ji等人在2013年发表的研究中,使用3D卷积神经网络对人类动作进行识别,取得了不错的效果,该网络在处理具有时空信息的动作数据时,通过3D卷积核提取时空特征,从而准确判断人类的动作类型 [^2]。在文本领域,Wang等人在2012年提出了使用卷积神经网络进行端到端的文本识别,利用CNN强大的特征提取能力对文本进行识别 [^4]。 ### 长短期记忆网络(LSTM) 长短期记忆网络是一种特殊的循环神经网络(RNN),它解决了传统RNN在处理长序列数据时的梯度消失或梯度爆炸问题。LSTM通过引入门控机制,即输入门、遗忘门和输出门,来控制信息的流动,使得网络能够更好地保留长序列中的信息。 LSTM特别适合处理具有时间序列特征的数据,如语音识别、自然语言处理中的机器翻译、文本生成等任务。在处理自然语言文本时,LSTM可以根据前文的信息来预测下一个词,从而实现文本的生成或翻译等功能。 ### 全连接深度神经网络 全连接深度神经网络是最基础的神经网络架构,网络中的每一层的神经元都与下一层的所有神经元相连。这种网络架构能够学习到输入数据的复杂非线性关系。 在分子特征化和建模中,全连接深度神经网络可以作为多层感知器(Multilayer Perception)应用。在分子的深度学习研究中,全连接层可以用于对分子的特征向量、分子图像等不同形式的特征进行学习和预测,实现对分子各种性质的预测,如分子的活性、毒性等 [^3]。 ### 代码示例 #### CNN代码示例(使用PyTorch) ```python import torch import torch.nn as nn class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1) self.relu1 = nn.ReLU() self.pool = nn.MaxPool2d(2) self.fc1 = nn.Linear(16 * 16 * 16, 128) self.relu2 = nn.ReLU() self.fc2 = nn.Linear(128, 10) def forward(self, x): x = self.pool(self.relu1(self.conv1(x))) x = x.view(-1, 16 * 16 * 16) x = self.relu2(self.fc1(x)) x = self.fc2(x) return x model = SimpleCNN() print(model) ``` #### LSTM代码示例(使用PyTorch) ```python import torch import torch.nn as nn class SimpleLSTM(nn.Module): def __init__(self, input_size, hidden_size, num_layers, output_size): super(SimpleLSTM, self).__init__() self.hidden_size = hidden_size self.num_layers = num_layers self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device) c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device) out, _ = self.lstm(x, (h0, c0)) out = self.fc(out[:, -1, :]) return out input_size = 10 hidden_size = 20 num_layers = 2 output_size = 1 model = SimpleLSTM(input_size, hidden_size, num_layers, output_size) print(model) ``` #### 全连接深度神经网络代码示例(使用PyTorch) ```python import torch import torch.nn as nn class SimpleFullyConnected(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(SimpleFullyConnected, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.relu = nn.ReLU() self.fc2 = nn.Linear(hidden_size, output_size) def forward(self, x): x = self.relu(self.fc1(x)) x = self.fc2(x) return x input_size = 100 hidden_size = 50 output_size = 10 model = SimpleFullyConnected(input_size, hidden_size, output_size) print(model) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值