【问题标题】:batch_size not match in torchtext BucketIteratortorchtext BucketIterator 中的 batch_size 不匹配
【发布时间】:2019-06-15 21:31:50
【问题描述】:

我已经设置batch_size等于64,但是当我打印出train_batch和val_batch时,大小不等于64。

train 数据和 val 数据格式如下:

首先,我定义TEXTLABEL 字段。

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])

而train过程输出errorValueError: 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)

任何人都可以给我一个提示将不胜感激。谢谢!

【问题讨论】:

  • 没有对torchtext 和 NLP 做任何事情,我看到你正在使用汉字,所以我猜这个问题源于具有可变字符长度的 UTF 编码。获取 UTF 字符串的 n 字节并不能保证获得任何特定数量的字符,您甚至可能以字符中间结尾。作为问题的原因,这听起来合理吗?

标签: python pytorch torchtext


【解决方案1】:

返回的批量大小并不总是等于batch_size。例如:你有 100 个训练数据,batch_size 是 64。返回的 batch_size 应该是[64, 36]

代码:https://github.com/pytorch/text/blob/1c2ae32d67f7f7854542212b229cd95c85cf4026/torchtext/data/iterator.py#L255-L271

【讨论】:

    【解决方案2】:

    我也遇到过这个问题。我认为问题在于 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。 我认为你可以重塑你的文本来解决这个问题,但我也在寻找更好的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 2021-03-09
      • 2020-08-25
      • 2021-09-04
      • 2021-03-06
      • 2021-04-15
      相关资源
      最近更新 更多