NNDL 实验六 卷积神经网络(2)基础算子

目录

5.2卷积神经网络的基础算子

5.2.1卷积算子

5.2.1.1多通道卷积

5.2.1.2多通道卷积层算子

5.2.1.3 卷积算子的参数量和计算量

 5.2.2汇聚层算子

 选做题:使用pytorch实现Convolution Demo

总结:

参考


5.2卷积神经网络的基础算子

卷积神经网络是目前计算机视觉中使用最普遍的模型结构,如图5.8 所示,由M个卷积层和b个汇聚层组合作用在输入图片上,在网络的最后通常会加入K个全连接层。

从上图可以看出,卷积网络是由多个基础的算子组合而成。下面我们先实现卷积网络的两个基础算子:卷积层算子和汇聚层算子。

5.2.1卷积算子

卷积层是指用卷积操作来实现神经网络中一层。为了提取不同种类的特征,通常会使用多个卷积核一起进行特征提取。

5.2.1.1多通道卷积

在前面介绍的二维卷积运算中,卷积的输入数据是二维矩阵。但实际应用中,一幅大小为M\times N的图片中的每个像素特征表示的不仅仅只有灰度值的标量,通常有多个特征,可以表示为D维的向量,比如RGB三个通道的特征向量。因此,图像上的卷积操作的输入数据通常是一个三维张量,分别对应了图片的高度M,宽度N和深度D,其中深度D通常也被称为输入通道数D。如果输入的是灰度图像,则输入通道数为1;如果输入是彩色图像,分别有RGB三个通道,则输入通道数为3。

此外 ,由于具有单个核的卷积每次只能提取一种类型的特征,即输出一张大小为U\times V的特征图(Feature Map)。而在实际应用中,我们也希望每一个卷积层能够提取多种不同类型的特征,所以一个卷积层通常会组合多个不同的卷积核来提取特征,经过卷积运算后会输出多张特征图,不同的特征图对应不同类型的特征。输出特征图的个数通常将其称为输出通道数P

说明:

《神经网络与深度学习》将Feature Map翻译为“特征映射”,这里翻译为“特征图”。

假设一个卷积层的输入特征图\mathbf{X} \in \mathbb{R}^{D \times M \times N},其中\left ( M,N \right )为特征图的尺寸,D代表通道数;卷积核为\mathbf{X} \in \mathbb{R}^{P\times D \times U \times V},其中\left ( U,V \right )为卷积核的尺寸,D代表输入通道数,P代表输出通道数。

在实践中,根据目前深度学习框架中张量的组织和运算性质,这里特征图的大小为D\times M\times N,和《神经网络与深度学习》中D\times M\times N的定义并不一致。
相应地,卷积核WW的大小为\mathbb{R}^{P \times D \times U\times V}

一张输出特征图的计算

 

多张输出特征图的计算 

对于大小为D\times M\times N的输入特征图,每一个输出特征图都需要一组大小为\mathbf{X} \in \mathbb{R}^{D \times U \times V}的卷积核进行卷积运算。使用P组卷积核分布进行卷积运算,得到P个输出特征图\mathbf{Y}^{1}, \mathbf{Y}^{2}, \cdots, \mathbf{Y}^{P}。然后将P个输出特征图进行拼接,获得大小为P \times M^{\prime} \times N^{\prime}的多通道输出特征图。上面计算方式的可视化如下图5.10所示。

 

 5.2.1.2多通道卷积层算子

根据上面的公式,多通道卷积卷积层的代码实现如下:

