Полагаю, у вас есть несколько проблем, которые можно исправить с помощью 13 символов.
Сначала я предлагаю то, что предложил @Alekhya Vemavarapu - запустите ваш код с помощью отладчика, чтобы изолировать каждую строку и проверить вывод. Это одно из величайших преимуществ динамических графов с pytorch .
Во-вторых, наиболее вероятная причина вашей проблемы - неправильный оператор argmax
. Вы не указываете размер, над которым вы выполняете argmax
, и поэтому PyTorch автоматически выравнивает изображение и выполняет операцию над вектором полной длины. Таким образом, вы получите число от 0
до MB_Size x num_classes -1
.См. Официальный документ по этому методу .
Итак, из-за вашего полностью подключенного слоя я предполагаю, что ваш вывод имеет форму (MB_Size, num_classes)
.Если это так, вам нужно изменить код на следующую строку:
pred = torch.argmax(output,dim=1)
и все.В противном случае просто выберите размер логитов.
Третье, что вы хотите учесть, - это отсев и другие влияния, которые конфигурация обучения может оказать на вывод.Например, для исключения из некоторых структур может потребоваться умножить выходной сигнал на 1/(1-p)
в выводе (или нет, так как это может быть сделано во время обучения), нормализация партии может быть отменена, поскольку размер пакета отличается, и так далее.Кроме того, чтобы уменьшить потребление памяти, градиенты не должны рассчитываться. К счастью, разработчики PyTorch очень вдумчивы и предоставили нам torch.no_grad()
и model.eval()
для этого.
Я настоятельно рекомендую попробовать это, возможно, изменив код с помощью несколькихбуквы:
output = model_transfer.eval()(image)
и все готово!
Редактировать :
Это простой случай неправильного использования инфраструктуры PyTorch, а не чтение документы и не отлаживать ваш код.Следующий код является абсолютно неправильным:
model_transfer.fc.out_features = 133
Эта строка фактически не создает новый полностью связанный слой.Это просто меняет свойство этого тензора.Попробуйте в консоли:
import torch
a = torch.nn.Linear(1,2)
a.out_features = 3
print(a.bias.data.shape, a.weight.data.shape)
Вывод:
torch.Size([2]) torch.Size([2, 1])
, который указывает, что фактическая матрица весов и вектор смещений остаются в своем исходном измерении.
Правильный путьвыполнить обучение переноса означает сохранить магистраль (обычно сверточные слои до полностью связанных в этих моделях моделей) и перезаписать голову (в данном случае слой FC) своей.Если это только один полностью связанный слой, который существует в исходной модели, вам не нужно изменять прямой проход вашей модели, и вы готовы к работе.Поскольку этот ответ уже достаточно длинный, просто посмотрите учебник Transfer в документации по PyTorch, чтобы узнать, как это можно сделать.
Удачи вам.