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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

Q&A

解決済

3回答

1708閲覧

numpy <- cupy で、np.add.atのエラー

teefpc

総合スコア111

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

0グッド

1クリップ

投稿2019/06/30 02:00

編集2019/07/07 11:27

GPUを使うために以下のコードを実行すると
AttributeError: 'cupy.core._kernel.ufunc' object has no attribute 'at'
というエラーとなります。GPUは、geForce GTX 750Ti ですがcuda、cudnn などの問題でしょうか。

Python

1import cupy as np 2np.cuda.set_allocator(np.cuda.MemoryPool().malloc) 3np.add.at = np.scatter_add

参考「ゼロから作るdeep learning 2」

Python

1# coding: utf-8 2from common.config import GPU 3 4 5if GPU: 6 import cupy as np 7 np.cuda.set_allocator(np.cuda.MemoryPool().malloc) 8 np.add.at = np.scatter_add 9 10 print('\033[92m' + '-' * 60 + '\033[0m') 11 print(' ' * 23 + '\033[92mGPU Mode (cupy)\033[0m') 12 print('\033[92m' + '-' * 60 + '\033[0m\n') 13else: 14 import numpy as np

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

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

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

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

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

guest

回答3

0

私も同書で同じエラーに遭遇しましたが以下のように対処しました。
上記でも説明されているようにcupy.addにはatという属性がありませんが、
cupyのメソッドを調べてみるとnumpy.add.atとcupy.scatter_addは等価です。
なので、cupyを使う時にはnp.add.atを使っている箇所で、例えばcommon.config.GPUをフラグにして、
np.add.atとcupy.scatter_addを切り替えてやることで先に進めました。
GTX1070で、数十分位で学習できました。ご参考まで。

投稿2019/07/18 11:53

mkoba_14

総合スコア16

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

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

0

ベストアンサー

すみません、横から失礼します。

私もまさにその部分でエラーが出て止まってしまった為、
①common.np中のnp.add.at = np.scatter_add の記載をコメントアウトして
②common.layers中のEmbeddingの逆伝播中の np.add.atの部分を cupy.scatter_addに書き換えてみたのですが動かず。

③common.config中で np.add.at = cupy.scatter_add を記載しないとダメだということでしょうか?

投稿2019/07/18 18:20

Panda3010

総合スコア17

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

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

mkoba_14

2019/07/19 03:54

③は要りません。configはそのままで結構だと思います。 common.npではGPUを選択するとimport cupy as npとなっているので、 ②のEmbedding内ではcupy.scatter_addでなくnp.scatter_addでよいですね。 (先の説明では適当なことを言ってしまいました・・・。 "cupy"で呼び出してしまうと、Embeddingの中のimport文を変更する必要があります。) *以上はもちろんCUDAとcupyが適切にインストールされていることが前提です。
Panda3010

2019/07/19 11:54

早速の詳細なアドバイス有難うございます!試してみます。
Panda3010

2019/07/19 23:46

おかげ様で、以下修正をすることでcupy/gpuベースで動かすことができました。有り難うございました。 ①common.np中の np.add.at = np.scatter_add をコメントアウト (これを残すとまだ cupyの no attribute 'at' エラーが出ました) ②common.layer中の Embedding 逆伝播の中を以下のif文に書き換え if GPU: np.scatter_add(dW, self.idx, dout) else: np.add.at(dW, self.idx, dout)
teefpc

2019/08/24 01:47

みなさん、有益な情報をどうもありがとうございました。
guest

0

エラーメッセージは、cupy.addにはatという属性がないという文法上のエラーかと思われます。公式ドキュメントによるとcupy.addは関数なので、記法としては、cupy.add(a,b)aエラーメッセージは、cupy.addにはatという属性がないという文法上のエラーかと思われます。公式ドキュメントによるとcupy.addは関数なので、記法としては、cupy.add(a,b)が正しいようです。(aおよびbはcupy用に変換された配列)

また、cupy.addは関数なので戻り値があります。よって、=を使うのであれば、cupy.addは右辺にないとまずいように思います。

投稿2019/06/30 14:28

R.Shigemori

総合スコア3376

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

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

teefpc

2019/07/07 09:08

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問