Ошибка выполнения: размеры тензоров должны совпадать, за исключением измерения 1. Ожидался размер 18, но получен размер ⇐ Python
-
Anonymous
Ошибка выполнения: размеры тензоров должны совпадать, за исключением измерения 1. Ожидался размер 18, но получен размер
Я новичок в Pytorch и использую предварительно обученную модель для своего приложения Django, которая восстанавливает поврежденные изображения. Я воспользовался помощью кода, приведенного в этом репозитории.
Код моего класса модели ML выглядит следующим образом:
класс Песочные часы(nn.Module): защита __init__(сам): super(Песочные часы, self).__init__() self.leaky_relu = nn.LeakyReLU() self.d_conv_1 = nn.Conv2d(2, 8, 5, шаг=2, заполнение=2) self.d_bn_1 = nn.BatchNorm2d(8) self.d_conv_2 = nn.Conv2d(8, 16, 5, шаг=2, заполнение=2) self.d_bn_2 = nn.BatchNorm2d(16) self.d_conv_3 = nn.Conv2d(16, 32, 5, шаг=2, заполнение=2) self.d_bn_3 = nn.BatchNorm2d(32) self.s_conv_3 = nn.Conv2d(32, 4, 5, шаг=1, заполнение=2) self.d_conv_4 = nn.Conv2d(32, 64, 5, шаг=2, отступ=2) self.d_bn_4 = nn.BatchNorm2d(64) self.s_conv_4 = nn.Conv2d(64, 4, 5, шаг = 1, заполнение = 2) self.d_conv_5 = nn.Conv2d(64, 128, 5, шаг=2, отступ=2) self.d_bn_5 = nn.BatchNorm2d(128) self.s_conv_5 = nn.Conv2d(128, 4, 5, шаг = 1, отступ = 2) self.d_conv_6 = nn.Conv2d(128, 256, 5, шаг=2, отступ=2) self.d_bn_6 = nn.BatchNorm2d(256) self.u_deconv_5 = nn.ConvTranspose2d(256, 64, 4, шаг=2, заполнение=1) self.u_bn_5 = nn.BatchNorm2d(64) self.u_deconv_4 = nn.ConvTranspose2d(128, 32, 4, шаг=2, заполнение=1) self.u_bn_4 = nn.BatchNorm2d(32) self.u_deconv_3 = nn.ConvTranspose2d(64, 16, 4, шаг=2, заполнение=1) self.u_bn_3 = nn.BatchNorm2d(16) self.u_deconv_2 = nn.ConvTranspose2d(32, 8, 4, шаг=2, заполнение=1) self.u_bn_2 = nn.BatchNorm2d(8) self.u_deconv_1 = nn.ConvTranspose2d(16, 4, 4, шаг = 2, отступ = 1) self.u_bn_1 = nn.BatchNorm2d(4) self.out_deconv = nn.ConvTranspose2d(4, 4, 4, шаг = 2, заполнение = 1) self.out_bn = nn.BatchNorm2d(4) def вперед(сам, шум): down_1 = self.d_conv_1(шум) down_1 = self.d_bn_1(down_1) down_1 = self.leaky_relu(down_1) down_2 = self.d_conv_2(down_1) down_2 = self.d_bn_2(down_2) down_2 = self.leaky_relu(down_2) down_3 = self.d_conv_3(down_2) down_3 = self.d_bn_3(down_3) down_3 = self.leaky_relu(down_3) Skip_3 = self.s_conv_3(вниз_3) down_4 = self.d_conv_4(down_3) down_4 = self.d_bn_4(down_4) down_4 = self.leaky_relu(down_4) Skip_4 = self.s_conv_4(вниз_4) down_5 = self.d_conv_5(down_4) down_5 = self.d_bn_5(down_5) down_5 = self.leaky_relu(down_5) Skip_5 = self.s_conv_5(вниз_5) down_6 = self.d_conv_6(down_5) down_6 = self.d_bn_6(down_6) down_6 = self.leaky_relu(down_6) up_5 = self.u_deconv_5(down_6) up_5 = torch.cat([up_5,skip_5], 1) up_5 = self.u_bn_5(up_5) up_5 = self.leaky_relu(up_5) up_4 = self.u_deconv_4(up_5) up_4 = torch.cat([up_4,skip_4], 1) up_4 = self.u_bn_4(up_4) up_4 = self.leaky_relu(up_4) up_3 = self.u_deconv_3(up_4) up_3 = torch.cat([up_3,skip_3], 1) up_3 = self.u_bn_3(up_3) up_3 = self.leaky_relu(up_3) up_2 = self.u_deconv_2(up_3) up_2 = self.u_bn_2(up_2) up_2 = self.leaky_relu(up_2) up_1 = self.u_deconv_1(up_2) up_1 = self.u_bn_1(up_1) up_1 = self.leaky_relu(up_1) out = self.out_deconv(up_1) выход = self.out_bn(выход) выход = nn.Sigmoid()(выход) вернуться и я использую его, на мой взгляд, для восстановления изображения, которое выглядит следующим образом:
def restrestore_image_deep_image_prior(original_image_path): лр = 1e-2 устройство = 'процессор' print('Использование {} для вычислений'.format(device.upper())) hg_net = Песочные часы() hg_net.to (устройство) мсе = nn.MSELoss() оптимизатор = optim.Adam(hg_net.parameters(), lr=lr) n_iter = 500 изображения = [] потери = [] to_tensor = tv.transforms.ToTensor() z = torch.Tensor(np.mgrid[:542, :347]).unsqueeze(0).to(device) / 512 # Отрегулируйте размер в соответствии с вашими требованиями x = PILImage.open(исходный_путь_изображения) x = to_tensor(x).unsqueeze(0) х, маска = пиксель_танос (х, 0,5) маска = маска[:, :3, :, :].to(device).float() # Сохраняем только первые 3 канала, если маска имеет 4 канала x = x.to(устройство) для меня в диапазоне (n_iter): оптимизатор.zero_grad() y = hg_net(z) потеря = mse(x, y*маска) потери.append(loss.item()) потеря.назад() оптимизатор.шаг() если я 0 и p < 1, «Значение вероятности должно лежать в (0, 1)» маска = torch.rand(1, 3, 542, 347) img[маска п маска = маска.повторение(1, 3, 1, 1) вернуть img, маску защита image_to_bytes (изображение): буфер = БайтыIO() image.save(буфер, формат="JPEG") вернуть буфер.getvalue() Проблема в том, что я также получаю сообщение об ошибке прослушивания в заголовке, а именно:
Traceback (самый последний вызов — последний): Файл «C:\Users\khubi\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\Exception.py», строка 55, во внутреннем ответ = get_response (запрос) Файл «C:\Users\khubi\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\base.py», строка 197, в _get_response ответ = обернутый_callback(запрос, *callback_args, **callback_kwargs) Файл «C:\Users\khubi\Desktop\Projects\VU\CS619\image restorer\image_restorer\image_app\views.py», строка 35, в restre_image восстановленное_изображение = восстановление_изображения_deep_image_prior(исходное_изображение.файл_изображения.путь) Файл «C:\Users\khubi\Desktop\Projects\VU\CS619\image restorer\image_restorer\image_app\views.py», строка 76, в restre_image_deep_image_prior y = hg_net(z) Файл «C:\Users\khubi\AppData\Local\Programs\Python\Python39\lib\site-packages\torch\nn\modules\module.py», строка 1518, в _wrapped_call_impl return self._call_impl(*args, **kwargs) Файл «C:\Users\khubi\AppData\Local\Programs\Python\Python39\lib\site-packages\torch\nn\modules\module.py», строка 1527, в _call_impl return front_call(*args, **kwargs) Файл «C:\Users\khubi\Desktop\Projects\VU\CS619\image restorer\image_restorer\image_app\views.py», строка 182, вперед up_5 = torch.cat([up_5,skip_5], 1) Ошибка выполнения: размеры тензоров должны совпадать, за исключением измерения 1. Ожидался размер 18, но получен размер 17 для тензора номер 1 в списке. Я знаю, что мне нужно было настроить каналы. Я установил значение 4, поскольку изображение, которое я использую для восстановления, имеет 4 канала. Но все равно получаю ошибку. Как это решить?
Я новичок в Pytorch и использую предварительно обученную модель для своего приложения Django, которая восстанавливает поврежденные изображения. Я воспользовался помощью кода, приведенного в этом репозитории.
Код моего класса модели ML выглядит следующим образом:
класс Песочные часы(nn.Module): защита __init__(сам): super(Песочные часы, self).__init__() self.leaky_relu = nn.LeakyReLU() self.d_conv_1 = nn.Conv2d(2, 8, 5, шаг=2, заполнение=2) self.d_bn_1 = nn.BatchNorm2d(8) self.d_conv_2 = nn.Conv2d(8, 16, 5, шаг=2, заполнение=2) self.d_bn_2 = nn.BatchNorm2d(16) self.d_conv_3 = nn.Conv2d(16, 32, 5, шаг=2, заполнение=2) self.d_bn_3 = nn.BatchNorm2d(32) self.s_conv_3 = nn.Conv2d(32, 4, 5, шаг=1, заполнение=2) self.d_conv_4 = nn.Conv2d(32, 64, 5, шаг=2, отступ=2) self.d_bn_4 = nn.BatchNorm2d(64) self.s_conv_4 = nn.Conv2d(64, 4, 5, шаг = 1, заполнение = 2) self.d_conv_5 = nn.Conv2d(64, 128, 5, шаг=2, отступ=2) self.d_bn_5 = nn.BatchNorm2d(128) self.s_conv_5 = nn.Conv2d(128, 4, 5, шаг = 1, отступ = 2) self.d_conv_6 = nn.Conv2d(128, 256, 5, шаг=2, отступ=2) self.d_bn_6 = nn.BatchNorm2d(256) self.u_deconv_5 = nn.ConvTranspose2d(256, 64, 4, шаг=2, заполнение=1) self.u_bn_5 = nn.BatchNorm2d(64) self.u_deconv_4 = nn.ConvTranspose2d(128, 32, 4, шаг=2, заполнение=1) self.u_bn_4 = nn.BatchNorm2d(32) self.u_deconv_3 = nn.ConvTranspose2d(64, 16, 4, шаг=2, заполнение=1) self.u_bn_3 = nn.BatchNorm2d(16) self.u_deconv_2 = nn.ConvTranspose2d(32, 8, 4, шаг=2, заполнение=1) self.u_bn_2 = nn.BatchNorm2d(8) self.u_deconv_1 = nn.ConvTranspose2d(16, 4, 4, шаг = 2, отступ = 1) self.u_bn_1 = nn.BatchNorm2d(4) self.out_deconv = nn.ConvTranspose2d(4, 4, 4, шаг = 2, заполнение = 1) self.out_bn = nn.BatchNorm2d(4) def вперед(сам, шум): down_1 = self.d_conv_1(шум) down_1 = self.d_bn_1(down_1) down_1 = self.leaky_relu(down_1) down_2 = self.d_conv_2(down_1) down_2 = self.d_bn_2(down_2) down_2 = self.leaky_relu(down_2) down_3 = self.d_conv_3(down_2) down_3 = self.d_bn_3(down_3) down_3 = self.leaky_relu(down_3) Skip_3 = self.s_conv_3(вниз_3) down_4 = self.d_conv_4(down_3) down_4 = self.d_bn_4(down_4) down_4 = self.leaky_relu(down_4) Skip_4 = self.s_conv_4(вниз_4) down_5 = self.d_conv_5(down_4) down_5 = self.d_bn_5(down_5) down_5 = self.leaky_relu(down_5) Skip_5 = self.s_conv_5(вниз_5) down_6 = self.d_conv_6(down_5) down_6 = self.d_bn_6(down_6) down_6 = self.leaky_relu(down_6) up_5 = self.u_deconv_5(down_6) up_5 = torch.cat([up_5,skip_5], 1) up_5 = self.u_bn_5(up_5) up_5 = self.leaky_relu(up_5) up_4 = self.u_deconv_4(up_5) up_4 = torch.cat([up_4,skip_4], 1) up_4 = self.u_bn_4(up_4) up_4 = self.leaky_relu(up_4) up_3 = self.u_deconv_3(up_4) up_3 = torch.cat([up_3,skip_3], 1) up_3 = self.u_bn_3(up_3) up_3 = self.leaky_relu(up_3) up_2 = self.u_deconv_2(up_3) up_2 = self.u_bn_2(up_2) up_2 = self.leaky_relu(up_2) up_1 = self.u_deconv_1(up_2) up_1 = self.u_bn_1(up_1) up_1 = self.leaky_relu(up_1) out = self.out_deconv(up_1) выход = self.out_bn(выход) выход = nn.Sigmoid()(выход) вернуться и я использую его, на мой взгляд, для восстановления изображения, которое выглядит следующим образом:
def restrestore_image_deep_image_prior(original_image_path): лр = 1e-2 устройство = 'процессор' print('Использование {} для вычислений'.format(device.upper())) hg_net = Песочные часы() hg_net.to (устройство) мсе = nn.MSELoss() оптимизатор = optim.Adam(hg_net.parameters(), lr=lr) n_iter = 500 изображения = [] потери = [] to_tensor = tv.transforms.ToTensor() z = torch.Tensor(np.mgrid[:542, :347]).unsqueeze(0).to(device) / 512 # Отрегулируйте размер в соответствии с вашими требованиями x = PILImage.open(исходный_путь_изображения) x = to_tensor(x).unsqueeze(0) х, маска = пиксель_танос (х, 0,5) маска = маска[:, :3, :, :].to(device).float() # Сохраняем только первые 3 канала, если маска имеет 4 канала x = x.to(устройство) для меня в диапазоне (n_iter): оптимизатор.zero_grad() y = hg_net(z) потеря = mse(x, y*маска) потери.append(loss.item()) потеря.назад() оптимизатор.шаг() если я 0 и p < 1, «Значение вероятности должно лежать в (0, 1)» маска = torch.rand(1, 3, 542, 347) img[маска п маска = маска.повторение(1, 3, 1, 1) вернуть img, маску защита image_to_bytes (изображение): буфер = БайтыIO() image.save(буфер, формат="JPEG") вернуть буфер.getvalue() Проблема в том, что я также получаю сообщение об ошибке прослушивания в заголовке, а именно:
Traceback (самый последний вызов — последний): Файл «C:\Users\khubi\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\Exception.py», строка 55, во внутреннем ответ = get_response (запрос) Файл «C:\Users\khubi\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\base.py», строка 197, в _get_response ответ = обернутый_callback(запрос, *callback_args, **callback_kwargs) Файл «C:\Users\khubi\Desktop\Projects\VU\CS619\image restorer\image_restorer\image_app\views.py», строка 35, в restre_image восстановленное_изображение = восстановление_изображения_deep_image_prior(исходное_изображение.файл_изображения.путь) Файл «C:\Users\khubi\Desktop\Projects\VU\CS619\image restorer\image_restorer\image_app\views.py», строка 76, в restre_image_deep_image_prior y = hg_net(z) Файл «C:\Users\khubi\AppData\Local\Programs\Python\Python39\lib\site-packages\torch\nn\modules\module.py», строка 1518, в _wrapped_call_impl return self._call_impl(*args, **kwargs) Файл «C:\Users\khubi\AppData\Local\Programs\Python\Python39\lib\site-packages\torch\nn\modules\module.py», строка 1527, в _call_impl return front_call(*args, **kwargs) Файл «C:\Users\khubi\Desktop\Projects\VU\CS619\image restorer\image_restorer\image_app\views.py», строка 182, вперед up_5 = torch.cat([up_5,skip_5], 1) Ошибка выполнения: размеры тензоров должны совпадать, за исключением измерения 1. Ожидался размер 18, но получен размер 17 для тензора номер 1 в списке. Я знаю, что мне нужно было настроить каналы. Я установил значение 4, поскольку изображение, которое я использую для восстановления, имеет 4 канала. Но все равно получаю ошибку. Как это решить?