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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

PyCharm

エディター・開発ツール

Q&A

解決済

2回答

1685閲覧

chainer を利用してDQNをGPU実行したい

退会済みユーザー

退会済みユーザー

総合スコア0

Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2019/01/08 08:49

前提・実現したいこと

DQNのプログラムをGPUを使って実行したいのですが、以下のエラーを解決できずにいます。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "dqn.py", line 533, in <module> main() File "dqn.py", line 118, in main agent = Agent(learning_width, learning_height, interval_w, interval_h) File "dqn.py", line 349, in __init__ self.model = Neuralnet(self.tmp_size) File "dqn.py", line 323, in __init__ fc5=L.Linear(502656,3, initialW=cp.zeros((3, 502656), dtype=cp.float32)) File "/home/ユーザ名/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/chainer/links/connection/linear.py", line 105, in __init__ W_initializer = initializers._get_initializer(initialW) File "/home/ユーザ名/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/chainer/initializers/__init__.py", line 63, in _get_initializer raise TypeError('invalid type of initializer: %s' % type(initializer)) TypeError: invalid type of initializer: <class 'cupy.core.core.ndarray'>

該当のソースコード

Python

1#-*- coding: utf-8 -*- 2#ver0.41 2016/11/22 3#python全体で使うような奴の追加 4import argparse #起動時の引数設定 5import os #ファイルの削除ger 6import sys #シス 7import copy #データコピーテム関連(ここではプログラムの強制終了とか) 8import time #時間取得 9import random #ランダム 10import configparser #iniファイルいじる 11#from backports import configparser 12import threading #マルチスレッド 13import csv #csvファイルの扱い(出力用) 14from collections import deque #デック(deque)を扱えるようにする 15from tqdm import tqdm #プログレスバー 16#ニューラルネットワークに関する追加 17import numpy as np #数値計算補助(CPU) 18import cupy as cp #数値計算補助(GPU) 19import chainer #ディープネットワークのフレームワーク 20from chainer.backends import cuda 21from chainer import initializer 22import chainer.functions as F 23import chainer.links as L 24from chainer import cuda,Variable,optimizers #optimizerpipsを消した(自分) 25#画面操作に関する追加 26import pyautogui as ag #ディスプレイ内の画像検索、キーボード操作など 27from PIL import Image #RGB調べる 28#from PyQt4.QtGui import QPixmap,QApplication 29from PyQt5.Qt import * 30from PyQt5.QtGui import * 31from PyQt5.QtWidgets import * 32from PyQt5.QtCore import * 33#from PyQt5.QtWidgets import QApplication, QWidget 34#from PyQt5 import QtCore, QtGui, QtWidgets 35#from PyQt5.QtGui import QScreen 36#from PyQt5.QtCore import * 37 38中略 39 40#gpuがあればcupyなければnumpyを使う(cpu未確認) 41xp = cp if cuda.available else np 42#cp = cuda.cupy 43 44中略 45 46#メイン 47def main(): 48 49中略 50 51 52#ディープラーニングを行うためのニューラルネットクラス[1] 53class Neuralnet(chainer.Chain): 54 55 def __init__(self, in_size): 56 #モデル(ネットワークの形)の定義d 57 super(Neuralnet, self).__init__( 58 #チャネル数K,出力チャネル数M,フィルタサイズH,padパディング[2] 59 conv1=L.Convolution2D(in_size, 16, 8,stride=4,pad=2),#数値は適当(どうやって決めるんだ?) 60 conv2=L.Convolution2D(16, 32, 4, pad=2), 61 conv3=L.Convolution2D(32, 64, 2, pad=1), 62 #教えてくれた値,行動種類 63 #fc4=L.Linear(126,128), #アウトオブメモリーなので抜いた 64 fc5=L.Linear(502656,3, initialW=cp.zeros((3, 502656), dtype=cp.float32)) 65 ) 66 #gpuに持ってくところ 67 if cuda.available: 68 cuda.get_device(0).use() 69 self.to_gpu() 70 71 #x・・・入力 72 def __call__(self, x): 73 h = F.relu(self.conv1(x))#入力のスケールを[0,1]に 74 h = F.relu(self.conv2(h)) 75 h = F.relu(self.conv3(h)) 76 h = F.relu(self.fc4(h)) 77 y = self.fc5(h) 78 return y 79 80#学習を行うエージェント[3] 81class Agent(): 82 83 def __init__(self,learning_width, learning_height, interval_w, interval_h): 84 #経験メモリ 85 self.tmp_memory = deque() 86 self.tmp_size = 1#一つの状態が持つ画面数(実際のメモリサイズは+1) 87 self.memory = deque()#メモリ(キュー) 88 self.batch_size = 8#バッチサイズ 89 #モデル設定 90 self.model = Neuralnet(self.tmp_size) 91 self.target_model = copy.deepcopy(self.model) 92 #最適化設定 93 self.optimizer = optimizers.RMSpropGraves(lr=0.00025, alpha=0.95, momentum=0.95, eps=0.0001) 94 self.optimizer.setup(self.model) 95 #学習に使う画面サイズ(上のをコピーしてるだけ) 96 self.learning_width = learning_width 97 self.learning_height = learning_height 98 self.interval_w = interval_w 99 self.interval_h = interval_h 100 101 #εグリーディに使用する値 102 self.epsilon = 1#初期値 103 self.epsilon_decay = 1.0/70000#一回に下げる値 104 self.epsilon_min = 0.05#最低値 105 self.exploration = 35 106 #その他設定 107 self.step = 0#ステップ数 108 self.total_step = 0 109 self.goal = 0 110 self.gamma = 0.90# 割引率(ガンマ) 111 112中略 113 114 #Q学習による順伝搬 115 def Q_forward(self, state, action, reward, state_dash, ep_end): 116 #状態をVariable型に入れる 117 s = Variable(state) 118 s_dash = Variable(state_dash) 119 #順伝搬 120 Q = self.model(s) 121 tmp = self.target_model(s_dash)#次の行動の方はtarget_modelを使用 122 #次の行動のQの最大値求める奴 123 tmp = list(map(cp.max, tmp.data)) 124 max_Q_dash = xp.asanyarray(tmp, dtype=cp.float32) 125 target = xp.asanyarray(copy.deepcopy(Q.data), dtype=cp.float32) 126 #この後の計算でgpuモードが使えないので一度cpuに移動 127 max_Q_cpu = cuda.to_cpu(max_Q_dash) 128 target_cpu = cuda.to_cpu(target) 129 for i in range(self.batch_size): 130 #Q値計算(エピソードが終了するところでは報酬のみ) 131 target_cpu[i, action[i]] = reward[i] + (self.gamma * max_Q_cpu[i]) * (not ep_end[i]) 132 133 print(target_cpu[i,action[i]]) 134 135 #またネットワーク使うのでgpuに戻す 136 target2 = xp.array(target_cpu) 137 printtmp = (Q.data - Variable(target2).data) 138 print (printtmp) 139 140 #ロス計算 141 loss = F.mean_squared_error(Q, Variable(target2)) 142 self.loss = loss.data 143 return loss 144 145中略 146 147#以下参考 148#[1]DQNもどきの人のプログラム(https://github.com/trtd56/ClassicControl) 149#[2]Chainerの構造(http://jprogramer.com/ai/3758) 150 151

