Pytorch

卷积

        一维卷积conv1d,输入的尺寸是embedding_size*length,也就是每一列是一个数据的embedding。

输入输出尺寸的关系

        out​=(in​−kernels​ize+2∗padding)/stride+1)

        卷积和池化都是一样的。

        当有dilation时,out​=(  (in​−dilation∗(kernelsize−1)−1+2∗padding)/stride  +1),这个除法是向下取整的。需要注意的是默认dilation=1,这时两个像素之间是没有间隔的,也就是没有进行膨胀的,只有在dilation>1时才是进行了膨胀。

        如果需要保持卷积前后尺寸不变,可以设置stride=1,padding=(kernel_size-1) // 2 * dilation,但是这样要求kernel_size是奇数,这是因为整除的问题。需要注意的是pytorch中padding操作是在两边,或者说四个方向padding这么多的数据,同时padding这么多数据。当然如果没有dilation,要保持卷积前后尺寸不变,最常见的就是设置stride=1,kernelsize=3,padding=1;或者stride=1,kernelsize=5,padding=2。一旦stride大于1,都是会造成尺寸的缩小的,最常见的就是变成1/2,也就是stride=2,kernel=padding*2,具体根据输入尺寸的单复,还需要+1,但是实际上一般在一个网络中,不会刻意为了将输出保持为输出的1/2而去改变kernelsize,而是统一设置,有(kernelsize=2,padding=1),(kernelsize=3,padding=1)等常见设置,但是具体设置仍要根据具体需要进行调整,如MobileNet中对于channel的设置。

        当然如果需要进行具体的调节,而非同时在四个方向进行padding同样多的数据,可以手动对数据进行padding,手动padding有四种方式:0、常数、镜像、复制,详见 四种padding,需要注意的是这里是将数据进行单独处理,然后再输入conv函数,也就是说卷积函数中只需要将padding设置为0即可。除此之外还需要注意,这些函数旨在是处理二维图片数据的,也就是输入的数据应该是(batch, channel, length, width)这样的四维数据,所以如果channel维只有一维,比如语音需要先unsqueeze一个维度出来。或者用一维的padding函数ReflectionPad1d等。

def block(nn.Module):
    def __ini__(self, ...):
        self.pad = nn.ReflectionPad2d(padding=(1, 2, 1, 2))

    def forward(self, x):
        x = self.pad(x)

损失函数

        对于最经常出现也是最基础的损失函数,交叉熵损失函数,可以看一下这篇博客CrossEntropy,其中对于最后面说的 Pytorch中的CrossEntropyLoss()函数不是使用的常规的定义式

而是使用

 

其实是一样的,因为在原始定义是针对二分类的,其计算式看似是两部分求和,实则最后计算时只有一个式子,因为p(x)是其真实类别,只能取0或1两个值,q(x)指的是预测为1的概率,很明显,1-q(x)就是预测为0的概率;        因为p(x)只能取0或1两个值,那么上式看似是两部分求和,实际上在计算时只有一个部分,当真实类别为1时,后面的1-p(x)为0,只剩下第一部分的p(x)logq(x),前面说过q(x)是预测类别为1的概率,所以此时计算的是预测正确的概率;同理,真实类别为0时,第一部分p(x)=0,只剩下第二部分的(1-p(x))log(1-q(x)),而1-q(x)就是预测类别为0的概率;        那么这个式子表达的意思就是将对样本预测正确的概率作为损失值(注意这里q(x)和1-q(x)都是<1的,取对数再在最前面加上负号,损失函数就和概率负相关了,就意味着预测正确概率越大,损失函数值越小,与直觉并不违背)        而下式只有一个部分是因为q(x)表示的不是预测类别为1的概率,而是预测为各个类别的概率,因为神经网络中最后的全连接层会输出各个类别的预测概率,而不是只有一个输出。        pytorch中也是这样,只需要将神经网络的output和target输入其CrossEntropyLoss()函数,就会自动进行一系列计算,其中就包括将target one_hot化,如一个batch_size=8,num_class=5的数据target标注为[3, 3, 1, 1, 4, 1, 0, 0],那么CrossEntropyLoss()会将其转化为,这个独热矩阵的意义就是只取预测正确部分的概率,因为神经网络的output也是一个(batch_size,num_classs)规格的矩阵

        [[0., 0., 0., 1., 0.],
        [0., 0., 0., 1., 0.],
        [0., 1., 0., 0., 0.],
        [0., 1., 0., 0., 0.],
        [0., 0., 0., 0., 1.],
        [0., 1., 0., 0., 0.],
        [1., 0., 0., 0., 0.],
        [1., 0., 0., 0., 0.]]

        同时该函数还会将output经过softmax将每个train_sample属于各类的概率统一到和为1,然后取log后,再与上述的target矩阵相乘,求得损失函数值。

数据处理

        dataloader

        维度交换:permute(0,2,1)        

        去掉多出的维度:squeeze,增加一个维度:unsqueeze

        Tensor拼接:cat和stack,cat前后维度数不变,stack前后维度数会增多。如waavenet中将多层的输出拼接到一起,基本的维度是(batch_size, skip_size, length),然后要将所有的这种规格的输出拼接到一起:torch.cat((A,B)),dim=1),输出的就是(batch_size, skip_size*layers, length),先将所有的skip输出append到一个list[],skip_connections,然后torch.cat(skip_connections, dim=1)。而stack结果就是(batch_size, skip_size, skip_size, length)。

调参

        对于卷积神经网络,卷积操作本身就带有非线性性,需要谨慎地添加激活函数,但是在调参时可以适当考虑在卷积之前加上BatchNormalization操作,以及跟上dropout操作来防止过拟合。(如果有激活函数,bn层一定是加到激活函数之前的)。

        对于卷积层的dropout,因为dropout是为了防止参数过多时的过拟合,最开始是用在全连接网络中的,在卷积神经网络中,一般放在最后的分类器全连接层前面,但是在卷积神经网络中,因为卷积核的参数并不多,dropout的意义并不大,如果要加,会将dropout的参数设置小一些,如设置成0.1。

        优化函数优先考虑使用sgd,初始learning rate设置1e-2这种相对大一点的,每隔一定的epoch将lr减小。根据我的观察,sgd优化效果是比较稳定的,但是需要的epoch数相对adam优化器更多。

注意点

        一些操作在导致维度减少时,减少的维度会自动消除,如求和、平均等,但是对于卷积操作来说,比如一个256*1024的词向量,在经过一个输出channel为1的conv1d的卷积后,维度为(batch_size,1,1024),而非(batch_size,1024),此时如果需要接一个全连接层,需要squeeze掉多出的一维。

        当最后需要接一层全连接层,而在此之前的又不是(batch_size,n)这种除开batch_size只剩一维的规格,需要展开时,不要用x.view(batch_size, -1),而要使用x.view(x.size[0], -1),因为对于dataloader来说,可能最后一个batch并不满足batch_size,到了最后一个batch可能会导致与设定的fc参数不一致。

                

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值