Python也有自己的三目运算符:
条件为真时的结果 if 判段的条件 else 条件为假时的结果
.A 将矩阵转化为数组
报错:'local variable 'dataset' referenced before assignment'
解决方案:dataset = None
转义字符
https://blog.csdn.net/sj349781478/article/details/78363740
split方法
stringname.split(string, int)
前者string指的是遇到哪个字符进行分割,int指的是整个string分割几次。返回一个list。从前往后开始分。stringname.rsplit(string, int)
则是从后往前分。
python去掉了long数据类型。数据类型之间的转换用int()
,str()
, float()
numpy数据类型转换:numpy.astype(‘int32’), numpy.astype(‘float’)
numpy和tensor互相转化:tensor.from_numpy(numpy)
复制文件
copyfile(source_path, target_path)
获取某个文件夹中所有文件名
file_dir = "F:/ant"
for root, dirs, files in os.walk(file_dir, topdown=False):
print(root) # 当前目录路径
print(dirs) # 当前目录下所有子目录
print(files) # 当前路径下所有非目录子文件
list合并方法:+,append,extend,切片
注意,append是将两个list拼成一个[list, list]。而extend是将两个list拼成一个list。
Python3中列表list合并的四种方法
计数器Counter类:用于追踪值的出现次数
统计列表中不同元素的数量:使用set
list=[1,1,2,2,3]
print(list)
set1=set(list)
print(set1)
print(len(set1))
得到结果:
[1, 1, 2, 2, 3]
{1, 2, 3}
3
https://www.cnblogs.com/xsxsz/p/11361721.html
***https://blog.csdn.net/weixin_44524040/article/details/95221757
https://blog.csdn.net/weixin_44524040/article/details/95221757
如何安装openCV
pip install opencv-python
但是外网线路导致下载过慢
此时可以指定镜像pip install -i http://mirrors.aliyun.com/pypi/simple/ opencv-python
但是可能提示不信任,此时使用
pip install -i http://mirrors.aliyun.com/pypi/simple/ opencv-python --trusted-host mirrors.aliyun.com
pytorch的tensor,Image,numpy和opencv四种格式的相互转换
Pytorch:将图像tensor数据用Opencv显示
python opencv CV_8UC1与CV_32SC1类型相关错误
因为自定义卷积的元素值没有进行归一化,图像像素超过255,而且变为浮点型。需要归一化。可以参考上面的链接,里面做了归一化。
opencv中伪彩色applyColorMap函数绘制热力图
https://blog.csdn.net/kingkee/article/details/92785118
借鉴CAM pytorch版本的写法:
https://github.com/chaeyoung-lee/pytorch-CAM/blob/master/update.py
https://blog.csdn.net/sinat_37532065/article/details/103362517
visdom简易教程
python -m visdom.server
https://www.cnblogs.com/fanghao/p/10256287.html
https://ptorch.com/news/77.html
https://www.cnblogs.com/wanghui-garcia/p/10658565.html
Pytorch save_image和make_grid函数详解
make_grid用于把几个图像按照网格排列的方式绘制出来,save_image用于保存图像。这两个函数的函数签名差不多,所以只说一个。
Pytorch torchvision.utils.make_grid()用法
PyTorch模型训练特征图可视化
plt.imshow(image) #image表示待处理的图像
plt.show()
\begin{figure}[htb]
\centering
% Requires \usepackage{graphicx}
\includegraphics[width=9cm, height=6cm]{s.eps}\\
\caption{(color online)
}\label{straddltimeScale}
\end{figure}
[h] 表示的当前位置(here),也就是说图片排在你设置的当前位置,但是如果这一页的空间不足以放下这个图片,此时图片会转到下一页。
[t] 顶端(top)。此时系统会将图片放置在页面的顶部。
[b] 底部. (bottom) 这里是优先将图片放置在底部,也就是页面的底部。
[p] 这个是将图片设置为浮动状态,也就是可以根据系统排版的,自动放置图片的位置。
[htb] 优先放置在最佳位置,然后将其放在顶端最后放在底部。我们知道一般对于论文的输入可不是几个简单的文字和图片,可能还要有大量的公式,所以几个简单的命令一般会造成论文存在大量的空隙,所以我们一般将上面的命令结合着使用。
pytorch: Tensor 常用操作
这个写的很全!!赞!
pytorch入门教程(五):Tensor统计信息操作
Pytorch学习之旅(0)——张量的简介及创建
一、点乘
点乘都是broadcast的,可以用torch.mul(a, b)实现,也可以直接用*实现。
二、矩阵乘
矩阵相乘有torch.mm和torch.matmul两个函数。其中前一个是针对二维矩阵,后一个是高维。当torch.mm用于大于二维时将报错。
Pytorch:torch.nonzero()函数
得到非0元素的索引。有两种返回方法,一种是返回张量,输出的每一行为非零元素的索引(坐标),另一种是返回tuple,则返回的是将坐标拆开,如原数据有4维,则返回4个张量,每个张量中是对应维度的非0索引。
比如,二维数组x,方法1返回:idx = [[0, 0], [0, 1], [1, 2]],则方法2返回idx = [tensor[0,0,1], tensor[0,1, 2]]. 用第二个方法的好处是,可以将其作为索引取出原数据x的值。比如,我想得到x的非零数据,只需x[idx[0], idx[1]]即可。
torch.nonzero的理解
方法4比较有启发性:
exist = (data > 0) * 1.0
factor = np.ones(data.shape[1])
res = np.dot(exist, factor)
新建一个全为1的矩阵,与原矩阵(全为0和1)相乘,那么就直接得到了原矩阵每一行的非零数个数。
numpy按元素相乘: np.multiply(a,b)
torch按元素相乘:torch.mul(a, b)
pytorch基本运算:加减乘除、对数幂次等
加减乘除(按元素)
a + b = torch.add(a, b)
a - b = torch.sub(a, b)
a * b = torch.mul(a, b)
a / b = torch.div(a, b)
矩阵相乘
torch.mm(a, b) # 此方法只适用于2维
torch.matmul(a, b)
a @ b = torch.matmul(a, b) # 推荐使用此方法
用处:
降维:比如,[4, 784] @ [784, 512] = [4, 512]
大于2d的数据相乘:最后2个维度的数据相乘:[4, 3, 28, 64] @ [4, 3, 64, 32] = [4, 3, 28, 32]
前提是:除了最后两个维度满足相乘条件以外,其他维度要满足广播条件,比如此处的前面两个维度只能是[4, 3]和[4, 1]
PyTorch 的官方介绍是一个拥有强力GPU加速的张量和动态构建网络的库,其主要构件是张量,所以我们可以把 PyTorch 当做 NumPy 来用,PyTorch 的很多操作好 NumPy 都是类似的,但是因为其能够在 GPU 上运行,所以有着比 NumPy 快很多倍的速度。
看一下两者之间的转换:
import torch
import numpy as np
# 创建一个 numpy ndarray
numpy_tensor = np.random.randn(10, 20)
#我们可以使用下面两种方式将numpy的ndarray转换到tensor上
pytorch_tensor1 = torch.Tensor(numpy_tensor)
pytorch_tensor2 = torch.from_numpy(numpy_tensor)
#同时我们也可以使用下面的方法将 pytorch tensor 转换为 numpy ndarray
# 如果 pytorch tensor 在 cpu 上
numpy_array = pytorch_tensor1.numpy()
# 如果 pytorch tensor 在 gpu 上
numpy_array = pytorch_tensor1.cpu().numpy()
pytorch 中tensor在CPU和GPU之间转换,以及numpy之间的转换
注意将numpy转换为tensor后,可能device属性仍然是cpu,此时需要.cuda() normpdf = torch.Tensor(normpdf).cuda()
CPU tensor转GPU tensor:
cpu_imgs.cuda()
GPU tensor 转CPU tensor:
gpu_imgs.cpu()
numpy转为CPU tensor:
torch.from_numpy( imgs )
CPU tensor转为numpy数据:
cpu_imgs.numpy()
note:GPU tensor不能直接转为numpy数组,必须先转到CPU tensor。
如果tensor是标量的话,可以直接使用 item() 函数(只能是标量)将值取出来:
print loss_output.item()
torch.max(input, dim)
或input.max(dim)
时,即指定维度时,才会生成两个东西,第一个是最大值,第二个是index。不指定维度则只生成最大值。PyTorch学习笔记——repeat()和expand()区别
PyTorch中torch.linspace的详细用法
该方法可以实现将原始的排序后的index与一个等差数列对应相加,就会从[0,1,2], [2, 1, 0]变为[0,1,2],[5,4,3]。
用法同上,用于实现index等差数列来操作tensor的索引
X[:,0]
# 二维数组取第1维所有数据
X[:,1]
# 第2列
X[0,:]
# 第1行
X[3,:]
# 第三行
X[1:4,:]
# 第一二三行
index = [2, 3]
x = x[index, :]
# 将第一个维度的数据拆成index的维度。即变为x[2,3,:](最后一个维度不变)
https://zhuanlan.zhihu.com/p/64990232
nn.Module, nn.ModuleList, nn.Sequential,这些类我们称之为容器 (containers),因为我们可以添加模块 (module) 到它们之中。
你可以把任意 nn.Module 的子类 (比如 nn.Conv2d, nn.Linear 之类的) 加到这个 list 里面,方法和 Python 自带的 list 一样,无非是 extend,append 等操作。但不同于一般的 list,加入到 nn.ModuleList 里面的 module 是会自动注册到整个网络上的,同时 module 的 parameters 也会自动添加到整个网络中。
为了简单,我需要使用for循环构建3个几乎一模一样的网络,一开始我写的是:
self.mergeAtt = [
nn.Sequential(
nn.Conv2d(in_channels=256, out_channels=128, kernel_size=1, stride=1, bias=False), # x0-->[64, 128, 7, 7]
nn.Conv2d(in_channels=128, out_channels=128, kernel_size=1, stride=1, bias=False), # x0-->[64, 128, 7, 7]
nn.ReLU(),
nn.Conv2d(in_channels=128, out_channels=512, kernel_size=scale_w[i], stride=1, bias=False),# x0-->[64, 512, 1, 1]
nn.ReLU(),
# nn.Flatten(), # x0-->[64, 512]
# nn.Linear(512, num_classes)) # x0-->[64, 10]
nn.Conv2d(in_channels=512, out_channels=num_classes*16, kernel_size=1, stride=1, bias=False)) # x0-->[64, 160]
for i in range(scale_num)]
但这样会报错:
Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same
这说明在python自带的列表中创建的网络是放在cpu上的,所以需要使用 nn.ModuleList,将它理解为pytorch版本的列表,专门用于放网络。
self.mergeAtt = nn.ModuleList([
nn.Sequential(
nn.Conv2d(in_channels=256, out_channels=128, kernel_size=1, stride=1, bias=False), # x0-->[64, 128, 7, 7]
nn.Conv2d(in_channels=128, out_channels=128, kernel_size=1, stride=1, bias=False), # x0-->[64, 128, 7, 7]
nn.ReLU(),
nn.Conv2d(in_channels=128, out_channels=512, kernel_size=scale_w[i], stride=1, bias=False),# x0-->[64, 512, 1, 1]
nn.ReLU(),
# nn.Flatten(), # x0-->[64, 512]
# nn.Linear(512, num_classes)) # x0-->[64, 10]
nn.Conv2d(in_channels=512, out_channels=num_classes*16, kernel_size=1, stride=1, bias=False)) # x0-->[64, 160]
for i in range(scale_num)])
None相当于在数组中多加一个维度。@是矩阵相乘。*用来对tensor进行矩阵进行逐元素相乘。
priors = x[None, :, :, None, :] @ self.route_weights[:, None, :, :, :]
release GPU cache: torch.cuda.empty_cache()
https://www.zhihu.com/question/361602016
https://blog.csdn.net/qq_27261889/article/details/86304061/
Height′ =Height+(Stride−1)∗(Height−1)
https://www.cnblogs.com/king-lps/p/10904552.html
flops和mac的关系
https://www.cnblogs.com/yqpy/p/12585331.html
model.parameters()与model.state_dict()
https://blog.csdn.net/loseinvain/article/details/88139435
https://blog.csdn.net/qq_33590958/article/details/111176223
写的超好!
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
其他:torch.utils.data.DataLoader()详解
PyTorch—torch.utils.data.DataLoader 数据加载类
我感觉这个参数没啥用。
Pytorch.utils.data.DataLoader中collate_fn参数的使用
torch.utils.data.dataloader参数collate_fn简析
想要改变获取数据的顺序,可以自定义sampler。
Sampler类与4种采样方式
Pytorch Sampler详解
比如,这次我要实现测试集一个比较与众不同的获取数据顺序,需要每拿一张图(按照原顺序拿),再从测试集中随机抽取五十张图和它放在一起作为一个batch。
于是,定义了一个继承自sampler类的采样器,修改了其__iter__方法。
torch.randperm():返回一个0到n-1的数组,数组中的数是0到n-1随机顺序排列,且不会出现重复。