Deep learning 加载数据时维度不匹配

Deep learning 加载数据时维度不匹配,deep-learning,pytorch,Deep Learning,Pytorch,我有如下代码 import torch.nn.functional as f train_on_gpu=True class CnnLstm(nn.Module): def __init__(self): super(CnnLstm, self).__init__() self.cnn = CNN() self.rnn = nn.LSTM( input_size=180000, hidden_

我有如下代码

import torch.nn.functional as f
train_on_gpu=True
class CnnLstm(nn.Module):
    def __init__(self):
        super(CnnLstm, self).__init__()
        self.cnn = CNN()
        self.rnn = nn.LSTM(
            input_size=180000,
            hidden_size=256,
            num_layers=2,
            batch_first=True)
        self.linear = nn.Linear(hidden_size, num_classes) 

    def forward(self, x):
        print('before forward ')
        print(x.shape)
        batch_size, time_steps, channels, height, width = x.size()
        c_in = x.view(batch_size * time_steps, channels, height, width)
        _, c_out = self.cnn(c_in)
        r_in = c_out.view(batch_size, time_steps, -1)
        r_out, (_, _) = self.rnn(r_in)
        r_out2 = self.linear(r_out[:, -1, :])
        return f.log_softmax(r_out2, dim=1)


cnnlstm_model = CnnLstm().to(device)
optimizer = torch.optim.Adam(cnnlstm_model.parameters(), lr=learning_rate)
#optimizer = torch.optim.SGD(cnnlstm_model.parameters(), lr=learning_rate)
#criterion = nn.functional.nll_loss()
criterion = nn.CrossEntropyLoss()
# Train the model
n_total_steps = len(train_dl)
num_epochs = 20
for epoch in range(num_epochs):
    t_losses=[]
    for i, (images, labels) in enumerate(train_dl):  
        # origin shape: [5, 3, 300, 300]
        # resized: [5, 300, 300]
        print('load data '+str(images.shape))
        images = np.expand_dims(images, axis=1)
        print('after expand ')
        print(images.shape)
        images = torch.FloatTensor(images)
        images, labels = images.cuda(), labels.cuda()
        images, labels = Variable(images), Variable(labels)
        optimizer.zero_grad()
        outputs = cnnlstm_model(images)
        loss = criterion(outputs, labels)
        t_losses.append(loss)
        loss.backward()
        optimizer.step()
三个地方正在印刷

(一)

(二)

(三)

我有5幅图片的批量大小。 正在加载2629批,只有最后一批有问题。 加载图像的早期批次没有问题,并作为

load data torch.Size([5, 3, 300, 300])
after expand 
(5, 1, 3, 300, 300)
before forward 
torch.Size([5, 1, 3, 300, 300])
load data torch.Size([5, 3, 300, 300])
after expand 
(5, 1, 3, 300, 300)
before forward 
torch.Size([5, 1, 3, 300, 300])
.
.
.
load data torch.Size([5, 3, 300, 300])
after expand 
(5, 1, 3, 300, 300)
before forward 
torch.Size([5, 1, 3, 300, 300])
load data torch.Size([5, 3, 300, 300])
after expand 
(5, 1, 3, 300, 300)
before forward 
torch.Size([5, 1, 3, 300, 300])
在最后一批装载时

load data torch.Size([5, 3, 300, 300])
after expand 
(5, 1, 3, 300, 300)
before forward 
torch.Size([5, 1, 3, 300, 300])
before forward 
torch.Size([15, 300, 300])
为什么要打印两次“转发前”日志?而且,它的形状也不一样

有什么不对劲吗

编辑:

这是用于加载数据的代码

inputH = input_size
inputW = input_size
#Data transform (normalization & data augmentation)
stats = ((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
train_resize_tfms = tt.Compose([tt.Resize((inputH, inputW), interpolation=2),
                         tt.ToTensor(),
                         tt.Normalize(*stats)])
train_tfms = tt.Compose([tt.Resize((inputH, inputW), interpolation=2),                         
                         tt.RandomHorizontalFlip(),                                                                         
                         tt.ToTensor(),
                         tt.Normalize(*stats)])
valid_tfms = tt.Compose([tt.Resize((inputH, inputW), interpolation=2),
                         tt.ToTensor(), 
                         tt.Normalize(*stats)])
test_tfms = tt.Compose([tt.Resize((inputH, inputW), interpolation=2),
                        tt.ToTensor(), 
                        tt.Normalize(*stats)])

#Create dataset
train_ds = ImageFolder('./data/train', train_tfms)
valid_ds = ImageFolder('./data/valid', valid_tfms)
test_ds = ImageFolder('./data/test', test_tfms)

from torch.utils.data.dataloader import DataLoader
batch_size = 5

#Training data loader
train_dl = DataLoader(train_ds, batch_size, shuffle = True, num_workers = 8, pin_memory=True)
#Validation data loader
valid_dl = DataLoader(valid_ds, batch_size, shuffle = True, num_workers = 8, pin_memory=True)
#Test data loader
test_dl = DataLoader(test_ds, 1, shuffle = False, num_workers = 1, pin_memory=True)

我对数据加载器做了一些更改,最终它成功了

    class DataLoader:
        stats = ((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
        @staticmethod
        def get_train_data(batch_size):
            train_tfms = tt.Compose([tt.Resize((inputH, inputW), interpolation=2),                         
                                 tt.RandomHorizontalFlip(),                                                                          
                                 tt.ToTensor(),
                                 tt.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))])
            train_ds = ImageFolder('./data/train', train_tfms)
            return torch.utils.data.DataLoader(
                train_ds,
                batch_size=batch_size,
                shuffle=True,
                num_workers = 8, 
                pin_memory=True)
        
        @staticmethod
        def get_validate_data(valid_batch_size):
            valid_tfms = tt.Compose([tt.Resize((inputH, inputW), interpolation=2),
                                 tt.ToTensor(), 
                                 tt.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))])
            valid_ds = ImageFolder('./data/valid', valid_tfms)
            return torch.utils.data.DataLoader(
                valid_ds,
                batch_size=valid_batch_size,
                shuffle=True,
                num_workers = 8, 
                pin_memory=True)
    
        @staticmethod
        def get_test_data(test_batch_size):
            test_tfms = tt.Compose([tt.Resize((inputH, inputW), interpolation=2),
                                tt.ToTensor(), 
                                tt.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))])
            test_ds = ImageFolder('./data/test', test_tfms)
            return torch.utils.data.DataLoader(
                test_ds,
                batch_size=test_batch_size,
                shuffle=False,
                num_workers = 1, 
                pin_memory=True)


    

我对数据加载器做了一些更改,最终它成功了

    class DataLoader:
        stats = ((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
        @staticmethod
        def get_train_data(batch_size):
            train_tfms = tt.Compose([tt.Resize((inputH, inputW), interpolation=2),                         
                                 tt.RandomHorizontalFlip(),                                                                          
                                 tt.ToTensor(),
                                 tt.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))])
            train_ds = ImageFolder('./data/train', train_tfms)
            return torch.utils.data.DataLoader(
                train_ds,
                batch_size=batch_size,
                shuffle=True,
                num_workers = 8, 
                pin_memory=True)
        
        @staticmethod
        def get_validate_data(valid_batch_size):
            valid_tfms = tt.Compose([tt.Resize((inputH, inputW), interpolation=2),
                                 tt.ToTensor(), 
                                 tt.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))])
            valid_ds = ImageFolder('./data/valid', valid_tfms)
            return torch.utils.data.DataLoader(
                valid_ds,
                batch_size=valid_batch_size,
                shuffle=True,
                num_workers = 8, 
                pin_memory=True)
    
        @staticmethod
        def get_test_data(test_batch_size):
            test_tfms = tt.Compose([tt.Resize((inputH, inputW), interpolation=2),
                                tt.ToTensor(), 
                                tt.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))])
            test_ds = ImageFolder('./data/test', test_tfms)
            return torch.utils.data.DataLoader(
                test_ds,
                batch_size=test_batch_size,
                shuffle=False,
                num_workers = 1, 
                pin_memory=True)


    

