Преобразователи видения: RuntimeError: формы mat1 и mat2 не могут быть умножены (32x1000 и 768x32)

Я пытаюсь выполнить регрессию в модели преобразователей зрения и не могу заменить последний уровень классификации слоем регрессии.

class RegressionViT(nn.Module):
    def __init__(self, in_features=224 * 224 * 3, num_classes=1, pretrained=True):
        super(RegressionViT, self).__init__()
        self.vit_b_16 = vit_b_16(pretrained=pretrained)
        # Accessing the actual output feature size from vit_b_16
        self.regressor = nn.Linear(self.vit_b_16.heads[0].in_features, num_classes * batch_size)

    def forward(self, x):
        x = self.vit_b_16(x)
        x = self.regressor(x)
        return x


# Model
model = RegressionViT(num_classes=1)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)

criterion = nn.MSELoss()  # Use appropriate loss function for regression
optimizer = optim.Adam(model.parameters(), lr=0.0001)

Я получаю эту ошибку, когда пытаюсь инициализировать и запустить модель

RuntimeError: mat1 and mat2 shapes cannot be multiplied (32x1000 and 768x32)

Проблема в том, что между слоем регрессии и слоем модели vit_b_16 существует несоответствие. Каков был бы правильный способ решения этой проблемы?

это не ошибка, это кусок кода. требуется минимальный воспроизводимый пример. Вы знаете, что делать.

Christoph Rackwitz 01.04.2024 10:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы посмотрите исходный код VisionTransformer , то в этом разделе вы заметите, что self.heads представляет собой последовательный, а не линейный слой. По умолчанию он содержит только один слой head, соответствующий последнему слою классификации. Чтобы перезаписать этот слой, вы можете сделать:

heads = self.vit_b_16.heads
heads.head = nn.Linear(heads.head.in_features, num_classes)

Теперь я решил эту проблему @Ivan, но есть проблема между последним слоем модели и головой регрессии, которую я добавляю: если я изменю размер последнего слоя, я могу потерять данные.

SenthurLP 02.04.2024 09:02

Что вы подразумеваете под «изменить размер последнего слоя»?

Ivan 02.04.2024 09:03

Эта модель vit_b_16 предназначена для классификации, но вместо этого я хочу выполнить регрессию, поэтому я отредактировал последний слой, включив в него головку регрессии, но между последним слоем модели и головкой регрессии, которую я сейчас использую, существует несоответствие.

SenthurLP 02.04.2024 18:29

Непонятно, что вы подразумеваете под «головкой регрессии», в вашем примере у вас есть линейный слой с логитами num_classes x chunk_size.

Ivan 03.04.2024 10:04

Таким образом, модель vit_b_16 правильно обучена для целей классификации. Я хочу использовать эту модель для целей вращательной инвариантности. Я хочу удалить последний слой, предназначенный для классификации, и заменить его слоем регрессии.

SenthurLP 03.04.2024 12:48

Тогда у вас будет nn.Linear(heads.head.in_features, 1), верно?

Ivan 03.04.2024 12:57

Поскольку я получаю пакетные выходные данные из модели vit_b_16, они будут выглядеть как nn.Linear(heads.head.in_features, 1*batch_size)

SenthurLP 04.04.2024 07:00

Это кажется неверным, количество параметров не зависит от размера пакета. Если у вас есть слой, инициализированный как nn.Linear(in_features, 1), и входная форма (batch_size, in_features), то выходной тензор будет (batch_size, 1). Таким образом, out_features вашего линейного слоя должен быть 1, а не 1*batch_size.

Ivan 04.04.2024 09:47

Другие вопросы по теме

Scikit-Learn Перестановка и обновление фрейма данных Polars
Группировка нескольких строк данных для использования в модели машинного обучения случайного леса scikit-learn
Сколько игр потребуется для обучения компьютера «MENACE» в крестики-нолики?
Как удалить слои в предварительно обученных моделях трансформеров Huggingface GPT2?
Получение ошибки «TypeError: нет числовых данных для построения графика» в анализе ARIMA временных рядов
Запретить создание вложений, если папка ChromaDB уже присутствует
Модели глубокого обучения, обеспечивающие высокую точность обучения, но низкую производительность при тестировании данных при классификации двоичного текста
Как преобразовать предварительно обученную модель обнимающегося лица в .pt и запустить ее полностью локально?
Seq2Seq LSTM не обучается должным образом
Как я могу вычислить следующий гессиан, используя функции numpy, чтобы ускорить вычисления?