Skip to content

RuntimeError: Expected object of device type cuda but got device type cpu for argument #2 'mat1' in call to _th_addmm #12

@tjf801

Description

@tjf801

I am trying to run this program, but it is returning
RuntimeError: Expected object of device type cuda but got device type cpu for argument #2 'mat1' in call to _th_addmm.

Note: I am using the notebook file as an actual python file.

from IPython import display

from utils import Logger

import torch
from torch import nn, optim
from torch.autograd.variable import Variable
from torchvision import transforms, datasets

DATA_FOLDER = './torch_data/VGAN/MNIST'
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

print(torch.cuda.is_available(), device)

def mnist_data():
	compose = transforms.Compose([
		transforms.ToTensor(), transforms.Normalize([0.5], [0.5])])
	out_dir = '{}/dataset'.format(DATA_FOLDER)
	return datasets.MNIST(root=out_dir, train=True, transform=compose, download=True)

# Load data
data = mnist_data()
# Create loader with data, so that we can iterate over it
data_loader = torch.utils.data.DataLoader(data, batch_size=100, shuffle=True)
# Num batches
num_batches = len(data_loader)

class DiscriminatorNet(torch.nn.Module):
	"""
	A three hidden-layer discriminative neural network
	"""
	def __init__(self):
		super(DiscriminatorNet, self).__init__()
		n_features = 784
		n_out = 1
		
		self.hidden0 = nn.Sequential( 
			nn.Linear(n_features, 1024),
			nn.LeakyReLU(0.2),
			nn.Dropout(0.3)
		)
		self.hidden1 = nn.Sequential(
			nn.Linear(1024, 512),
			nn.LeakyReLU(0.2),
			nn.Dropout(0.3)
		)
		self.hidden2 = nn.Sequential(
			nn.Linear(512, 256),
			nn.LeakyReLU(0.2),
			nn.Dropout(0.3)
		)
		self.out = nn.Sequential(
			torch.nn.Linear(256, n_out),
			torch.nn.Sigmoid()
		)

	def forward(self, x):
		x = self.hidden0(x)
		x = self.hidden1(x)
		x = self.hidden2(x)
		x = self.out(x)
		return x

class GeneratorNet(torch.nn.Module):
	"""
	A three hidden-layer generative neural network
	"""
	def __init__(self):
		super(GeneratorNet, self).__init__()
		n_features = 100
		n_out = 784
		
		self.hidden0 = nn.Sequential(
			nn.Linear(n_features, 256),
			nn.LeakyReLU(0.2)
		)
		self.hidden1 = nn.Sequential(            
			nn.Linear(256, 512),
			nn.LeakyReLU(0.2)
		)
		self.hidden2 = nn.Sequential(
			nn.Linear(512, 1024),
			nn.LeakyReLU(0.2)
		)
		
		self.out = nn.Sequential(
			nn.Linear(1024, n_out),
			nn.Tanh()
		)

	def forward(self, x):
		x = self.hidden0(x)
		x = self.hidden1(x)
		x = self.hidden2(x)
		x = self.out(x)
		return x

def images_to_vectors(images):
    return images.view(images.size(0), 784)

def vectors_to_images(vectors):
    return vectors.view(vectors.size(0), 1, 28, 28)

def noise(size):
	'''
	Generates a 1-d vector of gaussian sampled random values
	'''
	n = Variable(torch.randn(size, 100))
	return n

discriminator = DiscriminatorNet()
generator = GeneratorNet()
if torch.cuda.is_available():
	discriminator.cuda()
	generator.cuda()

# Optimizers
d_optimizer = optim.Adam(discriminator.parameters(), lr=0.0002)
g_optimizer = optim.Adam(generator.parameters(), lr=0.0002)

# Loss function
loss = nn.BCELoss()

# Number of steps to apply to the discriminator
d_steps = 1  # In Goodfellow et. al 2014 this variable is assigned to 1
# Number of epochs
num_epochs = 200

def real_data_target(size):
	'''
	Tensor containing ones, with shape = size
	'''
	data = Variable(torch.ones(size, 1))
	if torch.cuda.is_available(): return data.cuda()
	return data

def fake_data_target(size):
	'''
	Tensor containing zeros, with shape = size
	'''
	data = Variable(torch.zeros(size, 1))
	if torch.cuda.is_available(): return data.cuda()
	return data

def train_discriminator(optimizer, real_data, fake_data):
	# Reset gradients
	optimizer.zero_grad()
	
	# 1.1 Train on Real Data
	prediction_real = discriminator(real_data)
	# Calculate error and backpropagate
	error_real = loss(prediction_real, real_data_target(real_data.size(0)))
	error_real.backward()

	# 1.2 Train on Fake Data
	prediction_fake = discriminator(fake_data)
	# Calculate error and backpropagate
	error_fake = loss(prediction_fake, fake_data_target(real_data.size(0)))
	error_fake.backward()
	
	# 1.3 Update weights with gradients
	optimizer.step()
	
	# Return error
	return error_real + error_fake, prediction_real, prediction_fake

def train_generator(optimizer, fake_data):
	# 2. Train Generator
	# Reset gradients
	optimizer.zero_grad()
	# Sample noise and generate fake data
	prediction = discriminator(fake_data)
	# Calculate error and backpropagate
	error = loss(prediction, real_data_target(prediction.size(0)))
	error.backward()
	# Update weights with gradients
	optimizer.step()
	# Return error
	return error

num_test_samples = 16
test_noise = noise(num_test_samples)

logger = Logger(model_name='VGAN', data_name='MNIST')

for epoch in range(num_epochs):
	for n_batch, (real_batch,_) in enumerate(data_loader):
				
		# 1. Train Discriminator
		real_data = Variable(images_to_vectors(real_batch))
		if torch.cuda.is_available(): real_data = real_data.cuda()
		# Generate fake data
		fake_data = generator(noise(real_data.size(0))).detach()
		# Train D
		d_error, d_pred_real, d_pred_fake = train_discriminator(d_optimizer,
																real_data, fake_data)

		# 2. Train Generator
		# Generate fake data
		fake_data = generator(noise(real_batch.size(0)))
		# Train G
		g_error = train_generator(g_optimizer, fake_data)
		# Log error
		logger.log(d_error, g_error, epoch, n_batch, num_batches)

		# Display Progress
		if (n_batch) % 100 == 0:
			display.clear_output(True)
			# Display Images
			test_images = vectors_to_images(generator(test_noise)).data.cpu()
			logger.log_images(test_images, num_test_samples, epoch, n_batch, num_batches);
			# Display status Logs
			logger.display_status(
				epoch, num_epochs, n_batch, num_batches,
				d_error, g_error, d_pred_real, d_pred_fake
			)
		# Model Checkpoints
		logger.save_models(generator, discriminator, epoch)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions