pytorch框架学习(8)——nn网络层

@[toc]

1. 卷积层

1.2 1d/2d/3d卷积

  • 卷积运算:卷积核在输入信号(图像)上滑动,相应位置上进行乘加

  • 卷积核:又称为滤波器,过滤器,可认为是某种模式,某种特征


    在这里插入图片描述
  • 卷积过程类似于用一个模板去图像上寻找与它相似的区域,与卷积核模式越相似,激活值越高,从而实现特征提取。


    在这里插入图片描述

    上图是AlexNet卷积核可视化图像,发现卷积核学习到的是边缘,条纹,色彩这一些细节模式。

  • 卷积维度:一般情况下,卷积核在几个维度上滑动,就是几维卷积


    image
    在这里插入图片描述

1.3 卷积-nn.Conv2d()

  • nn.Conv2d
    • 功能:对多个二维信号进行二维卷积
    • in_channels:输入通道数
    • out_channels:输出通道数,等价于卷积核个数
    • kernel_size:卷积核尺寸
    • stride:步长
    • padding:填充个数
    • dilation:空洞卷积大小
    • groups:分组卷积设置
    • bias:偏置
  • 尺寸计算:
    简化版:out_{size} = \frac{In_{size} - kernel_{size}}{stride} + 1
# load img
path_img = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'lena.png')
img = Image.open(path_img).convert('RGB')

# convert to tensor
img_transform = transforms.Compose([transforms.ToTensor()])
img_tensor = img_transform(img)
img_tensor.unsqueeze_(dim=0)    # C*H*W to B*C*H*W

# 创建卷积层
# 2d
flag = 1
# flag = 0
if flag:
    conv_layer = nn.Conv2d(3, 1, 3)     # input:(i, o, size)
    nn.init.xavier_normal_(conv_layer.weight.data)   # 正态分布初始化

    # calculation
    img_conv = conv_layer(img_tensor)
在这里插入图片描述
卷积前尺寸:torch.Size([1, 3, 512, 512])
卷积后尺寸:torch.Size([1, 1, 510, 510])

1.4 转置卷积-ConvTranspose

  • 转置卷积用于对图像进项上采样


    在这里插入图片描述
  • nn.ConvTranspose2d
    • 功能:转置卷积实现上采样
    • in_channels:输入通道数
    • out_channels:输出通道数
    • kernel_size:卷积核尺寸
    • stride:步长
    • padding:填充个数
    • dilation:空洞卷积大小
    • groups:分组卷积设置
    • bias:偏置
  • 尺寸计算:
    简化版: out_{size} = (in_{size} - 1) * stride + kernel_{size}
# transposed
flag = 1
# flag = 0
if flag:
    conv_layer = nn.ConvTranspose2d(3, 1, 3, stride=2)
    nn.init.xavier_normal_(conv_layer.weight.data)

    # calculation
    img_conv = conv_layer(img_tensor)
在这里插入图片描述
卷积前尺寸:torch.Size([1, 3, 512, 512])
卷积后尺寸:torch.Size([1, 1, 1025, 1025])

2. 池化层——Pooling Layer

  • 池化运算:对信号进行“收集”并“总结”,类似水池收集水资源,因而得名池化层。
  • 收集:多变少
  • 总结:最大值/平均值


    在这里插入图片描述

    在这里插入图片描述
  • nn.MaxPool2d
    • 功能:对二维信号进行最大值池化
    • kernel_size:池化核尺寸
    • stride:步长
    • padding:填充个数
    • dilation:池化核间隔大小
    • ceil_mode:尺寸向上取整
    • return_indices:记录池化像素索引
    maxpool_layer = nn.MaxPool2d((2, 2), stride=(2, 2))
    img_pool = maxpool_layer(img_tensor)
在这里插入图片描述
池化前尺寸:torch.Size([1, 3, 512, 512])
池化后尺寸:torch.Size([1, 3, 256, 256])
  • nn.AvgPool2d
    • 功能:对二维信号进行平均值池化
    • kernel_size:池化核尺寸
    • stride:步长
    • padding:填充个数
    • ceil_mode:尺寸向上取整
    • count_include_pad:填充值用于计算
    • divisor_override:除法因子
    avgpool_layer = nn.AvgPool2d((2, 2), stride=(2, 2))
    img_pool = avgpool_layer(img_tensor)
在这里插入图片描述
池化前尺寸:torch.Size([1, 3, 512, 512])
池化后尺寸:torch.Size([1, 3, 256, 256])
  • nn.MaxUnpool2d(反池化)
    • 功能:对二维信号进行最大值池化上采样,根据索引进行反池化
    • kernel_size:池化核尺寸
    • stride:步长
    • padding:填充个数


      在这里插入图片描述
    # pooling
    img_tensor = torch.randint(high=5, size=(1, 1, 4, 4), dtype=torch.float)
    maxpool_layer = nn.MaxPool2d((2, 2), stride=(2, 2), return_indices=True)
    img_pool, indices = maxpool_layer(img_tensor)   # indices为坐标信息

    # unpooling
    img_reconstruct = torch.randn_like(img_pool, dtype=torch.float)
    maxunpool_layer = nn.MaxUnpool2d((2, 2), stride=(2, 2))
    img_unpool = maxunpool_layer(img_reconstruct, indices)

执行结果:

raw_img:
tensor([[[[0., 4., 4., 3.],
          [3., 3., 1., 1.],
          [4., 2., 3., 4.],
          [1., 3., 3., 0.]]]])
img_pool:
tensor([[[[4., 4.],
          [4., 4.]]]])
img_reconstruct:
tensor([[[[-1.0276, -0.5631],
          [-0.8923, -0.0583]]]])
img_unpool:
tensor([[[[ 0.0000, -1.0276, -0.5631,  0.0000],
          [ 0.0000,  0.0000,  0.0000,  0.0000],
          [-0.8923,  0.0000,  0.0000, -0.0583],
          [ 0.0000,  0.0000,  0.0000,  0.0000]]]])

3. 线性层——Linear Layer

  • 线性层又称全连接层,其每个神经元与上一层所有神经元相连,实现对前一层的线性组合,线性变换。


    两层的全连接网络

    计算方式如下:


    在这里插入图片描述
  • nn.Linear
    • 功能:对一维信号(向量)进行线性组合
    • in_features:输入结点数
    • out_features:输出结点数
    • bias:是否需要偏置
    • 计算公式:y = xW^T + bias
    inputs = torch.tensor([[1., 2, 3]])
    linear_layer = nn.Linear(3, 4)
    linear_layer.weight.data = torch.tensor([[1., 1., 1.],
                                             [2., 2., 2.],
                                             [3., 3., 3.],
                                             [4., 4., 4.]])

    linear_layer.bias.data.fill_(0.5)
    output = linear_layer(inputs)
    print(inputs, inputs.shape)
    print(linear_layer.weight.data, linear_layer.weight.data.shape)
    print(output, output.shape)

结果为:

tensor([[1., 2., 3.]]) torch.Size([1, 3])
tensor([[1., 1., 1.],
        [2., 2., 2.],
        [3., 3., 3.],
        [4., 4., 4.]]) torch.Size([4, 3])
tensor([[ 6.5000, 12.5000, 18.5000, 24.5000]], grad_fn=<AddmmBackward>) torch.Size([1, 4])

4. 激活函数层——Activation Layer

  • 激活函数对特征进行非线性变换,赋予多层神经网络具有深度的意义。
    在这里插入图片描述

    如果没有激活函数层,那么多个线性层的叠加相当于一个线性层。
  • nn.Sigmoid
    • 公式:y = \frac{1}{1+e^{-x}}
    • 梯度公式:y^' = y * (1-y)
    • 特性:
      1. 输出值在(0,1),符合概率
      2. 导数范围[0, 0.25],易导致梯度消失
      3. 输出为非0均值,破坏数据分布


        在这里插入图片描述
  • nn.tanh
    • 公式:y = \frac{sinx}{cosx} = \frac{e^x-e^{-x}}{e^x+e^{-x}} = \frac{2}{1+e^{-2x}}+1
    • 梯度公式:y^' = 1-y^2
    • 特性:
      1. 输出值在(-1,1),数据符合0均值
      2. 导数范围是(0,1),易导致梯度消失


        在这里插入图片描述

        为了解决梯度消失的问题,提出了nn.ReLU(修正线性单元)

  • nn.ReLU
    • 公式:y = max(0, x)
    • 梯度公式:f(x)=\begin{cases} 1& \text{x>0}\\undefined& \text{x=0}\\ 0& \text{x<0}\end{cases}
    • 特性:
      1. 输出值均为正数,负半轴导致死神经元
      2. 导数是1,缓解梯度消失,但是容易引发梯度爆炸


        在这里插入图片描述

        3中改进的ReLU

  • nn.LeakyReLU
    • negative_slope:负半轴斜率
  • nn.PReLU
    • init:可学习斜率
  • nn.RReLU
    • lower:均匀分布下限
    • upper:均匀分布上限


      在这里插入图片描述
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容