RuntimeError: формы mat1 и mat2 нельзя умножать (200x16 и 32x1)

Я хотел бы соединить два полносвязных слоя. Затем, соединив их, я хочу построить еще одну нейронную сеть со слоем Fully Connected.
Я вижу, что ошибка вызвана неправильной настройкой cat_x = torch.cat([x, x1]). Однако я не знаю, как решить эту проблему.

import torch
from torch import nn, optim
import numpy as np
from matplotlib import pyplot as plt
 
class Regression(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear1 = nn.Linear(2, 32)
        self.linear2 = nn.Linear(32, 16)
        self.linear3 = nn.Linear(32, 1)
 
    def forward(self, input):
        x = nn.functional.relu(self.linear1(input))
        x = nn.functional.relu(self.linear2(x))

        x1 = nn.functional.elu(self.linear1(input))
        x1 = nn.functional.elu(self.linear2(x1))

        cat_x = torch.cat([x, x1])

        cat_x = self.linear3(cat_x)

        return cat_x
 
def train(model, optimizer, E, iteration, x, y):
    losses = []
    for i in range(iteration):
        optimizer.zero_grad()                   # 勾配情報を0に初期化
        y_pred = model(x)                       # 予測
        loss = E(y_pred.reshape(y.shape), y)    # 損失を計算(shapeを揃える)
        loss.backward()                         # 勾配の計算
        optimizer.step()                        # 勾配の更新
        losses.append(loss.item())              # 損失値の蓄積
        print('epoch=', i+1, 'loss=', loss)
    return model, losses
 
def test(model, x):
    y_pred = model(x).data.numpy().T[0]  # 予測
    return y_pred

x = np.random.uniform(0, 10, 100)                                   # x軸をランダムで作成
y = np.random.uniform(0.9, 1.1, 100) * np.sin(2 * np.pi * 0.1 * x)  # 正弦波を作成
x = torch.from_numpy(x.astype(np.float32)).float()                  # xをテンソルに変換
y = torch.from_numpy(y.astype(np.float32)).float()                  # yをテンソルに変換
X = torch.stack([torch.ones(100), x], 1)                            # xに切片用の定数1配列を結合
 
net = Regression()
 
 
optimizer = optim.RMSprop(net.parameters(), lr=0.01)                # 最適化にRMSpropを設定
E = nn.MSELoss()   
net, losses = train(model=net, optimizer=optimizer, E=E, iteration=5000, x=X, y=y)

сообщение об ошибке

/usr/local/lib/python3.7/dist-packages/torch/nn/functional.py in linear(input, weight, bias)
   1846     if has_torch_function_variadic(input, weight, bias):
   1847         return handle_torch_function(linear, (input, weight, bias), input, weight, bias=bias)
-> 1848     return torch._C._nn.linear(input, weight, bias)
   1849 
   1850 

RuntimeError: mat1 and mat2 shapes cannot be multiplied (200x16 and 32x1)
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

поскольку и x, и x1 имеют размеры (100,16), оператор torch.cat выполняет конкатенацию в 1-м измерении (поскольку они имеют одинаковый размер в этом направлении). Чтобы ваш код работал, измените cat_x = torch.cat([x, x1]) на cat_x = torch.cat([x, x1], dim=1)

Пытаться:

cat_x = torch.cat([x, x1], dim=1)

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

Как рассчитать поддержку при наличии истинно положительных, истинно отрицательных, ложноположительных и ложноотрицательных результатов?
Результаты регрессии МНК Значение R-квадрата ca r2_squared от scikitlearn
Что такое оценка и в чем разница между оценкой в ​​реальном времени и пакетной оценкой в ​​​​машинном обучении?
Хронологически распространение данных в Keras LSTM
Ошибка обучения ELMo - RuntimeError: Размер тензора a (5158) должен соответствовать размеру тензора b (5000) при неодноэлементном измерении 1
Восстановление имен функций StandardScaler().fit_transform() с помощью sklearn
«не может вычислить Pack, так как вход № 1 (с отсчетом от нуля) должен был быть тензором с плавающей запятой, но это тензор int32 [Op: Pack] имя: упаковано». Ошибка с tf.squeeze
Сложность развертывания модели машинного обучения в Heroku
Невозможно сделать прогноз с помощью модели Sklearn в фрейме данных pyspark
Потеря обучения - это Nan, но все данные обучения находятся в диапазоне без нуля