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

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

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

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

解決済

1回答

238閲覧

pytorchの内積計算の結果が異なる

taichi1602

総合スコア26

PyTorch

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2024/03/15 05:09

pytorchで2つの方向で内積を計算した結果が異なります。

一つの方法では、
5次元入力データ x と重みMとの内積計算をtorch.einsumで行おうとしています。

もう一つの方法では、
5次元入力データ x を3つ用意してと重みMとの内積計算をtorch.einsumで行おうとしています。内積の順番は同じなので結果が違うことが不思議なのですが、分かる方いらっしゃいますか?

einsum

1import numpy as np 2import torch 3 4def p(x,M1): 5 v = x.shape[0] 6 I0 = torch.tensor([1, 0], dtype=torch.float32) 7 I1 = torch.tensor([0, 1], dtype=torch.float32) 8 I = I0 if x[0] == 0 else I1 9 _M1 = torch.tensor(M1[0][:], dtype=torch.float32) 10 Z = torch.einsum("ia,i->a",_M1,I) 11 for i in range(1,v-1): 12 M = torch.tensor(M1[i][:], dtype=torch.float32) 13 I = I0 if x[i] == 0 else I1 14 Z = torch.einsum("a,aib,i->b",Z,M,I) 15 M = torch.tensor(M1[v-1][:], dtype=torch.float32) 16 I = I0 if x[v-1] == 0 else I1 17 psi = torch.einsum("a,ai,i->...",Z,M,I) 18 return psi 19 20def p_batch(x,M1): 21 v = x.shape[1] 22 I0 = torch.tensor([[1, 0]], dtype=torch.float32) 23 I1 = torch.tensor([[0, 1]], dtype=torch.float32) 24 I = torch.where((x[:, 0] == 0)[:, None], I0, I1) 25 _M1 = torch.tensor(M1[0][:], dtype=torch.float32) 26 p = torch.einsum("ia,xi->xa",_M1,I) 27 for i in range(1,v-1): 28 M = torch.tensor(M1[i][:], dtype=torch.float32) 29 I = torch.where((x[:, i-1] == 0)[:, None], I0, I1) 30 p = torch.einsum("xa,aib,xi->xb",p,M,I) 31 M = torch.tensor(M1[v-1][:], dtype=torch.float32) 32 I = torch.where((x[:, v-1] == 0)[:, None], I0, I1) 33 p = torch.einsum("xa,ai,xi->x",p,M,I) 34 return p

weight

1torch.manual_seed(100) 2M1 = torch.randn(2,4) 3M2 = torch.randn(4,2,8) 4M3 = torch.randn(8,2,8) 5M4 = torch.randn(8,2,4) 6M5 = torch.randn(4,2) 7 8M = [] 9M.append(M1) 10M.append(M2) 11M.append(M3) 12M.append(M4) 13M.append(M5)

ひとつめの方法

1

1x = torch.tensor([1,0,1,1,0]) 2p(x,M) 3#tensor(-9.3181)

複数の入力データをバッチ処理している

_x = torch.tensor([[1,0,1,1,0],[1,1,1,0,0],[0,1,1,0,0]]) p_batch(_x,M) #tensor([ 9.5319, 5.5194, 30.2192])

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

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

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

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

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

ikedas

2024/03/15 13:06

2つの結果それぞれは、各々常に同じなのでしょうか。それとも、それぞれの結果も毎回変わるのでしょうか。
taichi1602

2024/03/15 14:36

コメントありがとうございます。各々常に同じになることを想定しています。一つ目の入力を一つずつp(x,M)に入れた結果が複数入力したp_batchになるようにしたいです。
ikedas

2024/03/15 14:39

「想定」ではなく、「実際の」結果それぞれは各々常に同じでしょうか。それぞれの結果も毎回変わるのであれば質問の前提が成り立ちませんので。
taichi1602

2024/03/16 00:14

失礼しました。結果は毎回同じになります。
ikedas

2024/03/16 00:51

テンソルをもっと小さなものにしても同じことになるでしょうか。 もしもそうなら、実際のMの値が何になっているか確認して、手計算で内積の値を計算してみたらどうですか。 符号まで異なるというのは、どちらかのやりかたが間違っているのだとしか思えませんし。
bsdfan

2024/03/17 05:06

やろうとしている計算にたいして、かなり複雑なコードになっているように見えます。もっと簡単に書いたほうがいいのではないでしょうか。 たとえば I0, I1 でやっているのは行(列)の選択なので単純にMx[i]等で置きなおせると思います。
guest

回答1

0

ベストアンサー

29行目の I = torch.where((x[:, i-1]...-1 が不要です。

python

1 I = torch.where((x[:, i] == 0)[:, None], I0, I1)

投稿2024/03/19 04:15

bsdfan

総合スコア4574

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

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

taichi1602

2024/03/20 14:17

ありがとうございます。一致することを確認できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問