import torch
import torch.nn as nn
class Conv2D(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0,weight_attr=[],bias_attr=[]):
        super(Conv2D, self).__init__()
        # 创建卷积核
        weight_attr = torch.randn([out_channels, in_channels, kernel_size,kernel_size])
        weight_attr = torch.nn.init.constant(torch.tensor(weight_attr,dtype=torch.float32),val=1.0)
        self.weight = torch.nn.Parameter(weight_attr)
        # 创建偏置
        bias_attr = torch.zeros([out_channels, 1])
        bias_attr = torch.tensor(bias_attr,dtype=torch.float32)
        self.bias = torch.nn.Parameter(bias_attr)
        self.stride = stride
        self.padding = padding
        # 输入通道数
        self.in_channels = in_channels
        # 输出通道数
        self.out_channels = out_channels
 
    # 基础卷积运算
    def single_forward(self, X, weight):
        # 零填充
        new_X = torch.zeros([X.shape[0], X.shape[1]+2*self.padding, X.shape[2]+2*self.padding])
        new_X[:, self.padding:X.shape[1]+self.padding, self.padding:X.shape[2]+self.padding] = X
        u, v = weight.shape
        output_w = (new_X.shape[1] - u) // self.stride + 1
        output_h = (new_X.shape[2] - v) // self.stride + 1
        output = torch.zeros([X.shape[0], output_w, output_h])
        for i in range(0, output.shape[1]):
            for j in range(0, output.shape[2]):
                output[:, i, j] = torch.sum(
                    new_X[:, self.stride*i:self.stride*i+u, self.stride*j:self.stride*j+v]*weight, 
                    [1,2])
        return output
 
    def forward(self, inputs):
        """
        输入:
            - inputs:输入矩阵,shape=[B, D, M, N]
            - weights:P组二维卷积核,shape=[P, D, U, V]
            - bias:P个偏置,shape=[P, 1]
        """
        feature_maps = []
        # 进行多次多输入通道卷积运算
        p=0
        for w, b in zip(self.weight, self.bias): # P个(w,b),每次计算一个特征图Zp
            multi_outs = []
            # 循环计算每个输入特征图对应的卷积结果
            for i in range(self.in_channels):
                single = self.single_forward(inputs[:,i,:,:], w[i])
                multi_outs.append(single)
                # print("Conv2D in_channels:",self.in_channels,"i:",i,"single:",single.shape)
            # 将所有卷积结果相加
            feature_map = torch.sum(torch.stack(multi_outs), 0) + b #Zp
            feature_maps.append(feature_map)
            # print("Conv2D out_channels:",self.out_channels, "p:",p,"feature_map:",feature_map.shape)
            p+=1
        # 将所有Zp进行堆叠
        out = torch.stack(feature_maps, 1) 
        return out
 
inputs = torch.tensor([[[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]],
               [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]]])
conv2d = Conv2D(in_channels=2, out_channels=3, kernel_size=2)
print("inputs shape:",inputs.shape)
outputs = conv2d(inputs)
print("Conv2D outputs shape:",outputs.shape)
 
# 比较与torch API运算结果
weight_attr = torch.ones([3,2,2,2])
bias_attr = torch.zeros([3, 1])
bias_attr = torch.tensor(bias_attr,dtype=torch.float32)
conv2d_torch = nn.Conv2d(in_channels=2, out_channels=3, kernel_size=2,bias=True)
conv2d_torch.weight = torch.nn.Parameter(weight_attr)
outputs_torch = conv2d_torch(inputs)
# 自定义算子运算结果
print('Conv2D outputs:', outputs)
# torch API运算结果
print('nn.Conv2D outputs:', outputs_torch)

运行结果:

5.2.1.3 卷积算子的参数量和计算量

参数量

计算量

 

 5.2.2汇聚层算子

汇聚层的作用是进行特征选择,降低特征数量,从而减少参数数量。由于汇聚之后特征图会变得更小,如果后面连接的是全连接层,可以有效地减小神经元的个数,节省存储空间并提高计算效率。

 常用的汇聚方法有两种,分别是:平均汇聚和最大汇聚。
