我将batch_size
设置为等于64
,但是当我打印出train_batch和val_batch时,大小不等于64。
首先,我定义TEXT
和LABEL
字段。
tokenize = lambda x: x.split()
TEXT = data.Field(sequential=True, tokenize=tokenize)
LABEL = data.Field(sequential=False)
然后我继续尝试遵循tutorials,并在下面写了一些东西:
train_data, valid_data = data.TabularDataset.splits(
path='.',
train='train_intent.csv', validation='val.csv',
format='csv',
fields= {'sentences': ('text', TEXT),
'labels': ('label',LABEL)}
)
test_data = data.TabularDataset(
path='test.csv',
format='csv',
fields={'sentences': ('text', TEXT)}
)
TEXT.build_vocab(train_data)
LABEL.build_vocab(train_data)
BATCH_SIZE = 64
train_iter, val_iter = data.BucketIterator.splits(
(train_data, valid_data),
batch_sizes=(BATCH_SIZE, BATCH_SIZE),
sort_key=lambda x: len(x.text),
sort_within_batch=False,
repeat=False,
device=device
)
但是当我想知道迭代是否正确时,我会发现以下奇怪的事情:
train_batch = next(iter(train_iter))
print(train_batch.text.shape)
print(train_batch.label.shape)
[output]
torch.Size([15, 64])
torch.Size([64])
火车过程输出错误ValueError: Expected input batch_size (15) to match target batch_size (64).
:
def train(model, iterator, optimizer, criterion):
epoch_loss = 0
model.train()
for batch in iterator:
optimizer.zero_grad()
predictions = model(batch.text)
loss = criterion(predictions, batch.label)
loss.backward()
optimizer.step()
epoch_loss += loss.item()
return epoch_loss / len(iterator)
任何人都可以给我一个提示,将不胜感激。谢谢!
答案 0 :(得分:1)
返回的批次大小并不总是等于batch_size
。例如:您有100个火车数据,batch_size为64。返回的batch_size应为[64, 36]
。
答案 1 :(得分:0)
我也遇到过这个问题。我认为问题在于 batch_size 不在 shape[0] 位置。在您的问题中:
train_batch = next(iter(train_iter))
print(train_batch.text.shape)
print(train_batch.label.shape)
[output]
torch.Size([15, 64])
torch.Size([64])
15为batch中的max_sequence_length,可以使用Field定义中的fix_length进行固定,64为batch_size。 我认为您可以重塑文字来解决这个问题,但我也在寻找更好的答案。