python

您所在的位置:网站首页 美股数量比a股数量 python

python

2023-04-08 17:24| 来源: 网络整理| 查看: 265

Я новичок в нейронных сетях, использующих Pytorch для создания модели VAE. Раньше я немного использовал tensorflow, но понятия не имею, что такое «in_channels» и «out_channels» в качестве аргументов для nn.Conv2d/nn.Conv1d.

Отказ от ответственности, в настоящее время моя модель использует загрузчик данных с размером пакета 128 и где каждый вход представляет собой тензор 248 на 46 (то есть тензор 128 x 248 x 46).

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

class Encoder(nn.Module): def __init__(self, latent_dim): super(Encoder, self).__init__() self.latent_dim = latent_dim self.conv1 = nn.Conv2d(in_channels=248, out_channels=46, kernel_size=(9, 9), stride=(5, 1), padding=(5, 4)) def forward(self, x): print(x.size()) x = F.relu(self.conv1(x)) return x

Слой Conv2d предназначался для уменьшения ввода 248 на 46 в тензор 50 на 46. Однако я получаю эту ошибку:

RuntimeError: Given groups=1, weight of size [46, 248, 9, 9], expected input[1, 128, 248, 46] to have 248 channels, but got 128 channels instead

... хотя я печатаю x.size() и отображается как [torch.Size([128, 248, 46]).

Я не уверен, а) почему ошибка показывает, что слой добавляет дополнительное измерение к x, и б) правильно ли я понимаю каналы. Должно ли 46 быть реальным количеством каналов? Почему Pytorch просто не запрашивает мой размер ввода как кортеж или что-то вроде in=(248, 46)? Или c) если это проблема с тем, как я загрузил свои данные в модель. У меня есть пустой массив data формы (-1, 248, 46), а затем я начал тренировать свою модель следующим образом.

tensor_data = torch.from_numpy(data) dataset = TensorDataset(tensor_data, tensor_data) train_dl = DataLoader(dataset, batch_size=128, shuffle=True) ... for epoch in range(20): for x_train, y_train in train_loader: x_train = x_train.to(device).float() optimizer.zero_grad() x_pred, mu, log_var = vae(x_train) bce_loss = train.BCE(y_train, x_pred) kl_loss = train.KL(mu, log_var) loss = bce_loss + kl_loss loss.backward() optimizer.step()

Любые мысли приветствуются!

python neural-network pytorch conv-neural-network autoencoder 1 Racecar 30 Июн 2022 в 01:13 3 ответа Лучший ответ

В pytorch nn.Conv2d предполагает, что ввод (в основном данные изображения) имеет форму: [B, C_in, H, W], где B – размер пакета, C_in – количество каналов, H и W — высота и ширина изображения. Вывод имеет аналогичную форму [B, C_out, H_out, W_out]. Здесь C_in и C_out — это in_channels и out_channels соответственно. (H_out, W_out) — размер выходного изображения, который может быть равен (H, W), а может и не быть, в зависимости от размера ядра, шага и заполнения.

Однако применение conv2d для уменьшения входных данных [128, 248, 46] до [128, 50, 46] сбивает с толку. Это данные изображения с высотой 248 и шириной 46? Если это так, вы можете изменить входные данные на [128, 1, 248, 46] и использовать in_channels = 1 и out_channels = 1 в conv2d.

0 ihdv 30 Июн 2022 в 08:35 Это было полезно, спасибо! Я понял, что это был 1 канал, и вместо этого я должен был использовать слой conv1d.  – Racecar 8 Июл 2022 в 02:41 Не совсем, если бы это был 1-канальный 2D-вход размера (248, 46), вы должны использовать conv2d. Если бы это был 248-канальный одномерный ввод длиной 46, вы должны использовать conv1d. Хотя их можно сделать эквивалентными, если выбрать соответствующие отступы, шаг и т. д., лучше использовать более точное описание.  – ihdv 8 Июл 2022 в 04:47

Допустим, ваша модель использует изображение одного канала 28 * 28, это становится 784, который является вашим in_channel, а out_channels — это количество классов, которые ваша модель хочет предсказать.

0 Muhammad Atique Ur Rehman 30 Июн 2022 в 01:20 Если я заменю in_channels на 248*46, я получу RuntimeError: Given groups=1, weight of size [46, 11408, 9, 9], expected input[1, 128, 248, 46] to have 11408 channels, but got 128 channels instead. Должен ли я сгладить свой ввод или что-то в этом роде?  – Racecar 30 Июн 2022 в 02:58

Вам нужно добавить дополнительное измерение для количества каналов (1) с функцией просмотра. Код ниже будет работать!

class Encoder(nn.Module): def __init__(self): super(Encoder, self).__init__() self.conv1 = nn.Conv2d(in_channels=1, out_channels=8, kernel_size=(9, 9), stride=(5, 1), padding=(5, 4)) def forward(self, x): print("encoder input size: "+ str(x.shape)) # x.shape[0] is the number of samples in batches if the number of samples >1, otherwise it is the width # (number of samples in a batch, number of channels, width, height) x = x.view(x.shape[0], 1, 248,46) print("encoder input size after adding 1 channel to shape: "+ str(x.shape)) x = F.relu(self.conv1(x)) return x # a test dataset with 128 samples, 248 width and 46 height test_dataset = torch.rand(128,248,46) # prints shape of dataset test.shape model = Encoder() model(test_dataset) # if you are passing only one sample to the model (i.e. to plot) you need to do this instead test_dataset2 = torch.rand(1,248,46) model(test_dataset2.view(test_dataset2.shape[0],1,248,46)) 0 Isaac Zhao 25 Авг 2022 в 02:12


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3