平均汇聚:将输入特征图划分为2×2大小的区域,对每个区域内的神经元活性值取平均值作为这个区域的表示;
最大汇聚:使用输入特征图的每个子区域内所有神经元的最大活性值作为这个区域的表示。

 图5.11 给出了两种汇聚层的示例。

 汇聚层输出的计算尺寸与卷积层一致,对于一个输入矩阵\mathbf{X} \in \mathbb{R}^{M \times N }和一个运算区域大小为U×V的汇聚层,步长为S,对输入矩阵进行零填充,那么最终输出矩阵大小则为

M^{\prime}=\frac{M+2 P-U}{S}+1\left ( 5.20\right )

M^{\prime}=\frac{M+2 P-V}{S}+1\left ( 5.21 \right )

 

由于过大的采样区域会急剧减少神经元的数量,也会造成过多的信息丢失。目前,在卷积神经网络中比较典型的汇聚层是将每个输入特征图划分为2×22×2大小的不重叠区域,然后使用最大汇聚的方式进行下采样。

由于汇聚是使用某一位置的相邻输出的总体统计特征代替网络在该位置的输出,所以其好处是当输入数据做出少量平移时,经过汇聚运算后的大多数输出还能保持不变。比如:当识别一张图像是否是人脸时,我们需要知道人脸左边有一只眼睛,右边也有一只眼睛,而不需要知道眼睛的精确位置,这时候通过汇聚某一片区域的像素点来得到总体统计特征会显得很有用。这也就体现了汇聚层的平移不变特性。

汇聚层的参数量和计算量

由于汇聚层中没有参数,所以参数量为0;最大汇聚中,没有乘加运算,所以计算量为0,而平均汇聚中,输出特征图上每个点都对应了一次求平均运算。
代码如下:

import torch
import torch.nn as nn

class Pool2D(nn.Module):
    def __init__(self, size=(2, 2), mode='max', stride=1):
        super(Pool2D, self).__init__()
        # 汇聚方式
        self.mode = mode
        self.h, self.w = size
        self.stride = stride

    def forward(self, x):
        output_w = (x.shape[2] - self.w) // self.stride + 1
        output_h = (x.shape[3] - self.h) // self.stride + 1
        output = torch.zeros([x.shape[0], x.shape[1], output_w, output_h])
        # 汇聚
        for i in range(output.shape[2]):
            for j in range(output.shape[3]):
                # 最大汇聚
                if self.mode == 'max':
                    output[:, :, i, j] = torch.max(
                        x[:, :, self.stride * i:self.stride * i + self.w, self.stride * j:self.stride * j + self.h])
                # 平均汇聚
                elif self.mode == 'avg':
                    output[:, :, i, j] = torch.mean(
                        x[:, :, self.stride * i:self.stride * i + self.w, self.stride * j:self.stride * j + self.h])

        return output


inputs = torch.tensor([[[[1., 2., 3., 4.], [5., 6., 7., 8.], [9., 10., 11., 12.], [13., 14., 15., 16.]]]])
pool2d = Pool2D(stride=2)
outputs = pool2d(inputs)
print("input: {}, \noutput: {}".format(inputs.shape, outputs.shape))

# 比较Maxpool2d与paddle API运算结果
maxpool2d_torch = nn.MaxPool2d(kernel_size=(2, 2), stride=2)
outputs_torch = maxpool2d_torch(inputs)
# 自定义算子运算结果
print('Maxpool2d outputs:', outputs)
# torch API运算结果
print('nn.Maxpool2d outputs:', outputs_torch)

# 比较Avgpool2D与torch API运算结果
avgpool2d_torch = nn.AvgPool2d(kernel_size=(2, 2), stride=2)
outputs_torch = avgpool2d_torch(inputs)
pool2d = Pool2D(mode='avg', stride=2)
outputs = pool2d(inputs)
# 自定义算子运算结果
print('Avgpool2d outputs:', outputs)
# paddle API运算结果
print('nn.Avgpool2d outputs:', outputs_torch)

