Ввод изображения в оттенках серого в 3-канальную модель Pytorch с использованием загрузчиков данных. ⇐ Python
Ввод изображения в оттенках серого в 3-канальную модель Pytorch с использованием загрузчиков данных.
Я обучил сверточный VAE с помощью pytorch без каких-либо ошибок и получаю разумно реконструированные изображения. Но сейчас у меня возникла проблема, которую я до конца не понимаю.
Когда я загружаю изображение, которое было в моем обучающем наборе, и ввожу его через модель, оно может получить его представление в скрытом пространстве и без проблем реконструировать его, за исключением случаев, когда это одноканальное изображение.
>
Что я не могу понять, так это то, как это не привело к ошибкам в обучении. Если он не может закодировать одноканальное изображение в логическом выводе, как он сможет с ним тренироваться?
# Это мой «вывод», он использует те же изображения из обучения. # Я просто хочу получить скрытое представление обо всех них. импортировать ОС импортный фонарь импортировать numpy как np из изображения импорта PIL из преобразований импорта torchvision из автоэнкодера импортировать ConvolutionalVariationalAutoEncoder как VAE размер_изображения = (256, 256) Transform = Transforms.Compose([ Transforms.Resize(image_size), преобразует.ToTensor(), ]) images_path = "../data/images/" images_names = os.listdir(images_path) # out_channels, kernel_size, шаг, заполнение Layer_params = [ (16, 4, 2, 1), (32, 4, 2, 1), (64, 4, 2, 1), ] input_shape = (3,) + размер_изображения скрытый_dim = 64 модель = VAE (input_shape, Layer_params, latent_dim) model.load_state_dict(torch.load("../models/ Third.1_model.pth")) модель.eval() latent_representations = dict() к = 0 для image_name в images_names: печать (к) изображение = Image.open(путь_изображения+имя_изображения) изображение = преобразование (изображение). unsqueeze (0) print(путь_изображения+имя_изображения, image.shape) с torch.no_grad(): изображение = image.to(модель.устройство) му, logvar = model.encode(изображение) latent_representations[image_name] = model.reparameterize(mu, logvar) к+= 1 latent_representations Этот код выполняется несколько итераций, печатает эти строки и выдает эту ошибку, когда достигает изображения одного канала:
0 ../data/images/1.jpg torch.Size([1, 3, 256, 256]) 1 ../data/images/10.jpg torch.Size([1, 3, 256, 256]) 2 ../data/images/100.jpg torch.Size([1, 1, 256, 256]) Ошибка выполнения: учитывая группы = 1, вес размера [16, 3, 4, 4], ожидалось, что вход [1, 1, 256, 256] будет иметь 3 канала, но вместо этого получил 1 канал. Для справки: вот как я проводил обучение:
импортировать факел импортировать numpy как np из изображения импорта PIL импортировать matplotlib.pyplot как plt из torch.utils.data импортировать DataLoader из преобразований импорта torchvision из автоэнкодера импортировать ConvolutionalVariationalAutoEncoder как VAE из автоэнкодера импортировать ImageDataset размер_изображения = (256, 256) Transform = Transforms.Compose([ Transforms.Resize(image_size), преобразует.ToTensor(), ]) image_folder_path = "../данные/" image_dataset = ImageDataset (путь к_папке_изображения, преобразование = преобразование) data_loader = DataLoader (набор_данных изображения, пакетный_размер = 32, перемешивание = True) # out_channels, kernel_size, шаг, заполнение Layer_params = [ (16, 4, 2, 1), (32, 4, 2, 1), (64, 4, 2, 1), ] input_shape = (3,) + размер_изображения скрытый_dim = 64 vae = VAE(input_shape, Layer_params, latent_dim) vae.train_model(10, data_loader) Где .train_model() — это метод, который я реализовал в классах автоэнкодера:
def train_model(self, n_epochs, data_loader): для эпохи в диапазоне (n_epochs): сам.поезд() общий_убыток = 0 для данных в data_loader: данные = data.to(self.device) recon_data, mu, logvar = self(данные) потеря = self.loss(recon_data, data, mu, logvar) self.optimizer.zero_grad() потеря.назад() self.optimizer.step() total_loss += loss.item() средняя_потеря = общая_потеря/длин(data_loader.dataset) print(f'Epoch [{epoch + 1}/{n_epochs}], Потеря: {average_loss:.4f}') И, как я уже сказал, он не выдал никаких ошибок, просто обучился... Как это возможно, стоит ли мне волноваться, что он не использовал изображения в оттенках серого? А также, как мне исправить свой вывод?
Я имею в виду, что я могу исправить свой вывод разными способами, я могу просто проверить количество каналов и воспроизвести их, меня больше всего беспокоит то, что произошло во время обучения и почему оно не вызвало никаких ошибок? Я хочу, чтобы моя модель прошла обучение на всех моих изображениях.
РЕДАКТИРОВАТЬ: Я изменил свой вывод, чтобы решить мою насущную проблему, код теперь такой:
для image_name в tqdm(images_names): изображение = Image.open(путь_изображения+имя_изображения) изображение = преобразование (изображение). unsqueeze (0) print(путь_изображения+имя_изображения, image.shape) с torch.no_grad(): изображение = image.to(модель.устройство) если image.shape[1] == 1: изображение = image.expand(-1, 3, -1, -1) му, logvar = model.encode(изображение) latent_representations[image_name] = model.reparameterize(mu, logvar) latent_representations И я только что узнал, что у меня также есть 4-канальные изображения в моем наборе данных, ха-ха. Как, черт возьми, моя тренировка не сорвалась?
751 ../data/images/1682.jpg torch.Size([1, 3, 256, 256]) 752 ../data/images/1683.jpg torch.Size([1, 4, 256, 256]) Ошибка выполнения: учитывая группы = 1, вес размера [16, 3, 4, 4], ожидалось, что вход [1, 4, 256, 256] будет иметь 3 канала, но вместо этого получил 4 канала.
Я обучил сверточный VAE с помощью pytorch без каких-либо ошибок и получаю разумно реконструированные изображения. Но сейчас у меня возникла проблема, которую я до конца не понимаю.
Когда я загружаю изображение, которое было в моем обучающем наборе, и ввожу его через модель, оно может получить его представление в скрытом пространстве и без проблем реконструировать его, за исключением случаев, когда это одноканальное изображение.
>
Что я не могу понять, так это то, как это не привело к ошибкам в обучении. Если он не может закодировать одноканальное изображение в логическом выводе, как он сможет с ним тренироваться?
# Это мой «вывод», он использует те же изображения из обучения. # Я просто хочу получить скрытое представление обо всех них. импортировать ОС импортный фонарь импортировать numpy как np из изображения импорта PIL из преобразований импорта torchvision из автоэнкодера импортировать ConvolutionalVariationalAutoEncoder как VAE размер_изображения = (256, 256) Transform = Transforms.Compose([ Transforms.Resize(image_size), преобразует.ToTensor(), ]) images_path = "../data/images/" images_names = os.listdir(images_path) # out_channels, kernel_size, шаг, заполнение Layer_params = [ (16, 4, 2, 1), (32, 4, 2, 1), (64, 4, 2, 1), ] input_shape = (3,) + размер_изображения скрытый_dim = 64 модель = VAE (input_shape, Layer_params, latent_dim) model.load_state_dict(torch.load("../models/ Third.1_model.pth")) модель.eval() latent_representations = dict() к = 0 для image_name в images_names: печать (к) изображение = Image.open(путь_изображения+имя_изображения) изображение = преобразование (изображение). unsqueeze (0) print(путь_изображения+имя_изображения, image.shape) с torch.no_grad(): изображение = image.to(модель.устройство) му, logvar = model.encode(изображение) latent_representations[image_name] = model.reparameterize(mu, logvar) к+= 1 latent_representations Этот код выполняется несколько итераций, печатает эти строки и выдает эту ошибку, когда достигает изображения одного канала:
0 ../data/images/1.jpg torch.Size([1, 3, 256, 256]) 1 ../data/images/10.jpg torch.Size([1, 3, 256, 256]) 2 ../data/images/100.jpg torch.Size([1, 1, 256, 256]) Ошибка выполнения: учитывая группы = 1, вес размера [16, 3, 4, 4], ожидалось, что вход [1, 1, 256, 256] будет иметь 3 канала, но вместо этого получил 1 канал. Для справки: вот как я проводил обучение:
импортировать факел импортировать numpy как np из изображения импорта PIL импортировать matplotlib.pyplot как plt из torch.utils.data импортировать DataLoader из преобразований импорта torchvision из автоэнкодера импортировать ConvolutionalVariationalAutoEncoder как VAE из автоэнкодера импортировать ImageDataset размер_изображения = (256, 256) Transform = Transforms.Compose([ Transforms.Resize(image_size), преобразует.ToTensor(), ]) image_folder_path = "../данные/" image_dataset = ImageDataset (путь к_папке_изображения, преобразование = преобразование) data_loader = DataLoader (набор_данных изображения, пакетный_размер = 32, перемешивание = True) # out_channels, kernel_size, шаг, заполнение Layer_params = [ (16, 4, 2, 1), (32, 4, 2, 1), (64, 4, 2, 1), ] input_shape = (3,) + размер_изображения скрытый_dim = 64 vae = VAE(input_shape, Layer_params, latent_dim) vae.train_model(10, data_loader) Где .train_model() — это метод, который я реализовал в классах автоэнкодера:
def train_model(self, n_epochs, data_loader): для эпохи в диапазоне (n_epochs): сам.поезд() общий_убыток = 0 для данных в data_loader: данные = data.to(self.device) recon_data, mu, logvar = self(данные) потеря = self.loss(recon_data, data, mu, logvar) self.optimizer.zero_grad() потеря.назад() self.optimizer.step() total_loss += loss.item() средняя_потеря = общая_потеря/длин(data_loader.dataset) print(f'Epoch [{epoch + 1}/{n_epochs}], Потеря: {average_loss:.4f}') И, как я уже сказал, он не выдал никаких ошибок, просто обучился... Как это возможно, стоит ли мне волноваться, что он не использовал изображения в оттенках серого? А также, как мне исправить свой вывод?
Я имею в виду, что я могу исправить свой вывод разными способами, я могу просто проверить количество каналов и воспроизвести их, меня больше всего беспокоит то, что произошло во время обучения и почему оно не вызвало никаких ошибок? Я хочу, чтобы моя модель прошла обучение на всех моих изображениях.
РЕДАКТИРОВАТЬ: Я изменил свой вывод, чтобы решить мою насущную проблему, код теперь такой:
для image_name в tqdm(images_names): изображение = Image.open(путь_изображения+имя_изображения) изображение = преобразование (изображение). unsqueeze (0) print(путь_изображения+имя_изображения, image.shape) с torch.no_grad(): изображение = image.to(модель.устройство) если image.shape[1] == 1: изображение = image.expand(-1, 3, -1, -1) му, logvar = model.encode(изображение) latent_representations[image_name] = model.reparameterize(mu, logvar) latent_representations И я только что узнал, что у меня также есть 4-канальные изображения в моем наборе данных, ха-ха. Как, черт возьми, моя тренировка не сорвалась?
751 ../data/images/1682.jpg torch.Size([1, 3, 256, 256]) 752 ../data/images/1683.jpg torch.Size([1, 4, 256, 256]) Ошибка выполнения: учитывая группы = 1, вес размера [16, 3, 4, 4], ожидалось, что вход [1, 4, 256, 256] будет иметь 3 канала, но вместо этого получил 4 канала.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение