Transform的normalize参数含义
https://blog.youkuaiyun.com/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.youkuaiyun.com/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.youkuaiyun.com/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。
————————————————
版权声明:本文为优快云博主「小娜美要努力努力」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/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.youkuaiyun.com/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.youkuaiyun.com/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_(),那么原来的计算图也发生了变化,就不能反悔了
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.youkuaiyun.com/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 submoduleReturns
selfReturn 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)
)