运行结果:

 选做题:使用pytorch实现Convolution Demo

用于视觉识别的 CS231n 卷积神经网络

1. 翻译以下内容

Convolution Demo.Below is a running demo of a CONV layer.Since 3D volumes are hard to visualize, all the volumes(the input volume(in bule),the weight volumes(in red),the output volumes(in green)) are visualized with each depth slice stacked in rows.The input volume is of size W1=5,H1=5,D1=3,and the CONV layer parameters are K=2,F=3,S=2,P=1.That is,have two filters of  size 3 * 3,and they are applied with a stride of 2.Therefore,the output volume size has spatial size (5-3+2)/2+1=3. Moreover,notice that a padding of P=1 is applied to the input volume,making the outer border of the input volume zero.The visualizatin below iterates over the output activations (green),and shows that each element is computed by elementwise multiplying the highlighted input (blue) with the filter (red),summing it up,and then offsetting the result by the bias.
卷积演示。下面是一个 CONV 层的运行演示。由于 3D 体积难以可视化,因此所有体积(输入体积(蓝色)、重量体积(红色)、输出体积(绿色))都可视化,每个深度切片堆叠成行。输入音量大小W1=5,H1=5,D1=3W1=5,H1=5,D1=3,并且 CONV 图层参数为K=2,F=3,S=2,P=1K=2,F=3,S=2,P=1.也就是说,我们有两个大小的过滤器3×33×3,则以 2 的步幅应用它们。因此,输出卷大小具有空间大小 (5 - 3 + 2)/2 + 1 = 3。此外,请注意P=1P=1应用于输入音量,使输入音量的外部边界为零。下面的可视化效果循环访问输出激活(绿色),并显示每个元素的计算方法是将突出显示的输入(蓝色)与筛选器(红色)相乘,将其相加,然后通过偏差抵消结果。

2. 代码实现下图

4c2e240630784d128f037b805ea4225a.gif

 

使用卷积核Filter,代码如下:
import torch
import torch.nn as nn


class Conv2D(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, weight_attr=[], bias_attr=[]):
        super(Conv2D, self).__init__()
        self.weight = torch.nn.Parameter(weight_attr)
        self.bias = torch.nn.Parameter(bias_attr)
        self.stride = stride
        self.padding = padding
        # 输入通道数
        self.in_channels = in_channels
        # 输出通道数
        self.out_channels = out_channels

    # 基础卷积运算
    def single_forward(self, X, weight):
        # 零填充
        new_X = torch.zeros([X.shape[0], X.shape[1] + 2 * self.padding, X.shape[2] + 2 * self.padding])
        new_X[:, self.padding:X.shape[1] + self.padding, self.padding:X.shape[2] + self.padding] = X
        u, v = weight.shape
        output_w = (new_X.shape[1] - u) // self.stride + 1
        output_h = (new_X.shape[2] - v) // self.stride + 1
        output = torch.zeros([X.shape[0], output_w, output_h])
        for i in range(0, output.shape[1]):
            for j in range(0, output.shape[2]):
                output[:, i, j] = torch.sum(
                    new_X[:, self.stride * i:self.stride * i + u, self.stride * j:self.stride * j + v] * weight,
                    axis=[1, 2])
        return output

    def forward(self, inputs):
        """
        输入:
            - inputs:输入矩阵,shape=[B, D, M, N]
            - weights:P组二维卷积核,shape=[P, D, U, V]
            - bias:P个偏置,shape=[P, 1]
        """
        feature_maps = []
        # 进行多次多输入通道卷积运算
        p = 0
        for w, b in zip(self.weight, self.bias):  # P个(w,b),每次计算一个特征图Zp
            multi_outs = []
            # 循环计算每个输入特征图对应的卷积结果
            for i in range(self.in_channels):
                single = self.single_forward(inputs[:, i, :, :], w[i])
                multi_outs.append(single)
                # print("Conv2D in_channels:",self.in_channels,"i:",i,"single:",single.shape)
            # 将所有卷积结果相加
            feature_map = torch.sum(torch.stack(multi_outs), axis=0) + b  # Zp
            feature_maps.append(feature_map)
            # print("Conv2D out_channels:",self.out_channels, "p:",p,"feature_map:",feature_map.shape)
            p += 1
        # 将所有Zp进行堆叠
        out = torch.stack(feature_maps, 1)
        return out


# 创建第一层卷积核
weight_attr1 = torch.tensor(
    [[[-1, 1, 0], [0, 1, 0], [0, 1, 1]], [[-1, -1, 0], [0, 0, 0], [0, -1, 0]], [[0, 0, -1], [0, 1, 0], [1, -1, -1]]],
    dtype=torch.float32)
weight_attr1 = weight_attr1.reshape([1, 3, 3, 3])
bias_attr1 = torch.tensor(torch.ones([3, 1]))
print("第一层卷积,W0为:\n", weight_attr1)
# 传入参数进行输出
Input_Volume = torch.tensor([[[0, 1, 1, 0, 2], [2, 2, 2, 2, 1], [1, 0, 0, 2, 0], [0, 1, 1, 0, 0], [1, 2, 0, 0, 2]]
                                , [[1, 0, 2, 2, 0], [0, 0, 0, 2, 0], [1, 2, 1, 2, 1], [1, 0, 0, 0, 0], [1, 2, 1, 1, 1]],
                             [[2, 1, 2, 0, 0], [1, 0, 0, 1, 0], [0, 2, 1, 0, 1], [0, 1, 2, 2, 2], [2, 1, 0, 0, 1]]])
Input_Volume = Input_Volume.reshape([1, 3, 5, 5])
conv2d_1 = Conv2D(in_channels=3, out_channels=3, kernel_size=3, stride=2, padding=1, weight_attr=weight_attr1,
                  bias_attr=bias_attr1)
output1 = conv2d_1(Input_Volume)
print("第一层卷积,W0的输出结果:\n", output1)

# 创建第二层卷积核
weight_attr2 = torch.tensor(
    [[[1, 1, -1], [-1, -1, 1], [0, -1, 1]], [[0, 1, 0], [-1, 0, -1], [-1, 1, 0]], [[-1, 0, 0], [-1, 0, 1], [-1, 0, 0]]],
    dtype=torch.float32)
weight_attr2 = weight_attr2.reshape([1, 3, 3, 3])
bias_attr2 = torch.tensor(torch.zeros([3, 1]))
print("第二层卷积,W1为:\n", weight_attr2)
Input_Volume = torch.tensor([[[0, 1, 1, 0, 2], [2, 2, 2, 2, 1], [1, 0, 0, 2, 0], [0, 1, 1, 0, 0], [1, 2, 0, 0, 2]]
                                , [[1, 0, 2, 2, 0], [0, 0, 0, 2, 0], [1, 2, 1, 2, 1], [1, 0, 0, 0, 0], [1, 2, 1, 1, 1]],
                             [[2, 1, 2, 0, 0], [1, 0, 0, 1, 0], [0, 2, 1, 0, 1], [0, 1, 2, 2, 2], [2, 1, 0, 0, 1]]])
Input_Volume = Input_Volume.reshape([1, 3, 5, 5])
conv2d_2 = Conv2D(in_channels=3, out_channels=2, kernel_size=3, stride=2, padding=1, weight_attr=weight_attr2,
                  bias_attr=bias_attr2)
output2 = conv2d_2(Input_Volume)
print("第二层卷积,W1的输出结果:\n", output2)

运行结果:

 

总结:

本次实验主要是多通道卷积算子的实现和汇聚层算子的实现,了解了框架算子的使用方法,以及与自定义算子的区别,选做题整体的体会了一下利用不同卷积核提取不同特征的过程,对多通道卷积和汇聚有了更多理解。

参考

(6条消息) NNDL 实验六 卷积神经网络(2)基础算子_HBU_David的博客-CSDN博客

NNDL 实验5(上) - HBU_DAVID - 博客园 (cnblogs.com) 

Stacey.933
关注 关注
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NNDL 实验六 卷积神经网络(1)卷积
weixin_58402555的博客
10-23 596
卷积神经网络
NNDL 实验六 卷积神经网络(2)基础算子
qq_52551768的博客
10-23 1084
NNDL 实验六 卷积神经网络(2)基础算子
卷积神经网络的理解 Squeeze-and-Excitation (SE)网络
skyfengye的博客
05-14 6588
对于CNN网络来说,其核心计算是卷积算子,其通过卷积核从输入特征图学习到新特征图。从本质上讲,卷积是对一个局部区域进行特征融合,这包括空间上(H和W维度)以及通道间(C维度)的特征融合 我们可以发现卷积实际上是对局部区域进行的特征融合。 这也导致了普通卷积神经网络的感受野不大,当然你也可以设计出更多的通道特征来增加这个,但是这样做导致了计算量大大的增加。因此为了空间上融合更多特征融合,或者是...
卷积的血腥的理解
02-20 735
比如说你的老板命令你干活,你却到楼下打台球去了,后来被老板发现,他非常气愤,扇了你一巴掌(注意,这就是输入信号,脉冲),于是你的脸上会渐渐地(贱贱地)鼓起来一个包,你的脸就是一个系统,而鼓起来的包就是你的脸对巴掌的响应,好,这样就和信号系统建立起来意义对应的联系。下面还需要一些假设来保证论证的严谨:假定你的脸是线性时不变系统,也就是说,无论什么时候老板打你一巴掌,打在你脸的同一位置(这似乎要求你的
《神经网络与深度学习》—学习笔记
studyeboy的专栏
06-17 2820
[nndl.github.io] [神经网络与深度学习] [nndl-book] 深度学习基础 深度学习是机器学习的一个分支,是指一类问题以及解决这类问题的方法。 深度学习问题是一个机器学习问题,指从有限样例中通过算法总结出一般性的规律,并可以应用到新的未知数据上。 深度学习采用的模型一般比较复杂,指样本的原始输入到输出目标之间数据流经过多个线性或非线性组件(component)。因为每个组件都会对信息进行加工,并进而影响后续的组件,所以当最后得到输出结果时,并不清楚其中每个组件的贡献是多少(贡献度分配问.
神经网络层数及神经元数目的选择
ZPN_LBJ的博客
05-14 2万+
神经网络的组成: 输入层:个数等于特征数 隐藏层:可能不只一层,神经元数目也不确定,需要根据实验和经验选择 0输出层,个数为输出的种类 以下是用于描述神经网络形状和能力的一些术语: 尺寸:模型中的节点数。 宽度:特定层中的节点数。 深度:神经网络中的层数。 能力:可以通过网络配置学到的函数的类型或结构。有时被称为“ 表征能力 ”。 架构:网络中层和节点的具体排列. 摘自:ht...
bp神经网络隐含层神经元个数_如何确定神经网络的层数和隐藏层神经元数量
weixin_39840733的博客
11-21 2万+
一、导语BP神经网络主要由输入层、隐藏层、输出层构成,输入和输出层的节点数是固定的,不论是回归还是分类任务,选择合适的层数以及隐藏层节点数,在很大程度上都会影响神经网络的性能。图源:吴恩达-深度学习输入层和输出层的节点数量很容易得到。输入层的神经元数量等于待处理数据中输入变量的数量,输出层的神经元的数量等于与每个输入关联的输出的数量。但是真正的困难之处在于确定合适的隐藏层及其神经元的数量。二、隐藏...
修改训练好的神经网络模型中的参数内容
qq_42178122的博客
07-11 1371
在迁移学习中,将训练好的模型用在其他地方上,当需要对模型的参数进行修改,可按照如下代码进行操作: path = "/media/FASTSCNN/lanenet_epoch_227_batch_8.model" #训练好的模型 state_dict2 = {"module."+k: v for k, v in torch.load(path).items()} #此处是在原本模型的参数名的基础上,多加"module."的字符串。即如果原参数名为“conv1”,修改后的参数名为”module.conv1
06.5. 汇聚层
weixin_45063703的博客
09-21 1362
与卷积层类似,汇聚层运算符由一个固定形状的窗口组成,该窗口根据其步幅大小在输入的所有区域上滑动,为固定形状窗口(有时称为汇聚窗口)遍历的每个位置计算一个输出。在这两种情况下,与互相关运算符一样,汇聚窗口从输入张量的左上角开始,从左往右、从上往下的在输入张量内滑动。对于给定输入元素,最大汇聚层会输出该窗口内的最大值,平均汇聚层会输出该窗口内的平均值。下面,我们用深度学习框架中内置的二维最大汇聚层,来演示汇聚层中填充和步幅的使用。在汇聚窗口到达的每个位置,它计算该窗口中输入子张量的最大值或平均值。
【深度学习】(1) CNN中的注意力机制(SE、ECA、CBAM),附Pytorch完整代码
热门推荐
博观而约取,厚积而薄发
06-03 9万+
大家好,今天和各位分享一下如何使用 Pytorch 构建卷积神经网络中的各种注意力机制,如:SENet,ECANet,CBAM。注意力机制的原理 和 TensorFlow2 的实现方式可以看我下面两篇博文:SENet、ECANet:https://blog.csdn.net/dgvv4/article/details/123572065DANet、CBAM:https://blog.csdn.net/dgvv4/article/details/123888724SE注意力机制(Squeeze-and-Exc
图像腐蚀算子SE的选取
mjiansun的专栏
01-11 2564
功能:用于膨胀腐蚀及开闭运算等操作的结构元素对象。 用法:SE = strel(shape,parameters) 创建由指定形状shape对应的结构元素。其中shape的种类有 arbitrary' 'pair' 'diamond' 'periodicline' 'disk' 'rectangle' 'line' 'square' 'octagon 参数parameter
『JavaSE』运算符简介
叄拾叄画生
09-08 205
算数运算符。关系运算符。逻辑运算符。位运算符。移位运算符。条件运算符。
Java SE 运算符
忄凝^的博客
03-25 195
Java SE 运算符 目录Java SE 运算符1、运算符1.1、主要有6种:1.2、可分为3类:2、算术运算符3、赋值运算符4、位运算符5、比较运算符|关系运算符6、逻辑运算符7、条件运算符8、运算符优先度 1、运算符   运算符是一些特殊符号,主要用于数学函数、一些类型的赋值语句和逻辑比较方面。 1.1、主要有6种: 算数运算符 +;-;*;/;%;++;–; 赋值运算符 =;+=;-=;*=;/=;%=; --> a+=a+b; 位运算符 >>; &
神经网络与深度学习(六)卷积神经网络(2)基础算子
weixin_53651790的博客
10-24 1936
熟悉与实现卷积神经网络的两个基础算子:卷积层算子和汇聚层算子
11、卷积神经网络:结构、卷积/汇集层
青星大学
08-26 1万+
层、空间布局、层模式、层大小模式、AlexNet/ZFNet/VGGNet 案例研究、计算考虑 卷积神经网络 (CNNs / ConvNets) 卷积神经网络与前一章的神经网络非常相似:它们是由具有可学习的权值和偏置的神经元组成的。每个神经元接收一些输入,执行点积,跟随一个非线性计算(可选项)。整个网络仍然表示一个可微的得分函数:从一端的原始图像像素到另一个的分数。并且它们在最后(完全连接)层...
几个深度网络的介绍
Just for fun的专栏
05-22 4040
1、GoogleNet模型 去除全连接层,使得模型训练更快并且减轻了过拟合。 Inception的核心思想是通过增加网络深度和宽度的同时减少参数的方法来解决问题。Inception v1由22层,比AlexNet的8层或VGGNet的19层更深。但其计算量只有15亿次浮点运算,同时只有500万的参数量,仅为AlexNet的1/12,却有着更高的准确率。 Incepti...
25_深度学习_汇聚层
Supre_yuan的博客
10-06 2263
通常当我们处理图像时,我们希望逐渐降低隐藏表示的空间分辨率,聚集信息,这样随着我们在神经网络层叠的上升,每个神经元对其敏感的感受野(输入)就越大。 而我们的机器学习任务通常会跟全局图像的问题有关(例如,“图像是否包含一只猫呢?”),所以我们最后一层的神经元应该对整个输入的全局敏感。通过逐渐聚合信息,生成越来越粗糙的映射,最终实现学习全局表示的目标,同时将卷积图层的所有有时保留在中间层。 此外,当检测较底层的特征时(例如之前讨论的边缘),我们通常希望这些特征保持某种程度上的平移不变性。例如,如果我们拍摄黑白之
2、编程练习:利用卷积神经网络,处理MNIST 数据集分类问题。 https://github.com/nndl/exercise/
最新发布
05-04
好的,以下是处理 MNIST 数据集分类问题的卷积神经网络的代码: ```python import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # 加载 MNIST 数据集 mnist = input_data.read_...
写文章

热门文章

  • 实验五 前馈神经网络(3)鸢尾花分类 1059
  • NNDL 作业7:第五章课后题 749
  • NNDL 实验二 pytorch入门 659
  • NNDL 实验六 卷积神经网络(1)卷积 600
  • NNDL 实验六 卷积神经网络(5)使用预训练resnet18实现CIFAR-10分类 585

最新评论

  • NNDL 实验四 线性分类

    辛巴的博客: from nndl import op,这个nndl内容是什么

  • NNDL 作业一

    Passerby_Wang: 写得也太详细了吧,学到了好多 也欢迎博主来我这里指点一二呀表情包表情包表情包

  • NNDL 实验一 numpy

    CSDN-Ada助手: 不知道 Python入门 技能树是否可以帮到你:https://edu.csdn.net/skill/python?utm_source=AI_act_python

最新文章

  • NNDL 作业9:分别使用numpy和pytorch实现BPTT
  • NNDL 实验七 循环神经网络(1)RNN记忆能力实验
  • NNDL 作业12:第七章课后题
2022年28篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家透明玻璃钢雕塑生产厂家延庆春季商场美陈铜陵玻璃钢雕塑价位湖南附近玻璃钢彩绘雕塑安徽景区玻璃钢雕塑哪家便宜徐汇区玻璃钢雕塑推荐厂家吉林玻璃钢雕塑厂家盐城秋季商场美陈玻璃钢仿石落地雕塑甘肃城市玻璃钢雕塑龙泉玻璃钢伟人像雕塑厂河北周年庆典商场美陈销售厂家甘南仿真玻璃钢雕塑设计渭南玻璃钢雕塑批发马鞍山欧式玻璃钢雕塑河北玻璃钢雕塑制作厂家安阳玻璃钢卡通雕塑厂家哪家好鹰潭步行街玻璃钢雕塑市场武义人物玻璃钢雕塑设计上饶玻璃钢雕塑市场武都玻璃钢雕塑生产厂家七夕商场美陈图广西玻璃钢卡通雕塑公园合肥玻璃钢花盆批发价格表订制玻璃钢雕塑仿铜玻璃钢熊猫雕塑批发商场大型促销活动美陈布置嘉兴玻璃钢卡通雕塑制作做玻璃钢雕塑的厂家哪里黑色大口径玻璃钢花盆香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化