質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2334閲覧

Tensor for argument #2 'mat1' is on CPU, but expected it to be on GPU の対処方法

kouji_39

総合スコア164

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/03 16:04

1.前提・実現したいこと
pytorchによる変分オートエンコーダの実装です。
google colab上で動かしています。
下記(2.)にエラーメッセージを示しました。
参考コードにある

784次元ベクトルを2次元ベクトルにencode

z = model.encode(Variable(images, volatile=True))
の部分でエラーが発生します。
gpu、cpuがらみのエラーなのでしょうか?
エラー解消法のご教授をお願いいたします。

2.発生している問題・エラーメッセージ
RuntimeError: Tensor for argument #2 'mat1' is on CPU, but expected it to be on GPU (while checking arguments for addmm)

3.参考コード
引用元は、「人工知能に関する断創録」様の下記のブログ(更新停止: 2019年12月31日)です。
https://aidiary.hatenablog.com/entry/20180228/1519828344

エポックは、時間短縮で10にしていますが、100でも動くことは確認済みです。

python

1import os 2import numpy as np 3import torch 4import torch.nn as nn 5import torch.utils.data 6import torch.optim as optim 7from torch.autograd import Variable 8from torch.nn import functional as F 9from torchvision import datasets, transforms 10from torchvision.utils import save_image 11 12batch_size = 128 13num_epochs = 10 14seed = 1 15out_dir = './vae_2' 16 17cuda = torch.cuda.is_available() 18if cuda: 19 print('cuda is available!') 20 21if not os.path.exists(out_dir): 22 os.mkdir(out_dir) 23 24torch.manual_seed(seed) 25if cuda: 26 torch.cuda.manual_seed(seed) 27 28train_loader = torch.utils.data.DataLoader( 29 datasets.MNIST('data', 30 train=True, 31 download=True, 32 transform=transforms.ToTensor()), 33 batch_size=batch_size, 34 shuffle=True 35) 36 37test_loader = torch.utils.data.DataLoader( 38 datasets.MNIST('data', 39 train=False, 40 transform=transforms.ToTensor()), 41 batch_size=batch_size, 42 shuffle=True 43) 44 45class VAE(nn.Module): 46 47 def __init__(self): 48 super(VAE, self).__init__() 49 50 self.fc1 = nn.Linear(784, 512) 51 self.fc21 = nn.Linear(512, 2) # mu 52 self.fc22 = nn.Linear(512, 2) # logvar 53 54 self.fc3 = nn.Linear(2, 512) 55 self.fc4 = nn.Linear(512, 784) 56 57 self.relu = nn.ReLU() 58 self.sigmoid = nn.Sigmoid() 59 60 def encode(self, x): 61 h = self.relu(self.fc1(x)) 62 return self.fc21(h), self.fc22(h) 63 64 def reparameterize(self, mu, logvar): 65 if self.training: 66 std = logvar.mul(0.5).exp_() 67 eps = Variable(std.data.new(std.size()).normal_()) 68 return eps.mul(std).add_(mu) 69 else: 70 return mu 71 72 def decode(self, z): 73 h = self.relu(self.fc3(z)) 74 return self.sigmoid(self.fc4(h)) 75 76 def forward(self, x): 77 x = x.view(-1, 784) 78 mu, logvar = self.encode(x) 79 z = self.reparameterize(mu, logvar) 80 return self.decode(z), mu, logvar 81 82model = VAE() 83if cuda: 84 model.cuda() 85optimizer = optim.Adam(model.parameters(), lr=1e-3) 86 87def loss_function(recon_x, x, mu, logvar): 88 # size_average=Falseなのでバッチ内のサンプルの合計lossを求める 89 # reconstruction loss 入力画像をどのくらい正確に復元できたか? 90 # 数式では対数尤度の最大化だが交差エントロピーlossの最小化と等価 91 recon = F.binary_cross_entropy(recon_x, x.view(-1, 784), size_average=False) 92 93 # 潜在空間zに対する正則化項 94 # P(z|x) が N(0, I)に近くなる(KL-distanceが小さくなる)ようにする 95 kld = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp()) 96 97 return recon + kld 98 99#https://blog.tamesuu.com/2019/09/24/415/ error対応 100def train(epoch): 101 model.train() 102 train_loss = 0 103 for batch_idx, (data, _) in enumerate(train_loader): 104 if cuda: 105 data = Variable(data.cuda()) 106 else: 107 data = Variable(data) 108 optimizer.zero_grad() 109 recon_batch, mu, logvar = model(data) 110 loss = loss_function(recon_batch, data, mu, logvar) 111 loss.backward() 112 train_loss += loss.data.item()#error対応 113 optimizer.step() 114 115 # loss_function() は平均ではなく全サンプルの合計lossを返すのでサンプル数で割る 116 train_loss /= len(train_loader.dataset) 117 118 return train_loss 119 120 121def test(epoch): 122 model.eval() 123 test_loss = 0 124 for batch_idx, (data, _) in enumerate(test_loader): 125 if cuda: 126 data = Variable(data.cuda(), volatile=True) 127 else: 128 data = Variable(data, volatile=True) 129 recon_batch, mu, logvar = model(data) 130 loss = loss_function(recon_batch, data, mu, logvar) 131 test_loss += loss.data.item()#error対応 132 133 if epoch % 10 == 0: 134 # 10エポックごとに最初のminibatchの入力画像と復元画像を保存 135 if batch_idx == 0: 136 n = 8 137 comparison = torch.cat([data[:n], 138 recon_batch.view(batch_size, 1, 28, 28)[:n]]) 139 save_image(comparison.data.cpu(), 140 '{}/reconstruction_{}.png'.format(out_dir, epoch), nrow=n) 141 142 test_loss /= len(test_loader.dataset) 143 144 return test_loss 145 146loss_list = [] 147test_loss_list = [] 148for epoch in range(1, num_epochs + 1): 149 loss = train(epoch) 150 test_loss = test(epoch) 151 152 print('epoch [{}/{}], loss: {:.4f} test_loss: {:.4f}'.format( 153 epoch + 1, 154 num_epochs, 155 loss, 156 test_loss)) 157 158 # logging 159 loss_list.append(loss) 160 test_loss_list.append(test_loss) 161 162# save the training model 163np.save('loss_list.npy', np.array(loss_list)) 164np.save('test_loss_list.npy', np.array(test_loss_list)) 165torch.save(model.state_dict(), 'vae.pth') 166 167# Commented out IPython magic to ensure Python compatibility. 168import matplotlib.pyplot as plt 169# %matplotlib inline 170loss_list = np.load('/content/loss_list.npy'.format(out_dir)) 171 172plt.plot(loss_list) 173plt.xlabel('epoch') 174plt.ylabel('loss') 175plt.grid() 176 177test_loss_list = np.load('/content/test_loss_list.npy'.format(out_dir)) 178plt.plot(test_loss_list) 179plt.xlabel('epoch') 180plt.ylabel('test loss') 181plt.grid() 182 183from IPython.display import Image 184Image('vae_2/reconstruction_10.png') 185 186Image('vae_2/reconstruction_100.png') 187 188model.load_state_dict(torch.load('/content/vae.pth'.format(out_dir), 189 map_location=lambda storage, 190 loc: storage)) 191test_dataset = datasets.MNIST('./data', download=True, train=False, transform=transforms.ToTensor()) 192test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=10000, shuffle=False) 193images, labels = iter(test_loader).next() 194images = images.view(10000, -1) 195 196# 784次元ベクトルを2次元ベクトルにencode 197z = model.encode(Variable(images, volatile=True)) 198 199mu, logvar = z 200mu, logvar = mu.data.numpy(), logvar.data.numpy() 201print(mu.shape, logvar.shape) 202 203import pylab 204import matplotlib.pyplot as plt 205plt.figure(figsize=(10, 10)) 206plt.scatter(mu[:, 0], mu[:, 1], marker='.', c=labels.numpy(), cmap=pylab.cm.jet) 207plt.colorbar() 208plt.xlim((-6, 6)) 209plt.ylim((-6, 6)) 210plt.grid()

