例如 x=torch.randn(1,2,3,4)
x.repeat(1,3,1,1)
经过repeat后的x为(1,6,3,4),也就是把第二个维度重复三次。
若为x.repeat(1,1,2,1),
则x为(1,2,6,4),就是把每行重复一次。
random.seed(args.seed)
np.random.seed(args.seed)
torch.manual_seed(args.seed)
torch.cuda.manual_seed(args.seed)
seed也就是随机种子,随机数的生成本质上是一个复杂的算法,算法开始需要一个初始值,而seed就是这个初始值,我们将一个初始值代入随机数生成,会返回两个结果,一个是通过计算产生的随机数,另外一个是计算下一个随机数所需要的随机种子,也就是说,如果保持输入的随机种子不变,random函数会返回相同的值。
具体例子如下:
随机种子在循环外,所以生成的四个随机数不同。
随机种子在循环内,所以生成的四个数是完全相同的,因为随机算法的初始值相同。
其中后两个是为CPU,GPU设置随机种子。
torch.max(tensor, dim=r_dim, keepdim=True)
图像转tensor
path = r'C:\Users\hwq\Desktop\data\1.png'
image = Image.open(path)
Trans = transforms.ToTensor()
image = Trans(image)
tensor的形状是C,H,W
tensor转图像
unloader = transforms.ToPILImage()
image1 = unloader(a)
今天看代码时遇到一个问题:
import torch.nn as nn
import torch
torch.manual_seed(1234)
class Embeddings(nn.Module):
def __init__(self,css=3):
super(Embeddings, self).__init__()
self.conv1 = nn.ModuleList([nn.Conv2d(in_channels=css,out_channels=css,kernel_size=1) for i in range(css)])
def forward(self,x):
x = self.conv1(x)
x = x.transpose(-1, -2)
return x
a=Embeddings()
b=torch.randn(1,3,5,5)
a(b)
代码看着没什么问题,但是在运行的时候,总是报错
TypeError: forward() takes 1 positional argument but 2 were given
百度搜了好久没有解决。记录一下。
发现时nn.MoudleList的问题,不能这么写。改过以后是这样:
import torch.nn as nn
import torch
torch.manual_seed(1234)
class xx(nn.Module):
def __init__(self,css=3):
super(xx, self).__init__()
self.layer = nn.ModuleList()
self.conv1 = nn.Conv2d(in_channels=css,out_channels=css,kernel_size=1)
for _ in range(2):#12
layer = self.conv1
self.layer.append(layer)
def forward(self,x):
for layer_block in self.layer:
x=layer_block(x)
print(x)
return x
用append添加层,再用for循环调用。
改变tensor的类型
image.type(torch.float32)
print(image.dtype)
tensor放入cuda