记录下学习pytorch的各种概念。日积月累吧
1.CrossEntropyLoss
PyTorch-损失函数的损失函数。是log_softmax 和 nll_loss 方法的结合.
https://www.jianshu.com/p/e184663e2f8a
2.BatchNorm2d()
卷积层之后总会添加BatchNorm2d进行数据的归一化处理,这使得数据在进行Relu之前不会因为数据过大而导致网络性能的不稳定。很细节的看这个https://www.cnblogs.com/shuangcao/p/12795864.html
BN的本质原理:在网络的每一层输入的时候,又插入了一个归一化层,也就是先做一个归一化处理(归一化至:均值0、方差为1),然后再进入网络的下一层。不过文献归一化层,可不像我们想象的那么简单,它是一个可学习、有参数(γ、β)的网络层。
https://www.cnblogs.com/king-lps/p/8378561.html
3.append函数
append函数会在数组后加上相应的元素
4.pytorch的for循环
for i in range (a,b,1)作用
5.enumerate()
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
5.porch用opencv读取图片,打印出图片尺寸来
import cv2
image=cv2.imread("D:/shape.bmp")
print(image.shape[0])
print(image.shape[1])
print(image.shape[2])
结果
300
200
3
6.pytorch查看gpu是否可用 gpu数量
torch.cuda.is_available() torch.cuda.device_count()
7.numpy数据读取 用for 循环
a = np.ones((20,20))
for i in range(1,20):
for j in range(1,20):
a[i][j] = img[i][j]
print(a)
8.pytorch损失函数与激活函数的配对问题
BCEWithLogitsLoss = Sigmoid+BCELoss,当网络最后一层使用nn.Sigmoid时,就用BCELoss,当网络最后一层不使用nn.Sigmoid时,就用BCEWithLogitsLoss。
(BCELoss)BCEWithLogitsLoss用于单标签二分类或者多标签二分类,输出和目标的维度是(batch,C),batch是样本数量,C是类别数量,对于每一个batch的C个值,对每个值求sigmoid到0-1之间,所以每个batch的C个值之间是没有关系的,相互独立的,所以之和不一定为1。每个C值代表属于一类标签的概率。如果是单标签二分类,那输出和目标的维度是(batch,1)即可。
CrossEntropyLoss用于多类别分类,输出和目标的维度是(batch,C),batch是样本数量,C是类别数量,每一个C之间是互斥的,相互关联的,对于每一个batch的C个值,一起求每个C的softmax,所以每个batch的所有C个值之和是1,哪个值大,代表其属于哪一类。如果用于二分类,那输出和目标的维度是(batch,2)。
9.解决显卡内存溢出问题:RuntimeError: CUDA out of memory in pytorch
减少向显卡中放入的数据大小即可 batch_size
9.写路径存自己想要的图
source = 'data/test/'
路径 tpath=source + str(i)+'.png'
cv2.imwrite(tpath, img_y.astype(np.uint8))
10.增加tensor维度。在最前面增加1维
z = z.unsqueeze(0)
11.替换文件名中的某些字符。
str = "this is string example....wow!!! this is really string";
print str.replace("is", "was");
运行结果:thwas was string example....wow!!! thwas was really string
注意str本身没被改变
11.for循环跳不同步长
for i in range(1, 10, 2):
等价于
for (i=1;i<=10;i+=2
12.linux 下载了文件的安装包 怎么安装setup.py 文件
解压,然后运行 python setup.py build 再运行python setup.py install 就安装好了
13.在矩阵中查找符合某个条件的元素下标,
#print((true_masks == 2).nonzero())
14.在矩阵中查找符合某个条件的元素,将其修改为1,
true_masks[true_masks > 1] = 1
15.优化函数选择
Adam大法好,网上一堆写为啥他好。测试发现收敛速度确实远远快于SGD
16.实时查看GPU使用状态
watch -n 1 nvidia-smi 1s刷新一次
17.pytorch预训练方法
https://www.cnblogs.com/wmlj/p/9917827.html
https://blog.csdn.net/Vivianyzw/article/details/81061765
18.pytorch中的除法
a = 3
b = 2
a / b = 1.5;
a//b = 1
19.nn.Sequential(*layers)
类似于torch7中的Sequential,将每一个模块按照他们的顺序送入到nn.Sequential中 ,输入可以是一些列有顺序的模块
例如:
def __init__(self, in_channels, out_channels, num_layers):
super().__init__()
layers = [
nn.Conv2d(in_channels, in_channels // 2, 3, padding=1),
nn.BatchNorm2d(in_channels // 2),
nn.ReLU(inplace=True),
]
layers += [
nn.Conv2d(in_channels // 2, in_channels // 2, 3, padding=1),
nn.BatchNorm2d(in_channels // 2),
nn.ReLU(inplace=True),
] * num_layers
layers += [
nn.Conv2d(in_channels // 2, out_channels, 3, padding=1),
nn.BatchNorm2d(out_channels),
nn.ReLU(inplace=True),
]
self.encode = nn.Sequential(*layers)
def forward(self, x):
return self.encode(x)
20."block{}".format(i + 1)
"block{}".format(i + 1) 例如 i= 2 那么结果就是block3
21.nn.Sequential讲解
https://blog.csdn.net/dss_dssssd/article/details/82980222
22.x.view(x.size(0), -1)
将卷积结果x拉伸为一行。
23.pytorch torch.nn.AdaptiveAvgPool2d()用法
就是将输入的数据按照输出的尺寸进行一次自适应池化
具体例子:
>>>
# target output size of 5x7 (square)
>>> m
=
nn.AdaptiveAvgPool2d((
5
,
7
))
>>>
input
=
torch.randn(
1
,
64
,
8
,
9
)
>>> output
=
m(
input
)
>>> prin(output.shape)
结果为:
>>> torch.Size([1, 64, 5, 7])
24.骨架提取
from skimage import morphology
skeleton =morphology.skeletonize(image)
25.pytorch RuntimeError: Error(s) in loading state_dict for DataParall ...导入模型报错解决方法
根本原因是torch版本不一致
model.load_state_dict(model_dict,False) 后面加上这个false就可以了 是高版本的训练结果放到低版本去用 torch版本不一致
26.nn.Conved是2D卷积层,而F.conv2d是2D卷积操作。
例子:
import torch
from torch.nn import functional as F
"""手动定义卷积核(weight)和偏置"""
w = torch.rand(16, 3, 5, 5) # 16种3通道的5乘5卷积核
b = torch.rand(16) # 和卷积核种类数保持一致(不同通道共用一个bias)
"""定义输入样本"""
x = torch.randn(1, 3, 28, 28) # 1张3通道的28乘28的图像
"""2D卷积得到输出"""
out = F.conv2d(x, w, b, stride=1, padding=1) # 步长为1,外加1圈padding,即上下左右各补了1圈的0,
print(out.shape)
out = F.conv2d(x, w, b, stride=2, padding=2) # 步长为2,外加2圈padding
print(out.shape)
out = F.conv2d(x, w) # 步长为1,默认不padding, 不够的舍弃,所以对于28*28的图片来说,算完之后变成了24*24
print(out.shape)
27.看当前机器下所有python路径
whereis python
28.修改python环境变量方法
https://www.cnblogs.com/crazymagic/p/9132309.html