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

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

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

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

Python

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

Q&A

解決済

1回答

2607閲覧

index 1 is out of bounds for dimension 0 with size 1を直したいです.

tazaryu

総合スコア6

PyTorch

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

Python

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

0グッド

0クリップ

投稿2020/11/18 07:38

編集2020/11/23 07:12

ニューラルネットの確立勾配を求めるために,grads{}を用いてコードを実装したですが,index 1 is out of bounds for dimension 0 with size 1というエラーが出ました.yは[1,0,0,0,0,0]のようなone-ht表現で,インデックス番号(1のある場所)がラベル(0~5)になっています.ラベル0はできているので,for文の書き方が悪いのでしょうか? grads['dl/df']が[1,*]の形を持っており,dim=0のインデックスしか使えていないそうです.dimを指定する方法とかはありますでしょうか?
どなたか,エラーの原因をご教示の程,よろしくお願い致します.

###エラー文

grads['dl/df'][y] -= 1 IndexError: index 1 is out of bounds for dimension 0 with size 1

コード

import torch from bindsnet.network import Network from bindsnet.network.nodes import Input, LIFNodes from bindsnet.network.topology import Connection from bindsnet.network.monitors import Monitor import numpy as np time = 25 # ネットワークの作成 network = Network() # 2つのニューロンの母集団を作成,1つはsourceとして作用 # もう一つはtarget ニューロンのレイヤー 5層作成 inpt = Input(n=64,shape=[1,64], sum_input=True) # n=64は入力サイズの等しくする middle = LIFNodes(n=40, trace=True, sum_input=True) center = LIFNodes(n=40, trace=True, sum_input=True) final = LIFNodes(n=40, trace=True, sum_input=True) out = LIFNodes(n=6, sum_input=True) # n=6はラベルと同じ数にする # レイヤー同士の接続 inpt_middle = Connection(source=inpt, target=middle, wmin=0, wmax=1e-1) middle_center = Connection(source=middle, target=center, wmin=0, wmax=1e-1) center_final = Connection(source=center, target=final, wmin=0, wmax=1e-1) final_out = Connection(source=final, target=out, wmin=0, wmax=1e-1) # 全てのレイヤー5層をネットワークに接続 network.add_layer(inpt, name='A') network.add_layer(middle, name='B') network.add_layer(center, name='C') network.add_layer(final, name='D') network.add_layer(out, name='E') foward_connection = Connection(source=inpt, target=middle, w=0.05 + 0.1*torch.randn(inpt.n, middle.n)) network.add_connection(connection=foward_connection, source="A", target="B") foward_connection = Connection(source=middle, target=center, w=0.05 + 0.1*torch.randn(middle.n, center.n)) network.add_connection(connection=foward_connection, source="B", target="C") foward_connection = Connection(source=center, target=final, w=0.05 + 0.1*torch.randn(center.n, final.n)) network.add_connection(connection=foward_connection, source="C", target="D") foward_connection = Connection(source=final, target=out, w=0.05 + 0.1*torch.randn(final.n, out.n)) network.add_connection(connection=foward_connection, source="D", target="E") recurrent_connection = Connection(source=out, target=out, w=0.025*(torch.eye(out.n)-1),) network.add_connection(connection=recurrent_connection, source="E", target="E") # 入力と出力層だけMonitorを作成(電圧とスパイクを記録) inpt_monitor = Monitor(obj=inpt, state_vars=("s","v"), time=500,) middle_monitor = Monitor(obj=inpt, state_vars=("s","v"), time=500,) center_monitor = Monitor(obj=inpt, state_vars=("s","v"), time=500,) final_monitor = Monitor(obj=inpt, state_vars=("s","v"), time=500,) out_monitor = Monitor(obj=inpt, state_vars=("s","v"), time=500,) # Monitorをネットワークに接続 network.add_monitor(monitor=inpt_monitor, name="A") network.add_monitor(monitor=middle_monitor, name="B") network.add_monitor(monitor=center_monitor, name="C") network.add_monitor(monitor=final_monitor, name="D") network.add_monitor(monitor=out_monitor, name="E") for l in network.layers: m = Monitor(network.layers[l], state_vars=['s'], time=time) network.add_monitor(m, name=l) # トレーニングデータをロード npzfile = np.load("C:/Users/namae/Desktop/myo-python-1.0.4/myo-armband-nn-master/data/train_set.npz") x = npzfile['x'] # データをロードndarray型 1×64の配列 y = npzfile['y'] # データをロードndarry型  1×6の配列 # tensor型に変換 x = torch.from_numpy(x).clone() # xは1×64のtensor配列 y = torch.from_numpy(y).clone() # yは1×6のtensor配列 # 保存されたトレーニングデータの開始とニューロンのごとのスパイクとラベルを保存する grads = {} lr, lr_decay = 1e-2, 0.95 criterion = torch.nn.CrossEntropyLoss() # 交差損失関数の計算 spike_ims, spike_axes, weight_im = None, None, None for i,(x,y) in enumerate(zip(x.view(-1,64), y)): # repeat関数 (要素や配列, 繰り返し回数) "E"の方は(時間数×1行列)を生成 (time=25) iはインデックス番号 inputs = {'A': x.repeat(time, 1),'E_b': torch.ones(time, 1)} network.run(inputs=inputs, time=time) # スパイクを全層からまとめる('s'はスパイク) y = torch.tensor(y).long() spikes = {l: network.monitors[l].get('s') for l in network.layers} # 全層から入力をまとめる  summed_inputs = {l: network.layers[l].summed for l in network.layers} # 出力のsoftmax関数,予測ラベルの取得 output = spikes['E'].sum(-1).float().softmax(0).view(1,-1) predicted = output.argmax(1).item() # 損失とSGDの更新 grads['dl/df'] = summed_inputs['E'].softmax(0) grads['dl/df'][y] -= 1 ☚ここです. grads['dl/dw'] = torch.ger(summed_inputs['A'], grads['dl/df']) network.connections['A','B','C','D','E'].w -= lr*grads['dl/dw'] # 減衰率 if i > 0 and i % 300 == 0: lr = lr_decay network.reset_()

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

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

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

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

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

guest

回答1

0

ベストアンサー

for文の書き方が悪いか判断するためにも、エラーが発生する行の直前に

python

1print(grads['dl/df']) 2print(y) 3print(grads['dl/df'][y])

を追加して、各変数の値を確認してはどうでしょうか?

投稿2020/11/27 03:02

jcs502ulf

総合スコア307

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

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

tazaryu

2020/12/02 05:52

ありがとうございます.おっしゃる通りでした.変数の型を確認して直すことができました.心より感謝申し上げます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問