padding参数 python_padding的参数 python - CSDN
精华内容
参与话题
  • 关于TensorFlow中函数conv2d参数stride,padding的理解

    万次阅读 多人点赞 2018-03-17 16:57:42
    刚刚接触TensorFlow,很多地方不是很理解,虽然之前有过相关的理论学习,但具体的代码实现,还需破费心力。TensorFlow中函数conv2d主要实现了输入张量与设定卷积核的... padding,  use_cudnn_on_gpu=True,  dat...

    刚刚接触TensorFlow,很多地方不是很理解,虽然之前有过相关的理论学习,但具体的代码实现,还需破费心力。

    TensorFlow中函数conv2d主要实现了输入张量与设定卷积核的卷积操作,其函数形式如下:

    tf.nn.conv2d(
        input,
        filter,
        strides,
        padding,
        use_cudnn_on_gpu=True,
        data_format='NHWC',
        dilations=[1, 1, 1, 1],
        name=None
    )
    

    input,filter自然是设定的输入和卷积核了,参数strides,padding分别决定了卷积操作中滑动步长和图像边沿填充的方式。

    看下strides官方解释:


    其为长度为4的一阶张量,并且要求strides[0]=strides[3]=1,strides[1],strides[2]决定卷积核在输入图像in_hight,in_width方向的滑动步长,而通过图像卷积的过程可以知道,卷积核的大小和图像的大小有时候比不是完全匹配,比如图像大小为5x5,卷积核大小为3x3,滑动步长为3时会涉及到图像卷积过程中边界如何填充的问题,padding参数的两个值SAME,VALID决定了其填充方式,通过代码验证其不同的工作方式

    padding = VALID:


    可以看到当用5x5 的卷积核对28x28的图像进行卷积,采用padding=VALID模式,步长为5,那么最后每个方向会余下3个像素,而VALID模式中会直接舍弃,这样每个方向上的5个元素会变成一个元素,所以最终卷积后的图像大小变成了5x5,结果如下:


    padding = SAME

    这种模式下,对于原始图像与卷积核不匹配的情况,就要对图像的边界做一些填充,具体的填充方式和所差的元素个数有关,一种一种试一试:


    同样是产生28x28的全1图像,然后用全1的5x5卷积核做卷积,那每个方向差两个元素,通过计算结果可以看到是在每个方向的两端各补了一个0,形成30x30,四周都是0的图像。那如果差1个元素呢?


    比较上述结果第一行,第一列不同,其余相同,那么就是在每行每列的最后补了一个0。继续差三个元素呢?


    同样是比较结果,通过元素的值可以推测出其是在每个方向的开头补了一个0,最后补了两个0,那么差4个元素呢?


    结果显示了什么?首尾各补两个0。那么通过上述验证是不是得到了些规律呢?可见当差偶数个元素是首尾各补一半,差奇数个时前边补奇数个,后边补偶数个。当然具体差多少元素和选定的卷积核大小以及滑动步长密切相关。那么滑动步长又有哪些影响呢?如果改成滑动步长为1,看看验证的结果:


    再把padding改为 VALID瞧瞧:


    总结一下看到了什么,卷积核大小,滑动步长直接影响最后的卷积结果的大小,且padding为SAME模式时,先对原图像进行填充再做卷积,填充值须根据卷积核大小及滑动步长决定,当滑动步长大于1时:填充数=K-I%S(K:卷积核边长,I:输入图像边长,S:滑动步长),滑动步长为1时,直接卷积核边长减1,而padding为VALID模式时,很简单粗暴直接从原始图像的首段开始卷积,到最后不能匹配卷积核的部分直接舍去,至于两种模式会有怎样的差别,后续可进行进一步的验证。






    展开全文
  • PyTorch学习笔记(9)——nn.Conv2d和其中的padding策略

    万次阅读 多人点赞 2018-09-26 17:37:30
    在之前的转载过的一篇文章——《tensorflow ckpt文件转caffemodel时遇到的坑》提到过,caffe的padding方式和tensorflow的padding方式有很大的区别,输出无法对齐。这是为什么呢? 下面简单回顾一下: 卷积操作...

    一. Caffe、Tensorflow的padding策略

    在之前的转载过的一篇文章——《tensorflow ckpt文件转caffemodel时遇到的坑》提到过,caffe的padding方式和tensorflow的padding方式有很大的区别,输出无法对齐。这是为什么呢?

    下面简单回顾一下

    卷积操作输出的形状计算公式是这样的:

    output_shape = (image_shape-filter_shape+2*padding)/stride + 1

    因为padding前面的系数是2,所以在padding时,一般是对称地补,左/右各padding一列 或者 上下各padding一行。

    那么问题来了,如果stride是2,而括号里算出来的值刚好是奇数怎么办?那就再偷偷摸摸补一列padding或者补一行padding。

    于是,caffe和tensorflow的区别就出来了。

    caffe偷偷摸摸地把一行0补在上面 或者 把一列0补在左边,tensorflow正好镜像对称,把一行0补在下面或者把一列0补在右边。这就是导致输出对齐不了的原因,前面几层输出的feature map的中间还能勉强对上,随着网络结构的加深,到fc之前已经完全对不上了。

    也就是说

    • caffe的padding策略是把0补在左上
    • tensorflow的padding策略是把0补在右下

    那么,PyTorch的padding策略是怎样的呢?在介绍padding策略之前,先简单的介绍一下PyTorch中的nn.Conv2d算子。

    二. nn.Conv2d简单说明

    nn.Conv2d的介绍主要译自官网

    nn.Conv2d的功能是:对由多个输入平面组成的输入信号进行二维卷积,以最简单的例子进行说明:

    输入信号的形式为(N,Cin,H,W)(N,C_{in},H,W)NN表示batch size,CinC_{in}表示channel个数,HHWW分别表示特征图的高和宽。

    参数说明:

    • stride(步长):控制cross-correlation的步长,可以设为1个int型数或者一个(int, int)型的tuple。

    • padding(补0):控制zero-padding的数目。

    • dilation(扩张):控制kernel点(卷积核点)的间距; 也被称为 "à trous"算法. 可以在此github地址查看:Dilated convolution animations

    • groups(卷积核个数):这个比较好理解,通常来说,卷积个数唯一,但是对某些情况,可以设置范围在1 —— in_channels中数目的卷积核:

    At groups=1, all inputs are convolved to all outputs.
    At groups=2, the operation becomes equivalent to having two conv layers side by side, each seeing half the input channels, and producing half the output channels, and both subsequently concatenated.
    At groups=in_channels, each input channel is convolved with its own set of filters (of size ⌊out_channelsin_channels⌋
    ).

    注意:kernel_size, stride, padding, dilation 不但可以是一个单个的int——表示在高度和宽度使用这个相同的int作为参数
    也可以使用一个(int1, int2)的元组(本质上单个的int就是相同int的(int, int))。在元组中,第1个参数对应高度维度,第2个参数对应宽度维度。

    还有一点需要提醒的是:卷积核的size的选择可能导致input中某几行(最后几行)没有关联起来,这是因为我们默认使用的模式是valid,而不是full(在tensorflow中也称为same)。如果想要充分利用input的话,则依赖于用户对padding以及stride等参数的设置。相比tensorflow,PyTorch需要用户清楚的知道的自己的卷积核选取对结果的影响。

    参数的详细说明(基于PyTorch0.4.1)

    这里写图片描述

    下图中的HoutH_{out}WoutW_{out}是根据我们在nn.Conv2d中设置的padding,dilation,kernel_size,stride等参数得到的输出特征图的高度和宽度。
    这里写图片描述

    三. nn.Conv2d中的padding操作

    nn.Conv2d简单介绍完了,现在来讲讲padding在nn.Conv2d中怎么实现的,也就是怎么补的0,或者说补0的策略。

    Q1: padding是卷积之后还是卷积之前还是卷积之后实现的?

    padding是在卷积之前补0,如果愿意的话,可以通过使用torch.nn.Functional.pad来补非0的内容。

    Q2:padding补0的默认策略是什么?

    四周都补!如果pad输入是一个tuple的话,则第一个参数表示高度上面的padding,第2个参数表示宽度上面的
    下面将展示一个padding = 1的例子:

    这里写图片描述
    显然,padding=1的效果是:原来的输入层基础上,上下左右各补了一行!除此之外我们看到,上下左右都是0.9862,那么,这个东西是啥呢?为什么不是0呢?

    为了这个问题,我甚至还去PyTorch论坛上献丑了,估计大家可能也知道是咋回事了…
    是的!是Bias!我问的问题是这样的:
    Calculation detail in nn.Conv2d

    Hello, I just can’t figure out the way nn.Conv2d calculate the output . 
    
    The result calculated from torch is not the same as some machine learning course had taught.
    
    For example, likes the code below:
    
    >> m = torch.nn.Conv2d(1, 1, 3, padding=0)
    >> m(input)
    tensor([[[[ 0.5142,  0.3803,  0.2687],
              [-0.4321,  1.1637,  1.0675],
              [ 0.1742,  0.0869, -0.4451]]]], grad_fn=<ThnnConv2DBackward>)
    >> input
    tensor([[[[ 0.7504,  0.1157,  1.4940, -0.2619, -0.4732],
              [ 0.1497,  0.0805,  2.0829, -0.0925, -1.3367],
              [ 1.7471,  0.5205, -0.8532, -0.7358, -1.3931],
              [ 0.1159, -0.2376,  1.2683, -0.0959, -1.3171],
              [-0.1620, -1.8539,  0.0893, -0.0568, -0.0758]]]])
    >> m.weight
    Parameter containing:
    tensor([[[[ 0.2405,  0.3018,  0.0011],
              [-0.1691, -0.0701, -0.0334],
              [-0.0429,  0.2668, -0.2152]]]], requires_grad=True)
    
    for the left top element 0.5142, it’s not the output equals to
    
    >> import numpy as np
    >> w = np.array([[0.2405,  0.3018,  0.0011], 
    >>              [-0.1691, -0.0701, -0.0334], 
    >>              [-0.0429,  0.2668, -0.2152]])
    # top-left 3x3 matrix of 5x5
    >> x = np.array([[ 0.7504,  0.1157,  1.4940], 
    >>               [ 0.1497,  0.0805,  2.0829], 
    >>               [1.7471,  0.5205, -0.8532]])
    >> print(np.sum(w*x))
    #  0.364034 != 0.5142
    0.36403412999999996
    
    My Question here is: Why Could the output not equal to 0.5142?
    
    Further more, when i add paramter padding into nn.Conv2d, 
    The outcome seems obscure to me as below, thanks a lot for explain that to me.Thank you!
    
    >> input
    tensor([[[[ 0.7504,  0.1157,  1.4940, -0.2619, -0.4732],
              [ 0.1497,  0.0805,  2.0829, -0.0925, -1.3367],
              [ 1.7471,  0.5205, -0.8532, -0.7358, -1.3931],
              [ 0.1159, -0.2376,  1.2683, -0.0959, -1.3171],
              [-0.1620, -1.8539,  0.0893, -0.0568, -0.0758]]]])
    # set padding from 0 to 1 equals to (1, 1)
    >> m1 = torch.nn.Conv2d(1, 1, 1, padding=1)
    >> m1(input)
    tensor([[[[0.9862, 0.9862, 0.9862, 0.9862, 0.9862, 0.9862, 0.9862],
              [0.9862, 1.0771, 1.0002, 1.1672, 0.9544, 0.9288, 0.9862],
              [0.9862, 1.0043, 0.9959, 1.2385, 0.9749, 0.8242, 0.9862],
              [0.9862, 1.1978, 1.0492, 0.8828, 0.8970, 0.8174, 0.9862],
              [0.9862, 1.0002, 0.9574, 1.1398, 0.9745, 0.8266, 0.9862],
              [0.9862, 0.9665, 0.7615, 0.9970, 0.9793, 0.9770, 0.9862],
              [0.9862, 0.9862, 0.9862, 0.9862, 0.9862, 0.9862, 0.9862]]]],
           grad_fn=<ThnnConv2DBackward>)
    
    The confused point is that how 0.9862 be calculated? 
    And what is the default padding strategy in nn.Conv2d?
    
    Thank you for reading and answer!
    

    答案也很简单——我没考虑bias!
    这里写图片描述

    根据下图,Q2中神秘的0.9862的来历我们就很清楚了,是bias的值。
    这里写图片描述

    展开全文
  • python加密文件时正确的padding方法

    千次阅读 2014-10-30 11:16:58
    之前写过的一段python程序代码用来对tar 文件加密,然后发送到客户端,客户端是运行openWRT的路由器,在路由器端用openssl进行解密,先附上代码。 用来加密文件的python code: # Encrypte file def aes_...
    之前写过的一段python程序代码用来对tar 文件加密,然后发送到客户端,客户端是运行openWRT的路由器,在路由器端用openssl进行解密,先附上代码。
    用来加密文件的python code:
    # Encrypte file
    def aes_encrypt_file(in_filename, out_filename, key, iv):
        block_size = AES.block_size
        pad = lambda s: s + (block_size - len(s) % block_size) \
                            * chr(block_size - len(s) % block_size)
        cipher = aes_build_cipher(key, iv)
        with open(in_filename, 'rb') as infile:
            with open(out_filename, 'wb') as outfile:
                while True:
                    buf = infile.read(1024)
                    if len(buf) == 0:
                        break
                    elif len(buf) % block_size != 0:
                        buf = pad(buf)
                    outfile.write(cipher.encrypt(buf))
    用来揭秘的openssl 命令:
    openssl aes-256-cbc -d -nosalt -K $sum256 -iv $iv -in ${PACKAGE} | tar xzf -
    需要说明的是每隔一小时就要执行一遍程序,加密tar文件然后发送到客户端解密解压。而且每次tar 文件都会发生变化,但基本上大小都在200KB左右。
    一开始做了几次测试之后,程序运行的都很愉快、很正常。于是写了个脚本让程序每隔2分钟运行一次,跑了一晚上,第二天打开log立马傻眼,居然出现错误,平均每10次会出现一次,错误信息如下:
    bad decrypt
    2011837512:error:06065064:lib(6):func(101):reason(100):NA:0:
    tar: short read

    很明显解密出现问题,开始解决问题。首先排除了key和iv出错的情况,将问题定位到了在网上找的padding的这段代码,于是查找资料。
    在google了一通错误码之后毫无帮助,于是直接查找openssl是如何处理padding的。
    google之后找到这里:http://https://www.openssl.org/docs/apps/enc.html 在这里面讲到了openssl关于padding的参数nopad,但也只有这一个参数。同时还讲到了这样一句话:All the block ciphers normally use PKCS#5 padding also known as standard block padding: this allows a rudimentary integrity or password check to be performed. However since the chance of random data passing the test is better than 1 in 256 it isn't a very good test.意思就是说他在处理padding时通常是使用PKCS#5的方式,这个就很有用了。于是再去查看
    PKCS#5的标准,找到了这个http://tweetyf.org/2012/04/the_difference_between_pkcs7_pkcs5.html 里面介绍了PKCS#5和PKCS#7的区别,也讲了原理。大概讲一下就是对于block_size是16的情况无论如何都有做填充,即使文件大小正好是16的倍数那也要在最后填充上16个16。看到这里就可以发现代码中是有问题的,因为如果文件大小正好是16的倍数就不会去padding,所以修改之后如下:
    # Encrypte file
    def aes_encrypt_file(in_filename, out_filename, key, iv):
        block_size = AES.block_size
        pad = lambda s: s + (block_size - len(s) % block_size) \
                            * chr(block_size - len(s) % block_size)
        cipher = aes_build_cipher(key, iv)
        with open(in_filename, 'rb') as infile:
            with open(out_filename, 'wb') as outfile:
                buf = infile.read()
                buf = pad(buf)
                outfile.write(cipher.encrypt(buf))
    这样就可以保证无论文件多大最后都要padding了,这样openssl就可以成功揭秘了。

    展开全文
  • 问题描述: 在使用b64decode对加密后的文件进行解密的时候报错,如下: Traceback (most recent call last): File "E:/project/allow/zt/xx01_xyz.py", line 13, in &lt;module&...

    问题描述:

    在使用b64decode对加密后的文件进行解密的时候报错,如下:

    Traceback (most recent call last):
      File "E:/project/allow/zt/xx01_xyz.py", line 13, in <module>
        result = b64decode("aHR0cCUzQSUyRiUyRnZpZGVvLnlqZjEzOC5jb20lM0E4MDkxJTJGMjAxODEyMzElMkYyd3prQjRGbSUyRmluZGV4Lm0zdTg")
      File "E:\Anaconda3\lib\base64.py", line 87, in b64decode
        return binascii.a2b_base64(s)
    binascii.Error: Incorrect padding
    

    Incorrect padding:填充不正确

    以下为base64.py文件中方法定义

    def b64decode(s, altchars=None, validate=False):
        """Decode the Base64 encoded bytes-like object or ASCII string s.
    
        Optional altchars must be a bytes-like object or ASCII string of length 2
        which specifies the alternative alphabet used instead of the '+' and '/'
        characters.
    
        The result is returned as a bytes object.  A binascii.Error is raised if
        s is incorrectly padded.
    
        If validate is False (the default), characters that are neither in the
        normal base-64 alphabet nor the alternative alphabet are discarded prior
        to the padding check.  If validate is True, these non-alphabet characters
        in the input result in a binascii.Error.
        """
        s = _bytes_from_decode_data(s)
        if altchars is not None:
            altchars = _bytes_from_decode_data(altchars)
            assert len(altchars) == 2, repr(altchars)
            s = s.translate(bytes.maketrans(altchars, b'+/'))
        if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s):
            raise binascii.Error('Non-base64 digit found')
        return binascii.a2b_base64(s)
    

    原文:    

    Optional altchars must be a bytes-like object or ASCII string of length 2 which specifies the alternative alphabet used instead of the '+' and '/' characters.

    翻译:

    可选altchars必须是长度为2的对象或ASCII字符串之类的字节它指定使用的替代字母表,而不是“+”和“/”字符。

    原因分析:

    传入的参数的长度不是2的对象,在参数最后加上等于号"="(一个或者两个)

    修改后代码:

    result = b64decode("aHR0cCUzQSUyRiUyRnZpZGVvLnlqZjEzOC5jb20lM0E4MDkxJTJGMjAxODEyMzElMkYyd3prQjRGbSUyRmluZGV4Lm0zdTg=")
    print(type(result))
    print(result)

    运行成功!!!

    执行结果:

    <class 'bytes'>
    b'http%3A%2F%2Fvideo.yjf138.com%3A8091%2F20181231%2F2wzkB4Fm%2Findex.m3u8'

    展开全文
  • plt.scatter() 参数 ​​​​​​ #plt.scatter() 散点图 #plt.scatter(x,y,s=20,c = None,marker = 'o',cmap = none,norm = none,vmin = none,vmax = none,alpha = none,linewidths = none,verts = none,...
  • conv2d(input, filter, strides, padding, use_cudnn_on_gpu=True, data_format="NHWC", dilations=[1, 1, 1, 1], name=None) """Computes a 2-D convolution given 4-D `input` and `...
  • Python pip distribute

    千次阅读 2016-05-09 16:37:20
    python包管理工具 http://blog.csdn.net/shanliangliuxing/article/details/10114911 转自:http://jiayanjujyj.iteye.com/blog/1409819   刚开始学习Python时,在看文档和别人的blog介绍...
  • Python PrettyTable 模块(美化库)

    万次阅读 2017-12-11 15:40:14
    Python PrettyTable 模块 简介安装示例使用 创建表 直接创建从已有文件创建 CSVHTMLSQL 添加元素 按行添加按列添加 输出格式 ASCII码表 直接输出无表格框输出 HTML表选择子表表排序 ...
  • padding 不难发现,用3×3的核对一副6×6的图像进行卷积,得到的是4×4的图,图片缩小了!那怎么办呢?我们可以把原图扩充一圈,再卷积,这个操作叫padding。 事实上,原图为n×n,卷积核为f×f,最终结果图大小...
  • boost中静态库编译没有-fPIC选项的问题解决方案 序章:问题  使用libboostpython.so动态链接是没有问题的,.../usr/bin/ld: libboost_python.a(from_python.o): relocation R_X86_64_32 against`.rodata.str
  • python3实现AES加密

    万次阅读 多人点赞 2020-06-03 17:54:52
    这几天研究了一下 python 实现 AES 加密,有很多坑 AES 加密的参数及其条件 这个 AES 加密的主要坑就在于这些条件, 首先 aes 加密有一下几个参数 秘钥:加密的时候用秘钥,解密的时候需要同样的秘钥才能解出来 ...
  • python函数——序列预处理pad_sequences()序列填充

    万次阅读 多人点赞 2018-12-11 16:52:11
    python函数 系列目录:python函数——目录 0. 前言 为了实现的简便,keras只能接受长度相同的序列输入。因此如果目前序列长度参差不齐,这时需要使用pad_sequences()。该函数是将序列转化为经过填充以后的一个长度...
  • Python 函数两括号()() ()(X)的语法含义

    千次阅读 多人点赞 2018-07-30 21:11:20
    在写吴恩达《深度学习》课程编程题时,见到这样的用法: def model(input_shape): # Define the input placeholder as a tensor with shape input_shape. Think of this as your input image!...
  • 卷积步长strides参数的具体解释

    万次阅读 多人点赞 2017-11-16 15:25:01
    conv1 = tf.nn.conv2d(input_tensor,conv1_weights,strides=[1,1,1,1],padding='SAME') 这是一个常见的卷积操作,其中strides=【1,1,1,1】表示滑动步长为1,padding=‘SAME’表示填0操作 当我们要设置步长为2时,...
  • Python - MD5, AES128 加密

    千次阅读 2019-09-24 12:27:11
    Python - MD5, AES128 加密 Max.Bai 2017-04 1. MD5 加密 import hashlib src = 'sourcestringxxxxxxx' hlib = hashlib.md5() hlib.update(src) # py2.7 # python3 需要转码 # b = src.encode(encoding='...
  • 使用散点图矩阵图,可以两两发现特征之间的联系scatter_matrix(frame, alpha=0.5, c,figsize=None, ax=None, diagonal='hist', marker='.', density_kwds=None,hist_kwds=None, range_padding=0.05, **kwds)1。...
  • 平时不注意的细节,别人一问的时候就会很懵逼,所以认真对待每一个参数。 先看一下 tensorflow中自带的卷积操作是什么样子的呢? https://tensorflow.google.cn/api_docs/python/tf/nn/conv2d tf.nn.conv2d( ...
  • python实现卷积操作

    千次阅读 2020-04-09 09:49:58
    文章目录调用tf.nn.conv2d()实现卷积自己实现卷积函数 我们知道,tensorflow里面自带卷积函数,tf.nn.conv2d()就可以实现相关功能,本文主要是自己...这里说明一下conv2d的定义及参数含义: 参考 【定义:】 tf.n...
  • Python PrettyTable 模块

    万次阅读 2017-03-25 23:33:29
    Python PrettyTable 模块Python PrettyTable 模块 简介 安装 示例 使用 创建表 直接创建 从已有文件创建 CSV HTML SQL 添加元素 按行添加 按列添加 输出格式 ASCII码表 直接输出 无表格框输出 HTML表 选择子表 表...
  • Python String format()

    千次阅读 2019-03-23 02:29:44
    @[toc](Python String format()) 语法 format()方法的语法为: template.format(p0, p1, ..., k0=v0, k1=v1, ...) 其中p0,p1,…是位置参数,而k0,k1…是关键参数,有着v0,v1…得值 而且,template是混合了格式...
1 2 3 4 5 ... 20
收藏数 19,585
精华内容 7,834
关键字:

padding参数 python