4.補足情報(FW/ツールのバージョンなど)
開発環境:Google Colaboratory
プログラム言語:python3
OS:windows10 Home
CPU:Intel(R) Core(TM) i7-7500U CPU@2.70GHz 2.90GHz

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

z = model.encode(Variable(images, volatile=True))
の部分でエラーが発生します。
gpu、cpuがらみのエラーなのでしょうか?

基本的にはそういうことだと思います。
参考: pytorch でハマりやすいポイント
https://ryuiso2.hatenablog.com/entry/2020/01/13/013858

エラー解消法のご教授をお願いいたします。

images というのがまだ GPU側に行っていないことが基本的な問題なんだと思います。

z = model.encode(Variable(images, volatile=True).cuda())

とか、 .to(<<device>>) みたいな感じでどうでしょうか。

投稿2021/06/06 02:56

mokemokechicken

総合スコア948

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kouji_39

2021/06/06 04:28

回答者さまのご指導どおりに修正してみました。 mu, logvar = mu.data.numpy(), logvar.data.numpy()のところで、 TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.というエラーがでます。 # 784次元ベクトルを2次元ベクトルにencode z = model.encode(Variable(images, volatile=True).cuda()) #z = model.encode(Variable(images, volatile=True)) mu, logvar = z #下記コードでエラー発生 mu, logvar = mu.data.numpy(), logvar.data.numpy() print(mu.shape, logvar.shape)
mokemokechicken

2021/06/06 04:44

今度は、 Tensor が GPU 側(cuda:0)にあるので、CPU側に持ってこれないので mu, logvar = mu.data.cpu().numpy(), logvar.data.cpu().numpy() みたいな感じでどうでしょうか。
kouji_39

2021/06/06 06:33

mokemokechickenさん、適切なご指導ありがとうございます。 うまく作動しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問