試したこと

nvidia-smi → 390.87
nvcc -V → Cuda compilation tools, release 9.0
などの確認はしましたが、cuda.pyが怪しいため cuda周りが怪しいと思われます。

補足情報(FW/ツールのバージョンなど)

Python:3.4.3
chainer:5.1.0
cupy:cupy-cuda90(cudaは9.0)
PyQt5:5.11.3
PyQt5-sip:4.19.13

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

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

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

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

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

guest

回答2

0

google翻訳
初期化子の型が無効です:<class 'cupy.core.core.ndarray'>

投稿2019/01/08 09:36

y_waiwai

総合スコア87719

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

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

0

ベストアンサー

https://docs.chainer.org/en/stable/reference/generated/chainer.links.Linear.html#chainer.links.Linear

initialW (initializer) – Initializer to initialize the weight. When it is numpy.ndarray, its ndim should be 2.


(参考)
https://github.com/chainer/chainer/blob/v5.1.0/chainer/initializers/init.py#L54

投稿2019/01/08 11:05

編集2019/01/08 13:04
quickquip

総合スコア11029

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

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

退会済みユーザー

退会済みユーザー

2019/01/10 10:53

fc5=L.Linear(502656,3, initialW=cp.zeros((3, 502656), dtype=cp.float32)) の行をコメントアウトしたところ、以下のエラーになりました。 Traceback (most recent call last): File "dqn.py", line 542, in <module> main() File "dqn.py", line 143, in main state = get_state(window_id, left, top, learning_width, learning_height, interval_w, interval_h,screen) File "dqn.py", line 266, in get_state screen = Image.fromarray(xp.asanyarray(bits).reshape((height,width,4))[::interval_w,::interval_h,2::-1]) File "/home/myname/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/PIL/Image.py", line 2483, in fromarray arr = obj.__array_interface__ AttributeError: 'cupy.core.core.ndarray' object has no attribute '__array_interface__' 怪しいソース: def get_state(win_id, left, top, width, height, interval_w, interval_h,screen): #pixmapにウィンドウの情報を渡す #QImageへの変換 pixmap=screen.grabWindow(win_id, left, top, width, height) print(pixmap) image = pixmap.toImage() bits= image.bits() bits.setsize(image.byteCount()) #数ピクセルに一つの割合でImage型RGBモードで保存しなおす #screen = Image.fromarray(cp.asanyarray(bits).reshape((height, width, 4))[::interval_w,::interval_h,2::-1]) screen = Image.fromarray(xp.asanyarray(bits).reshape((height,width,4))[::interval_w,::interval_h,2::-1]) state = xp.asanyarray(screen) #state = cp.asarray(screen) #state = xp.asarray(QScreen, dtype=xp.float32) ##いらない部分(画像保存できるか試してみる) #png2 = './piclog/' + str(agent.step) + '.png' #保存 #screen.save(png2) #書き込み可能に state.flags.writeable = True #元画像の緑だけを取り出す state = state[:,:,1] #戻り値にstate(現在の状態)を返す return state
quickquip

