numpy pytorch 拾遗

Transform的normalize参数含义

https://blog.csdn.net/weixin_44023658/article/details/105936225

torchvision.transforms.ToTensor

 ( Converts a PIL Image or numpy.ndarray (H x W x C) in the range [0, 255] to  a torch.FloatTensor of shape (C x H x W) in the range [0.0, 1.0] )

常常在代码中看到normallize在ToTensor之后。【0,1】->【-1,1】

normalize = T.Normalize(mean = [0.485, 0.456, 0.406], 
                         std = [0.229, 0.224, 0.225])

 

【PyTorch】模型可视化之 pytorch-summary

https://blog.csdn.net/baishuo8/article/details/90640110


pip install torchsummary
from torchsummary import summary
...
summary(your_model, input_size=(channels, H, W))

torch.shape 

torch.shape 和 torch.size() 输出结果相同。

tensor 2 numpy

a = torch.ones(5)
b = a.numpy()

numpy 2 tensor

a = np.ones(5)
b = torch.from_numpy(a)

 

numpy 初始化图片

s= np.random.randint(0,255,(300,400,3),dtype = np.uint8)
plt.imshow(s)


img = np.zeros(shape = (300,400,3),dtype = np.uint8)

 

numpy换通道

# A是numpy数据类型
A = A.transpose(0,1,2)  # 没有改变:(h,w,c)
A = A.transpose(2,0,1)   # 转换为:(c,h,w)

查看Pytorch是否使用GPU

# 返回当前设备索引
torch.cuda.current_device()

# 返回GPU的数量
torch.cuda.device_count()

# 返回gpu名字,设备索引默认从0开始
torch.cuda.get_device_name(0)

# cuda是否可用
torch.cuda.is_available()

13. numpy.permute()

 

12.deepcopy()

 

11. numpy.hstack() numpy.vstack()

 

10 autograd.variable

Tensor是Pytorch的一个完美组件(可以生成高维数组),但是要构建神经网络还是远远不够的,我们需要能够计算图的Tensor,那就是Variable。Variable是对Tensor的一个封装,操作和Tensor是一样的

Varibale包含三个属性:

  • data:存储了Tensor,是本体的数据
  • grad:保存了data的梯度,本事是个Variable而非Tensor,与data形状一致
  • grad_fn:指向Function对象,用于反向传播的梯度计算之用, 这个Variable是通过什么方式得到的.grad_fn。

之所以需要将tensor转化成variable

因为pytorch中tensor(张量)只能放在CPU上运算,而(variable)变量是可以只用GPU进行加速计算的。 

tensor不能反向传播,variable可以反向传播。

Variable计算时,它会逐渐地生成计算图。

这个图就是将所有的计算节点都连接起来,最后进行误差反向传递的时候,一次性将所有Variable里面的梯度都计算出来,而tensor就没有这个能力。

1.将Numpy矩阵转化为Tensor张量

A= torch.from_numpy(B)

2.将Tensor张量转化为Numpy矩阵

 B = A.numpy( )

3.将Tensor转化为Variable

C = Variable(A)

4.将Variable转化为Tensor

A = C.data

autograd根据用户对Variable的操作来构建其计算图:

1、requires_grad

variable默认是 不被求导的,即requires_grad属性默认为False,如果某一个节点的requires_grad为True,那么所有依赖它的节点requires_grad都为True。

2、volatile

variable的volatile属性默认为False,如果某一个variable的volatile属性被设为True,那么所有依赖它的节点volatile属性都为True。

volatile属性为True的节点不会求导volatile的优先级比requires_grad高

3、retain_graph

多次反向传播(多层监督)时,梯度是累加的。一般来说,单次反向传播后,计算图会free掉,也就是反向传播的中间缓存会被清空【这就是动态图的特点】。

为进行多次反向传播需指定retain_graph=True来保存这些缓存。

4、backward()

反向传播,求解Variable的梯度。放在中间缓存中。

9.shape()函数 


读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度,相当于行数。它的输入参数可以是一个整数表示维度,也可以是一个矩阵。shape函数返回的是一个元组tuple,表示数组(矩阵)的维度/ 形状,例子如下:

w.shape[0]返回的是w的行数
w.shape[1]返回的是w的列数
df.shape():查看行数和列数

原文链接:https://blog.csdn.net/qq_29831163/article/details/89841367

 

8. numpy.reshape(a, new shape, order= 'C')

a:数组--需要处理的数据

newshape:新的格式--整数或整数数组,如(2,3)表示2行3列,新的形状应该与原来的形状兼容,即行数和列数相乘后等于a中元素的数量

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

reshape(-1,1):

数组新的shape属性应该要与原来的配套,如果等于-1的话,那么Numpy会根据剩下的维度计算出数组的另外一个shape属性值。

np.reshape(r, (-1,1),order='F')

r1= r.reshape( (-1,1),order='F')

F是优先对列信息进行操作,而C是优先行信息操作。如果未对r的格式进行设置,那么我们rashape的时候以“A”的顺序进行order的话,它的效果和“C”相同。

r的存储方式进行修改,修改为类Fortan的方式进行存储,我们rashape的时候以“A”的顺序进行order的话,它的效果和“F”相同

https://www.jianshu.com/p/fc2fe026f002

7. tensor.data.cpu().numpy().reshape(-1,1)

t.numpy()

将Tensor变量转换为ndarray变量,其中t是一个Tensor变量,可以是标量,也可以是向量,转换后dtype与Tensor的dtype一致。

.cpu()

将数据的处理设备从其他设备(如.cuda()拿到cpu上),不会改变变量类型,转换后仍然是Tensor变量。

x.data和x.detach()

如果需要修改 tensor的数值,但是又不希望被autograd记录,那么我么可以对 tensor.data 进行操作

新分离出来的tensor的requires_grad=False,即不可求导时两者之间没有区别,

但是当requires_grad=True的时候的两者之间的是有不同:x.data不能被autograd追踪求微分,但是x.detach可以被autograd()追踪求导。

.data时属性,detach()是方法。 x.data不是安全的,x.detach()是安全的。

 

6. expand_as()

expand()函数:

(1)函数功能: 

      expand()函数的功能是用来扩展张量中某维数据的尺寸,它返回输入张量在某维扩展为更大尺寸后的张量。

      扩展张量不会分配新的内存,只是在存在的张量上创建一个新的视图(关于张量的视图可以参考博文:由浅入深地分析张量),而且原始tensor和处理后的tensor是不共享内存的。

      expand()函数括号中的输入参数为指定经过维度尺寸扩展后的张量的size。

expand_as()函数:

     (1)函数功能:

       expand_as()函数与expand()函数类似,功能都是用来扩展张量中某维数据的尺寸,区别是它括号内的输入参数是另一个张量,作用是将输入tensor的维度扩展为与指定tensor相同的size。


————————————————
版权声明:本文为CSDN博主「小娜美要努力努力」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39504171/article/details/106090626

5. 

torch.squeeze()

这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的数去掉第一个维数为一的维度之后就变成(3)行。

squeeze(a)就是将a中所有为1的维度删掉。不为1的维度没有影响。a.squeeze(N) 就是去掉a中指定的维数为一的维度。还有一种形式就是b=torch.squeeze(a,N) a中去掉指定的定的维数为一的维度。

torch.unsqueeze()

这个函数主要是对数据维度进行扩充。给指定位置加上维数为一的维度,比如原本有个三行的数据(3),在0的位置加了一维就变成一行三列(1,3)。

a.squeeze(N) 就是在a中指定位置N加上一个维数为1的维度。还有一种形式就是b=torch.squeeze(a,N) a就是在a中指定位置N加上一个维数为1的维度


原文链接:https://blog.csdn.net/xiexu911/article/details/80820028

4. tensor.detach()


返回一个新的tensor,从当前计算图中分离下来。但是仍指向原变量的存放位置,不同之处只是requirse_grad为false.得到的这个tensir永远不需要计算器梯度,不具有grad.

