论文复现过程中的一些问题总结

1、numpy.reshape

numpy.reshape(a, newshape, order='C')

在不更改其数据的情况下为数组赋予新形状。

  • a:

    数组——需要处理的数据

  • newshape :

    新的格式——整数或整数数组,如 (2,3) 表示2行3列。新的形状应该与原来的形状兼容,即行数和列数相乘后等于a中元素的数量。如果是整数,则结果将是长度的一维数组,所以这个整数必须等于a中元素数量。若这里是一个整数数组,那么其中一个数据可以为-1。在这种情况下,这个个值python会自动从根据第二个数值和剩余维度推断出来

  • order:

    可选范围为{‘C’, ‘F’, ‘A’}。使用索引顺序读取a的元素,并按照索引顺序将元素放到变换后的的数组中。如果不进行order参数的设置,默认参数为C

    1. “C”:指的是用类C写的读/索引顺序的元素,最后一个维度变化最快,第一个维度变化最慢。以二维数组为例,简单来讲就是横着读,横着写,优先读/写一行
    2. “F”:是指用FORTRAN类索引顺序读/写元素,最后一个维度变化最慢,第一个维度变化最快。竖着读,竖着写,优先读/写一列。注意,“C”和“F”选项不考虑底层数组的内存布局,只引用索引的顺序;
    3. “A”:选项所生成的数组的效果与原数组a的数据存储方式有关,如果数据是按照FORTRAN存储的话,它的生成效果与”F“相同,否则与“C”相同

2、torch.nn.Unfold:滑动裁剪

从批处理输入张量中提取滑动局部块。

torch.nn.Unfold(kernel_size, dilation=1, padding=0, stride=1)
  1. kernel_size:滑动窗口的size
  2. stride:空间维度上滑动的步长,Default: 1
  3. padding:在输入的两侧添加的隐式零填充. Default: 0
  4. dilation:空洞卷积的扩充率,Default: 1

在这里插入图片描述

torch.nn.Unfold按照官方的说法,既从一个batch的样本中,提取出滑动的局部区域块,也就是卷积操作中的提取kernel filter对应的滑动窗口。

  1. 由上可知,torch.nn.Unfold的参数跟nn.Conv2d的参数很相似,即,kernel_size(卷积核的尺寸),dilation(空洞大小),padding(填充大小)和stride(步长)
  2. 官方解释中:unfold的输入为 ( N , C , H , W ) (N,C,H,W) (N,C,H,W),其中 N N N为batch_size, C C C是channel个数, H H H W W W分别是channel的长宽。
    unfold输出为 ( N , C × ∏ (  kernel_size  ) , L ) \left(N, C \times \prod(\text { kernel\_size }), L\right) (N,C×( kernel_size ),L),其中 ∏ (  kernel_size  ) \prod(\text { kernel\_size }) ( kernel_size ) k e r n e l _ s i z e kernel\_size kernel_size长宽的乘积。 L L L ( H , W ) (H,W) (H,W)根据 k e r n e l _ s i z e kernel\_size kernel_size尺寸滑动裁剪后,得到的区块的数量
  • Input: ( N , C , ∗ ) (N,C,*) (N,C,)

  • Output: ( N , C × ∏ (  kernel_size  ) , L ) \left(N, C \times \prod(\text { kernel\_size }), L\right) (N,C×( kernel_size ),L)
    L = ∏ d ∈ ( 0 , 1 ) ⌊  feature_size  [ d ] + 2  padding  [ d ] −  dilation  [ d ] ⋅ (  kernel_size  [ d ] − 1 ) − 1  stride [ d ] + 1 ⌋ . L=\prod_{d \in(0,1)}\left\lfloor \frac{\text { feature\_size }[\mathrm{d}]+2 \text { padding }[\mathrm{d}]-\text { dilation }[\mathrm{d}] \cdot(\text { kernel\_size }[\mathrm{d}]-1)-1}{\text { stride}[\mathrm{d}]}+1\right\rfloor. L=d(0,1) stride[d] feature_size [d]+2 padding [d] dilation [d]( kernel_size [d]1)1+1.

inputs = torch.randint(0,9,(1, 2, 4, 4))
'''
tensor([[[[4, 7, 1, 4],
          [4, 2, 8, 1],
          [3, 6, 0, 8],
          [0, 7, 6, 3]],
         [[4, 8, 4, 6],
          [6, 6, 6, 3],
          [7, 7, 5, 0],
          [2, 1, 7, 7]]]])
'''
unfold  = torch.nn.Unfold(kernel_size=(2, 2), stride=2)
patches = unfold(inputs.float())
'''
tensor([[[4., 1., 3., 0.],
         [7., 4., 6., 8.],
         [4., 8., 0., 6.],
         [2., 1., 7., 3.],
         [4., 4., 7., 5.],
         [8., 6., 7., 0.],
         [6., 6., 2., 7.],
         [6., 3., 1., 7.]]])
'''

在这里插入图片描述


3、灰度图和彩图的区别

3.1、属性上的区别

先看一张灰度图的属性:

在这里插入图片描述

灰度图的位深度为8

再看彩图的属性:

在这里插入图片描述

彩图的位深度为24

3.2、读取后存储的区别

from skimage import io

分别读取这两张图像:

gray = io.imread("test/lena.BMP")
color = io.imread("test/lena.png")

查看变量属性:

在这里插入图片描述


4、np.unravel_index:获取索引

获取一个/组int类型的索引值在一个多维数组中的位置。

A = np.random.randint(0,10,size=(2,3))
'''
array([[1, 3, 8],
       [0, 4, 2]])
'''
ind_max = np.argmax(A) #2

此时得到的索引是将A数组flattern(展成一维数组)后的索引:

A.flatten()
'''
[1 3 8 0 4 2]
'''

可以看到索引确实是2。

那如何得到对应的原数组的索引呢?

ind_max_src = np.unravel_index(ind_max, A.shape) #(0, 2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值