Deep learning 卷积自动编码器错误-';运行时错误:输入类型(torch.cuda.ByteTensor)和权重类型(torch.FloatTensor)应相同';

Deep learning 卷积自动编码器错误-';运行时错误:输入类型(torch.cuda.ByteTensor)和权重类型(torch.FloatTensor)应相同';,deep-learning,conv-neural-network,pytorch,autoencoder,Deep Learning,Conv Neural Network,Pytorch,Autoencoder,对于以下模型,我收到错误“预期步幅为单值整数或列表”。我使用了来自的建议答案 并补充说 img.unsqueeze_(0) 我现在收到错误消息: RuntimeError: Input type (torch.cuda.ByteTensor) and weight type (torch.FloatTensor) should be the same 对于以下代码,我将使用三个示例图像,并尝试使用自动编码器学习它们的表示: %reset -f import torch.utils.data

对于以下模型,我收到错误“预期步幅为单值整数或列表”。我使用了来自的建议答案 并补充说

img.unsqueeze_(0)
我现在收到错误消息:

RuntimeError: Input type (torch.cuda.ByteTensor) and weight type (torch.FloatTensor) should be the same
对于以下代码,我将使用三个示例图像,并尝试使用自动编码器学习它们的表示:

%reset -f

import torch.utils.data as data_utils
import warnings
warnings.filterwarnings('ignore')
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import pyplot as plt
from sklearn import metrics
import datetime
from sklearn.preprocessing import MultiLabelBinarizer
import seaborn as sns
sns.set_style("darkgrid")
from ast import literal_eval
import numpy as np
from sklearn.preprocessing import scale
import seaborn as sns
sns.set_style("darkgrid")
import torch
import torch
import torchvision
import torch.nn as nn
from torch.autograd import Variable
from os import listdir
import cv2
import torch.nn.functional as F
import numpy as np
from numpy.polynomial.polynomial import polyfit
import matplotlib.pyplot as plt


number_channels = 3

%matplotlib inline

x = np.arange(10)
m = 1
b = 2
y = x * x
plt.plot(x, y)
plt.axis('off')
plt.savefig('1-increasing.jpg')

x = np.arange(10)
m = 0.01
b = 2
y = x * x * x
plt.plot(x, y)
plt.axis('off')
plt.savefig('2-increasing.jpg')

x = np.arange(10)
m = 0
b = 2
y = (m*x)+b
plt.plot(x, y)
plt.axis('off')
plt.savefig('constant.jpg')

batch_size_value = 2

train_image = []

train_image.append(cv2.imread('1-increasing.jpg', cv2.IMREAD_UNCHANGED).reshape(3, 288, 432))
train_image.append(cv2.imread('2-increasing.jpg', cv2.IMREAD_UNCHANGED).reshape(3, 288, 432))
train_image.append(cv2.imread('decreasing.jpg', cv2.IMREAD_UNCHANGED).reshape(3, 288, 432))
train_image.append(cv2.imread('constant.jpg', cv2.IMREAD_UNCHANGED).reshape(3, 288, 432))

data_loader = data_utils.DataLoader(train_image, batch_size=batch_size_value, shuffle=False,drop_last=True)

import torch
import torchvision
from torch import nn
from torch.autograd import Variable
from torch.utils.data import DataLoader
from torchvision import transforms
from torchvision.utils import save_image
from torchvision.datasets import MNIST
import os

if not os.path.exists('./dc_img'):
    os.mkdir('./dc_img')


def to_img(x):
    x = 0.5 * (x + 1)
    x = x.clamp(0, 1)
    x = x.view(x.size(0), 1, 28, 28)
    return x


num_epochs = 100
# batch_size = 128
batch_size = 2

learning_rate = 1e-3
dataloader = data_loader

class autoencoder(nn.Module):
    def __init__(self):
        super(autoencoder, self).__init__()
        self.encoder = nn.Sequential(
            nn.Conv2d(3, 16, 3, stride=3, padding=1),  # b, 16, 10, 10
            nn.ReLU(True),
            nn.MaxPool2d(2, stride=2),  # b, 16, 5, 5
            nn.Conv2d(16, 8, 3, stride=2, padding=1),  # b, 8, 3, 3
            nn.ReLU(True),
            nn.MaxPool3d(3, stride=1)  # b, 8, 2, 2
        )
        self.decoder = nn.Sequential(
            nn.ConvTranspose3d(8, 16, 3, stride=2),  # b, 16, 5, 5
            nn.ReLU(True),
            nn.ConvTranspose3d(16, 8, 5, stride=3, padding=1),  # b, 8, 15, 15
            nn.ReLU(True),
            nn.ConvTranspose3d(8, 1, 2, stride=2, padding=1),  # b, 1, 28, 28
            nn.Tanh()
        )

    def forward(self, x):
        x = self.encoder(x)
        x = self.decoder(x)
        return x


model = autoencoder()
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate,
                             weight_decay=1e-5)

for epoch in range(num_epochs):
    for data in dataloader:
        img, _ = data
        img.unsqueeze_(0)
#         img.unsqueeze_(0)
#         print(img)
#         img.unsqueeze_(0)
        img = Variable(img).cuda()
        # ===================forward=====================
        output = model(img)
        loss = criterion(output, img)
        # ===================backward====================
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    # ===================log=================to_img=======
    print('epoch [{}/{}], loss:{:.4f}'
          .format(epoch+1, num_epochs, loss.data[0]))
    if epoch % 10 == 0:
        pic = to_img(output.cpu().data)
        save_image(pic, './dc_img/image_{}.png'.format(epoch))

torch.save(model.state_dict(), './conv_autoencoder.pth')
但如前所述,这会导致错误:

-->301自填充、自膨胀、自组) 302 303

运行时错误:输入类型(torch.cuda.ByteTensor)和权重类型 (torch.FLOTTENSOR)应相同

该问题似乎与
img.unsqueze_u0)
有关


如何在这些图像上训练自动编码器?

这是因为您的图像张量位于GPU中(在这里发生的是
img=Variable(img).cuda()
),而您的模型仍在RAM中。请记住,您需要显式调用
cuda()
将张量(或
nn.Module
的实例)发送到GPU

只需更改这一行:

model = autoencoder()
为此:

model = autoencoder().cuda()
0


如果您希望使用cuda培训您的模型。确保您的模型和模型的输入都转移到GPU。仅移动模型或仅移动输入将导致此类错误。

谢谢,但这种更改会导致错误“运行时错误:输入类型(torch.cuda.ByteTensor)和权重类型(torch.cuda.FloatTensor)应该是相同的”我想您需要的是先将np ndarray转换为tensor的函数,然后再使用
变量()
。但您使用的是pytorch 0.3,我承认我从未使用过该版本,所以不能保证任何事情
model = autoencoder().cuda()