即使之后重新将它的requires_grad置为true,它也不会具有梯度grad.这样我们就会继续使用这个新的tensor进行计算,后面当我们进行反向传播时,到该调用detach()的tensor就会停止,不能再继续向前进行传播.

注意:

使用detach返回的tensor和原始的tensor共同一个内存,即一个修改另一个也会跟着改变。

当使用detach()分离tensor但是没有更改这个tensor时,并不会影响backward()

当使用detach()分离tensor,然后用这个分离出来的tensor去求导数,会影响backward(),会出现错误

原文链接:https://blog.csdn.net/qq_31244453/article/details/112473947

 

tensor.detach_()
将一个tensor从创建它的图中分离,并把它设置成叶子tensor

其实就相当于变量之间的关系本来是x -> m -> y,这里的叶子tensor是x,但是这个时候对m进行了m.detach_()操作,其实就是进行了两个操作:

将m的grad_fn的值设置为None,这样m就不会再与前一个节点x关联,这里的关系就会变成x, m -> y,此时的m就变成了叶子结点
然后会将m的requires_grad设置为False,这样对y进行backward()时就不会求m的梯度

总结:其实detach()和detach_()很像,两个的区别就是detach_()是对本身的更改,detach()则是生成了一个新的tensor

比如x -> m -> y中如果对m进行detach(),后面如果反悔想还是对原来的计算图进行操作还是可以的

但是如果是进行了detach_(),那么原来的计算图也发生了变化,就不能反悔了
 

https://blog.csdn.net/qq_27825451/article/details/95498211?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

3. view

https://zhuanlan.zhihu.com/p/87856193?from_voters_page=true

pytorch中view函数的作用为重构张量的维度

  • torch.view(参数a,参数b,...)

在上面例子中参数a=3和参数b=2决定了将一维的tt1重构成3x2维的张量。

  • torch.view(-1),则原张量会变成一维的结构。
  • torch.view(参数a,-1),则表示在参数b未知,参数a已知的情况下自动补齐列向量长度,在这个例子中a=2,tt3总共由6个元素,则b=6/2=3。

x = x.view(x.size(0), -1)  这句话的出现就是为了将前面多维度的tensor展平成一维。

  • 如(batchsize,channels,x,y),x.size(0)指batchsize的值。x = x.view(x.size(0), -1)简化x = x.view(batchsize, -1)。

2. tensor.size()

Size(),  size(0)等指的是

size()函数返回张量的各个维度的尺度。

squeeze()

squeeze(input, dim=None),如果不给定dim,则把input的所有size为1的维度给移除;如果给定dim,则只移除给定的且size为1的维度。

1. net.apply(init_weight)

pytorch系列10 --- 如何自定义参数初始化方式 ,apply()

https://blog.csdn.net/dss_dssssd/article/details/83990511

apply(fn)[SOURCE]
Applies fn recursively to every submodule (as returned by .children()) as well as self. Typical use includes initializing the parameters of a model (see also torch.nn.init).

Parameters
fn (Module -> None) – function to be applied to each submodule

Returns
self

Return type
Module
 

Example:

>>> def init_weights(m):
>>>     print(m)
>>>     if type(m) == nn.Linear:
>>>         m.weight.data.fill_(1.0)
>>>         print(m.weight)
>>> net = nn.Sequential(nn.Linear(2, 2), nn.Linear(2, 2))
>>> net.apply(init_weights)
Linear(in_features=2, out_features=2, bias=True)
Parameter containing:
tensor([[ 1.,  1.],
        [ 1.,  1.]])
Linear(in_features=2, out_features=2, bias=True)
Parameter containing:
tensor([[ 1.,  1.],
        [ 1.,  1.]])
Sequential(
  (0): Linear(in_features=2, out_features=2, bias=True)
  (1): Linear(in_features=2, out_features=2, bias=True)
)
Sequential(
  (0): Linear(in_features=2, out_features=2, bias=True)
  (1): Linear(in_features=2, out_features=2, bias=True)
)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值