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)