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

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

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

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

Python

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

Q&A

解決済

1回答

1679閲覧

『ゼロから作るディープラーニング』4章 4.2.4 【バッチ対応版】交差エントロピー誤差

hiyokorunner

総合スコア18

NumPy

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

Python

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

0グッド

1クリップ

投稿2018/11/18 05:54

『ゼロから作るディープラーニング 第4章』、『4.2.4 【バッチ対応版】 交差エントロピー誤差』の下半分のコード理解出来なくなりました。

python

1def cross_entropy_error(y, t): 2 if y.ndim == 1: 3 t = t.reshape(1, t.size) 4 y = y.reshape(1, y.size) 5 batch_size = y.shape[0] 6 return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size

最終行で使われている、

python

1-np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) ・・・①とする。

の挙動が分かりません。


例えば、

python

1np.arange(5) = np.array([0,1,2,3,4]) 2y = np.random.rand(100, 784) ※学習データ(28*28の画像データが100セット) 3t = np.random.rand(100, 10) ※ラベル形式の教師データ 4batch_size = 100

とした場合、①のコードは、

python

1-np.sum(np.log(y[np.array[0,1,2, .. , 99]), np.random.rand(100, 10)] + 1e-7))

になるかと思います。


しかしこのコードを実行すると、

python

1>>> -np.sum(np.log(y[np.arange(100), t] + 1e-7)) 2Traceback (most recent call last): 3 File "<stdin>", line 1, in <module> 4IndexError: arrays used as indices must be of integer (or boolean) type

というエラーが発生してしまいます。


python

1IndexError: arrays used as indices must be of integer (or boolean) type

というのは、「インデックスとして使われる配列は、数値型orブーリアン型じゃないと駄目」という事かと思いますが、この記法は正しいのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

IndexError: arrays used as indices must be of integer (or boolean) type

要求されている「integer (or boolean)」は「整数(ないし真理値)」です。np.random.rand()は浮動小数点型で結果を返します。

python

1>>> np.random.rand(3, 3) 2array([[0.9179815 , 0.64911329, 0.8807456 ], 3 [0.74098608, 0.53334176, 0.17355026], 4 [0.10214618, 0.80164335, 0.06140261]])

元のコード自体は正しいもので、numpyのindexingの機能を活用しています。

参考:
Indexing — NumPy v1.15 Manual
Quickstart tutorial — NumPy v1.15 Manual #fancy-indexing-and-index-tricks

投稿2018/11/18 05:58

編集2018/11/18 06:06
hayataka2049

総合スコア30933

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

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

hiyokorunner

2018/11/19 05:31

おかげさまで、解決致しました! 「integer (or boolean)」という仕組みがあるのですね! 教師データ(今回のコードではt)について、「one-hot表現」と「ラベル表現」の双方の理解が甘く、「学習データと教師データの次元数」を揃えられていなかったようです! ありがとうございました!!
hayataka2049

2018/11/19 06:12

仕組みというか、単にデータの型ですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問