2019/01/10 11:03

回答(というかドキュメント)読んでますか?
退会済みユーザー

退会済みユーザー

2019/01/10 11:09

読みました。 fc5の要素数が2までということですか?
quickquip

2019/01/10 11:27

y_waiwaiさんの回答は読んでますか?
退会済みユーザー

退会済みユーザー

2019/01/10 11:31

もちろん拝見しました。 しかし勉強不足で理解できませんでした。 cupy.core.core.ndarrayクラスがどこにある何をするクラスなのかが分かりません。
quickquip

2019/01/10 11:45

ご自分で cp.zeros と書いてますよね?
退会済みユーザー

退会済みユーザー

2019/01/10 11:48

はい。
quickquip

2019/01/10 11:49

cp.zeros((3, 502656)) の返り値の型はなんですか? 何の型が返ってくると思って書いてますか?
退会済みユーザー

退会済みユーザー

2019/01/10 11:51

先輩からの流用のため意味を把握しておりません。 申し訳ありません。
quickquip

2019/01/10 23:15

あなたが把握していたかどうかは関係ない。把握してなかったとしても、聞かれてどう思ったのか、どう予想したのかは答えられるはず。調べることもできた。実行して確認することもできた(これが最良)。把握してないことはなにも申し訳なくない。
quickquip

2019/01/11 01:13 編集

それはそれとして、先輩のプログラムはそのまま動きましたか? 動いたのか、動いていたものがそのままのコードで動かなくなったのか、動いていたものを修正したら動かなくなったのかで話が違います。現時点で私が想像するもっともありそうな可能性は、その先輩は実はCPUでしか動かしてなくて(=GPUでは一度も動かしたことがなくて)、「GPUでも動きそうなコードに見せかけておきながら実はCPU専用のコードを渡された」です。
退会済みユーザー

退会済みユーザー

2019/01/11 06:37

返信ありがとうございます。 おっしゃるとおりです。 先輩のコードはPyQt4を使用する仕様になっており、GPUで動かすことを想定して書かれています。 ちなみにpython3でPyQt4をインストールにするにはsudo apt-get install python3-pyqt4で導入できると調べたら書かれていましたが、インストールできてもpip3 listやconda listで挙がってきません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問