如何解决如何使用两个或更多输入来训练Pytorch CNN
我的图像很大,图像中的多个事件可能会影响分类。我正在考虑将大图像分成小块,并从每个块中获取特征,并将输出连接在一起以进行预测。
我的代码如下:
train_load_1 = DataLoader(dataset=train_dataset_1,batch_size=100,shuffle=False)
train_load_2 = DataLoader(dataset=train_dataset_2,shuffle=False)
train_load_3 = DataLoader(dataset=train_dataset_3,shuffle=False)
test_load_1 = DataLoader(dataset=test_dataset_1,shuffle=True)
test_load_2 = DataLoader(dataset=test_dataset_2,shuffle=True)
test_load_3 = DataLoader(dataset=test_dataset_3,shuffle=True)
class Net(nn.Module):
def __init__(self):
super(Net,self).__init__()
self.conv = nn.Conv2d( ... ) # set up your layer here
self.fc1 = nn.Linear( ... ) # set up first FC layer
self.fc2 = nn.Linear( ... ) # set up the other FC layer
def forward(self,x1,x2,x3):
o1 = self.conv(x1)
o2 = self.conv(x2)
o3 = self.conv(x3)
combined = torch.cat((o1.view(c.size(0),-1),o2.view(c.size(0),o3.view(c.size(0),-1)),dim=1)
out = self.fc1(combined)
out = self.fc2(out)
return F.softmax(x,dim=1)
model = Net().to(device)
optimizer = optim.SGD(model.parameters(),lr=0.01)
for epoch in epochs:
model.train()
for batch_idx,(inputs,labels) in enumerate(train_loader_1):
**### I am stuck here,how to enumerate all three train_loader to pass input_1,input_2,input_3 into model and share the same label? Please note in train_loader I have set shuffle=False,this is to make sure train_loader_1,train_loader_2,train_loader_3 are getting the same label **
谢谢您的帮助!
解决方法
您可以使用单个dataLoader元素,而不是使用3个单独的dataLoader元素,其中每个数据点都包含图像的3个单独部分。
赞:
dataLoader = [[[img1_part1],[img1_part2],[img1_part3],label1],[[img2_part1],[img2_part2],[img2_part3],label2]....]
这样,您可以在训练循环中将其用作:
for img in dataLoader:
part1,part2,part3,label = img
out = model.forward(part1,part3)
loss = loss_fn(out,label)
loss.backward()
optimizer.step()
,
使用该格式的图像部分:
您可以遍历图像并将其附加到列表或numpy数组中。
def make_parts(full_image):
# some code
# returns a list of image parts after converting them into torch tensors
return [TorchTensor_of_part1,TorchTensor_of_part2,TorchTensor_of_part3]
list_of_parts_and_labels = []
for image,label in zip(full_img_data,labels):
parts = make_parts(image)
list_of_parts_and_labels.append([parts,torch.tensor(label)])
如果要将图像加载到dataLoader中,请假定您已经具有上述格式的图像部分和标签:
train_loader = torch.utils.data.DataLoader(list_of_parts_and_labels,shuffle = True,batch_size = BATCH_SIZE)
然后将其用作
for data in train_loader:
parts,label = data
out = model.forward(*parts)
loss = loss_fn(out,label)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。