#python #neural-network #pytorch
#python #нейронная сеть #pytorch
Вопрос:
Я пытаюсь запустить встраивания word с использованием пакетного обучения, как показано ниже.
def forward(self, inputs):
print(inputs.shape)
embeds = self.embeddings(inputs)
print(embeds.shape)
out = self.linear1(embeds)
print(out.shape)
out = self.activation_function1(out)
print(out.shape)
out = self.linear2(out).cuda()
print(out.shape)
out = self.activation_function2(out)
print(out.shape)
return out.cuda()
Здесь я использую размер контекста 4, размер пакета 32, размер встраивания 50, размер скрытого слоя 64, размер текста 9927
Выходные данные функций «shape» являются
печать (входные данные.форма) —-> torch.Size([4, 32])
печать (вставки.shape) —-> torch.Size([4, 32, 50])
печать (out.shape) —-> torch.Size([4, 32, 64])
печать (out.shape) —-> torch.Size([4, 32, 64])
печать (out.shape) —-> torch.Size([4, 32, 9927])
печать (out.shape) —-> torch.Size([4, 32, 9927])
Правильны ли их формы? Я совсем запутался.
Кроме того, когда я тренируюсь, он возвращает ошибку:
def train(epoch):
model.train()
for batch_idx, (data, target) in enumerate(train_loader, 0):
optimizer.zero_grad()
output = model(torch.stack(data))
loss = criterion(output, target)
loss.backward()
optimizer.step()
Я получаю ошибку в строке «потеря = критерий (вывод, цель)». В нем говорится «Ожидаемый размер входного пакета (4), соответствующий целевому размеру пакета (32)». Верны ли мои формы для функции «forward»? Я не настолько знаком с пакетным обучением. Как мне сделать, чтобы размеры совпадали?
——-РЕДАКТИРОВАТЬ: Публикуем код инициализации ниже ——
def __init__(self, vocab_size, embedding_dim):
super(CBOW, self).__init__()
self.embeddings = nn.Embedding(vocab_size, embedding_dim)
self.linear1 = nn.Linear(embedding_dim, 64)
self.activation_function1 = nn.ReLU()
self.linear2 = nn.Linear(64, vocab_size)
self.activation_function2 = nn.LogSoftmax(dim = -1)
Ответ №1:
torch.nn.Linear
forward
методу требуется размер пакета в качестве первого аргумента.
Вы предоставляете ее как вторую (первой являются временные интервалы), используйте permute(1, 0, 2)
, чтобы сделать их первыми.
Кроме того, линейные слои обычно принимают 2D-входные данные, причем первый является пакетным, а второй — размерностью входных данных. Ваш 3d из-за слов (я полагаю), может быть, вы хотите использовать рекуррентные нейронные сети (например, torch.nn.LSTM
)?