Pytorch 缓解过拟合和网络退化

一 添加BN模块

BN模块应该添加 激活层前面

在模型实例化后,我们需要对BN层进行初始化。PyTorch中的BN层是通过nn.BatchNorm1d或nn.BatchNorm2d类来实现的。

bn = nn.BatchNorm1d(20) #
对于1D输入数据,使用nn.BatchNorm1d;对于2D输入数据,使用nn.BatchNorm2d

在模型的前向传播过程中,我们需要将BN层应用到适当的位置。以全连接层为例,我们需要在全连接层的输出之后调用BN层。

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.fc1 = nn.Linear(10, 20)
        self.bn = nn.BatchNorm1d(20)
        self.fc2 = nn.Linear(20, 30)
        self.fc3 = nn.Linear(30, 2)

    def forward(self, x):
        x = self.fc1(x)
        x = self.bn(x)
        x = self.fc2(x)
        x = self.fc3(x)
        return x

二 添加残差连接

最主要的是需要注意输入参数的维度是否一致

import torch
import torch.nn as nn

class ResidualBlock(nn.Module):
    def __init__(self, input_size, hidden_size):
        super(ResidualBlock, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size)
        self.fc2 = nn.Linear(hidden_size, input_size)
        self.relu = nn.ReLU()
        
    def forward(self, x):
        residual = x
        out = self.fc1(x)
        out = self.relu(out)
        out = self.fc2(out)
        out += residual
        out = self.relu(out)
        return out
-----------------------------------
©著作权归作者所有:来自51CTO博客作者mob649e8166c3a5的原创作品,请联系作者获取转载授权,否则将追究法律责任
pytorch 全链接层设置残差模块
https://blog.51cto.com/u_16175510/6892589

三 一维卷积(tf和torch)

a. tf.keras.layers.Conv1D

该函数的必要参数有两个,filters(即 out_channels)和 kernel_size。对于 X = (1, 8, 128),如下代码可以得到 Y = (1, 6, 64):

import tensorflow as tf
X = tf.random.normal((1, 8, 128))
X.shape
# TensorShape([1, 8, 128])
conv = tf.keras.layers.Conv1D(64, 3, padding='valid')
Y = conv(X)
Y.shape
# TensorShape([1, 6, 64])

keras 为了让整个 api 更加用户友好,隐藏了两个关键参数。第一个是 data_format,在默认值 “channels_last”下,X 的维度顺序为 [batch_size, seq_length, input_channels],更符合NLP任务的直观理解。如果修改为“channels_first”,X 需要满足 [batch_size, input_channels, seq_length]。第二个是 input_channels,在函数内部自动获得:

input_channel = self._get_input_channel(input_shape)
如果 X 和 data_format 不匹配,就得不到正确的 in_channels。这里就是和 Pytorch 显著差异的地方。

b. torch.nn.Conv1d

该函数的必要参数有三个,in_channels, out_channels 和 kernel_size。被 keras 隐藏的 in_channels 被直接暴露,并且也不支持 data_format 的设置,X 的维度顺序必须是 [batch_size, input_channels, seq_length]。因此,对于通常的使用习惯,必须要先对输入做一次维度转换,再对输出做一次。对于 X = (1, 8, 128),如下代码可以得到 Y = (1, 6, 64):

import torch
X = torch.randn(1, 8, 128)
X.shape
# torch.Size([1, 8, 128])
Xt = X.transpose(1,2)
Xt.shape
# torch.Size([1, 128, 8])
conv = torch.nn.Conv1d(128, 64, 3)
Yt = conv(Xt)
Yt.shape
# torch.Size([1, 64, 6])
Y = Yt.transpose(Yt)
Y.shape
# torch.Size([1, 6, 64])

1、Pytorch搭建残差网络
2、扒源码:TensorFlow与Pytorch在一维卷积上的差异

你可能感兴趣的:(pytorch,人工智能,python)