gpt4 book ai didi

python - 类型为 torch.FloatTensor 的预期对象,但发现参数类型为 torch.cuda.FloatTensor #2 'weight'

转载 作者:太空宇宙 更新时间:2023-11-03 11:15:16 24 4
gpt4 key购买 nike

首先,我使用类似“model.cuda()”的方法将模型和数据转换为 cuda。但是它仍然存在这样的问题。我调试模型的每一层,每个模块的权重都有 iscuda=True。那么有谁知道为什么会出现这样的问题呢?

我有两个模型,一个是 resnet50,另一个包含第一个模型作为主干。

class FC_Resnet(nn.Module):
def __init__(self, model, num_classes):
super(FC_Resnet, self).__init__()

# feature encoding
self.features = nn.Sequential(
model.conv1,
model.bn1,
model.relu,
model.maxpool,
model.layer1,
model.layer2,
model.layer3,
model.layer4)

# classifier
num_features = model.layer4[1].conv1.in_channels
self.classifier = nn.Sequential(
nn.Conv2d(num_features, num_classes, kernel_size=1, bias=True))

def forward(self, x):
# children=self.features.children()
# for child in children:
# if child.weight is not None:
# print(child.weight.device)
x = self.features(x)
x = self.classifier(x)
return x

def fc_resnet50(num_classes=20, pre_trained=True):
model = FC_Resnet(models.resnet50(pre_trained), num_classes)

return model

还有一个:

class PeakResponseMapping(nn.Sequential):
def __init__(self, *args, **kargs):
super(PeakResponseMapping, self).__init__(*args)
...

def forward(self, input, class_threshold=0, peak_threshold=30, retrieval_cfg=None):
assert input.dim() == 4
if self.inferencing:
input.requires_grad_()

class_response_maps = super(PeakResponseMapping, self).forward(input)

return class_response_maps

主要的很简单:

def main():
dataset = VOC(img_transform=image_transform())
dataloader = DataLoader(dataset, batch_size=BATCH_SIZE, shuffle=True)

model = peak_response_mapping(fc_resnet50(), win_size=3, sub_pixel_locating_factor=8, enable_peak_stimulation=True)
model=model.cuda()

for step, (b_x, b_y) in enumerate(dataloader):
b_x.cuda()
b_y.cuda()

result = model.forward(b_x)

最佳答案

在堆栈跟踪的某处,Torch 需要一个 CPU 张量 (torch.FloatTensor),但得到一个 GPU/CUDA 张量 (torch.cuda.FloatTensor) .

给定一个张量tensor:

  • tensor.to('cpu') 返回张量的 CPU 版本
  • tensor.to('cuda') 返回张量的 CUDA 版本

编写与硬件无关的代码:

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

然后你可以这样做:

tensor.to(device)

对于 OP,这变成:

result = model.forward(b_x.to(device))

关于python - 类型为 torch.FloatTensor 的预期对象,但发现参数类型为 torch.cuda.FloatTensor #2 'weight',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53156298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com