您能提供dl列车的代码吗?我已经添加了。谢谢。我不能复制这个,在这一点上猜测发生了什么有点复杂。我认为最令人担忧的是,“转发前”有两个日志。每个时代都会发生这种情况吗?您是否可以尝试将工作人员的数量降低到
1
,并删除模型调用(仅在单个历元上运行火车装载机)?
/data/train
有多少图像?放置一些断言也可能是一个好主意:放置
assert len(images.shape)==5,'%i在扩展DIM后失败了'%i
。您能提供
train\u dl
的代码吗?我已经添加了。谢谢。我不能复制这个,在这一点上猜测发生了什么有点复杂。我认为最令人担忧的是,“转发前”有两个日志。每个时代都会发生这种情况吗?您是否可以尝试将工作人员的数量降低到
1
,并删除模型调用(仅在单个历元上运行火车装载机)?
/data/train
有多少图像?放置一些断言也可能是个好主意:放置
assert len(images.shape)==5,'%i在扩展其DIM后失败了'%i
。您找到了确切的问题所在吗?实际上我不知道。我刚刚改变了Dataloader、CNN和CNNLSTM的所有课程。没有问题了,太好了!您应该将自己的答案标记为有效,这将有助于整理已回答/未回答的问题!你知道到底是什么问题吗?事实上我不知道。我刚刚改变了Dataloader、CNN和CNNLSTM的所有课程。没有问题了,太好了!您应该将自己的答案标记为有效,这将有助于整理已回答/未回答的问题!
inputH = input_size
inputW = input_size
#Data transform (normalization & data augmentation)
stats = ((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
train_resize_tfms = tt.Compose([tt.Resize((inputH, inputW), interpolation=2),
                         tt.ToTensor(),
                         tt.Normalize(*stats)])
train_tfms = tt.Compose([tt.Resize((inputH, inputW), interpolation=2),                         
                         tt.RandomHorizontalFlip(),                                                                         
                         tt.ToTensor(),
                         tt.Normalize(*stats)])
valid_tfms = tt.Compose([tt.Resize((inputH, inputW), interpolation=2),
                         tt.ToTensor(), 
                         tt.Normalize(*stats)])
test_tfms = tt.Compose([tt.Resize((inputH, inputW), interpolation=2),
                        tt.ToTensor(), 
                        tt.Normalize(*stats)])

#Create dataset
train_ds = ImageFolder('./data/train', train_tfms)
valid_ds = ImageFolder('./data/valid', valid_tfms)
test_ds = ImageFolder('./data/test', test_tfms)

from torch.utils.data.dataloader import DataLoader
batch_size = 5

#Training data loader
train_dl = DataLoader(train_ds, batch_size, shuffle = True, num_workers = 8, pin_memory=True)
#Validation data loader
valid_dl = DataLoader(valid_ds, batch_size, shuffle = True, num_workers = 8, pin_memory=True)
#Test data loader
test_dl = DataLoader(test_ds, 1, shuffle = False, num_workers = 1, pin_memory=True)
    class DataLoader:
        stats = ((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
        @staticmethod
        def get_train_data(batch_size):
            train_tfms = tt.Compose([tt.Resize((inputH, inputW), interpolation=2),                         
                                 tt.RandomHorizontalFlip(),                                                                          
                                 tt.ToTensor(),
                                 tt.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))])
            train_ds = ImageFolder('./data/train', train_tfms)
            return torch.utils.data.DataLoader(
                train_ds,
                batch_size=batch_size,
                shuffle=True,
                num_workers = 8, 
                pin_memory=True)
        
        @staticmethod
        def get_validate_data(valid_batch_size):
            valid_tfms = tt.Compose([tt.Resize((inputH, inputW), interpolation=2),
                                 tt.ToTensor(), 
                                 tt.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))])
            valid_ds = ImageFolder('./data/valid', valid_tfms)
            return torch.utils.data.DataLoader(
                valid_ds,
                batch_size=valid_batch_size,
                shuffle=True,
                num_workers = 8, 
                pin_memory=True)
    
        @staticmethod
        def get_test_data(test_batch_size):
            test_tfms = tt.Compose([tt.Resize((inputH, inputW), interpolation=2),
                                tt.ToTensor(), 
                                tt.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))])
            test_ds = ImageFolder('./data/test', test_tfms)
            return torch.utils.data.DataLoader(
                test_ds,
                batch_size=test_batch_size,
                shuffle=False,
                num_workers = 1, 
                pin_memory=True)