记录torch使用的错误
1. RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cpu and cuda:1! (when checking argument for argument mat1 in method wrapper_CUDA_addmm)
这个错误表明在进行Tensor运算时发现了至少两个不同的设备,一个在CPU上,一个在cuda:1(即GPU上)。在PyTorch中,所有涉及Tensor的操作必须在相同的设备上进行,否则会出现类似的错误。
新创建的层没有放入cuda,会在cpu进行继续,需要放到gpu中进行计算。
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.linear = nn.Linear(input_size, output_size).to('cuda:1')
2. RuntimeError: Parent directory ./models does not exist.
这种错误都是文件路径不对,可以把相对路径改成绝对路径。
3. 将网络输入从128*128改到256*256
一般来说,我们将网络从小扩大,不能只调整输入图像的大小为(256,256),还得调整网络的整体架构。
- 不能单纯的在网络输入的第一层加入线性层之类的缩小到128*128,这样没有意义
- 应该在网络中过卷积之间加一层卷积来进行降维,保证一致性,而不使用更新网络所有参数的方式
self.conv1 = conv3x3(num_inputs, 64, 2)
self.bn1 = nn.BatchNorm2d(64)
self.layer1 = self._make_layer(block, 64, num_blocks[0], stride=2)
self.layer2 = self._make_layer(block, 128, num_blocks[1], stride=2)
self.layer3 = self._make_layer(block, 256, num_blocks[2], stride=2)
self.layer4 = self._make_layer(block, 512, num_blocks[3], stride=2)
# 只需要在卷积最后更新一层
self.conv1 = conv3x3(num_inputs, 64, 2)
self.bn1 = nn.BatchNorm2d(64)
self.layer1 = self._make_layer(block, 64, num_blocks[0], stride=2)
self.layer2 = self._make_layer(block, 128, num_blocks[1], stride=2)
self.layer3 = self._make_layer(block, 256, num_blocks[2], stride=2)
self.layer4 = self._make_layer(block, 512, num_blocks[3], stride=2)
self.layer5 = self._make_layer(block, 512, num_blocks[3], stride=2)
具体将128 *128 变成 256*256 的方法
- 如果原来的图像就是大于256的,我们只需要将图片resize成256就行
- 如果图像本来就是128,这时候我们就需要进行上采样。通常情况下进行上采用使用Bilinear、Bicubic 的传统插值方法,也有反卷积、亚像素上采样的基于深度学习的插值方法。
# 一种双线性插值
stroke = F.interpolate(stroke, scale_factor=2, mode="bilinear")