Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

機械学習 (Machine Learning)

numpy.dotの使い方について(次元別の仕様を整理)

投稿日:2022年10月10日 更新日:

 

<目次>

(1) numpy.dotの使い方について(次元別の仕様を整理)
 (1-1) numpy.dotの次元別の挙動
 (1-2) numpy.dotの次元別の挙動(詳細)
 (1-3) numpy.dotの次元別の挙動確認に使用したプログラム

(1) numpy.dotの使い方について(次元別の仕様を整理)

(1-1) numpy.dotの次元別の挙動

(表)

次元
(行列1\行列2)
n=1 n=2 n>2
n=1
(例:[1])

・ベクトルの内積

・ベクトルの内積(の繰り返し)

⇒第1引数行列と第2引数列の最初の次元の内積を取る


・ベクトルの内積(の繰り返し)

⇒第1引数行列と第2引数列の最初の次元の内積を取る

n=2
(例:[[1],[1]])

・ベクトルの内積(の繰り返し)

⇒第1引数行列の最後の次元と第2引数列の内積を取る


・行列の掛け算

・ベクトルの内積(の繰り返し)

⇒「第1引数行列の最後の次元」と「第2引数列の最後から2番目の次元」の内積を取る

n>2
(例:[[[1],[1]],[[1],[1]]])

・ベクトルの内積(の繰り返し)

⇒第1引数行列の最後の次元と第2引数列の内積を取る


・ベクトルの内積(の繰り返し)

⇒「第1引数行列の最後の次元」と「第2引数列の最後から2番目の次元」の内積を取る


・ベクトルの内積(の繰り返し)

⇒「第1引数行列の最後の次元」と「第2引数列の最後から2番目の次元」の内積を取る

(1-2) numpy.dotの次元別の挙動(詳細)

●④⑦(第1引数はN>1、第2引数はN=1)
⇒「第1引数行列の『最後の次元』」(例:1×2×3なら『3』の部分)と「第2引数列」(例:3)の「内積」を取る
 
(説明)
・numpyのドキュメントには次の記載あり。
(図133①)

・例えば、以下のような行列を考えます。
(図133②)
・この時、文中の「sum product of last axis of a and b」は上図で言う、「第1引数行列の『最後の次元』(つまり1×2なら『2』の部分、1×2×3なら『3』の部分)と第2引数列の内積を取る」という意味です。
・④イメージ
(図133③)
・⑦イメージ
(図133④)
・④⑦例
(図133⑤)

●②③(第1引数はN=1、第2引数はN>1)
⇒④⑦の逆パターン。「第1引数行列」(例:2)と「第2引数列の『最初の次元』」(例:2×1なら『2』の部分)の「内積」を取る
 
・②③例
(図131)

●⑤「N=2 & N=2」
⇒行列の計算として扱える
 
●⑥⑧⑨「N≧2&N≧2」
⇒「第1引数行列の『最後の次元』」(例:1×2×3の『3』部分)と「第2引数列の『最後から2番目の次元』」(例:2×3×4の『4』部分)の「内積」を取る
 
(説明)
・numpyのドキュメントには次の記載あり
(図134①)
・・・むずい。。
・例えば、以下のような行列を考えます。
(図134②)
・先程と同様「sum product over the last axis of a and the second-to-last axis of b」は図で言う「第1引数行列の『最後の次元』(3×3×4の『4』)と第2引数列の『最後から2番目の次元』(2×4×2の『2』)の内積を取る」という意味。
 
(図134③)
・この内積計算により、第2引数列の『最後から2番目の次元』(2×4×2の『2』)は消失します。
(図134⑤)
・この内積計算を繰り返すと、次のような形になる。
(図134⑥)
・つまり、結果として次のように計算される。
(図134⑦)
(図134⑧)
・今までの説明で確認した法則に則っている事を確認
(図134⑨)
●(備考)
いずれの場合も共通して、行列(k,l)×行列(m,n)において「l列」と「m行」が一致していないと下記のエラーになる。
(例)ValueError: shapes (2,) and (2,1,2) not aligned

(1-3) numpy.dotの次元別の挙動確認に使用したプログラム

import tensorflow as tf
import numpy as np

def main():

    a_1d_2 = np.array([1,2])
    a_2d_1x2 = np.array([[1,2]])
    a_2d_2x1 = np.array([[1],[2]])
    a_3d_2x1x2 = np.array([[[1,2]],[[1,2]]])
    a_3d_2x2x1 = np.array([[[1],[2]],[[1],[2]]])

    print("①:",np.dot(a_1d_2,a_1d_2))
    print("②:",np.dot(a_1d_2,a_2d_2x1))
    print("③:",np.dot(a_1d_2,a_3d_2x2x1))
    print("④:",np.dot(a_2d_1x2,a_1d_2))
    print("⑤:",np.dot(a_2d_1x2,a_2d_2x1))
    print("⑦:",np.dot(a_3d_2x1x2,a_1d_2))
    print("⑥:",np.dot(a_2d_1x2,a_3d_2x2x1))
    print("⑧:",np.dot(a_3d_2x2x1,a_2d_1x2))
    print("⑨:",np.dot(a_3d_2x2x1,a_3d_2x1x2))

if __name__ == "__main__":
    main()

Adsense審査用広告コード


Adsense審査用広告コード


-機械学習 (Machine Learning)

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

no image

最尤推定の計算を正規分布で行った例をご紹介

  <目次> (1) 最尤推定の計算を正規分布で行った例をご紹介  (1-1) 最尤推定とは?  (1-2) 最尤推定の計算の流れ  (1-3) STEP1:分布の種類を仮定(例:正規分布、 …

no image

TensorFlowで「AttributeError: module ‘tensorflow’ has no attribute ‘xxxxxx’」が出た時の原因と対策について

  <目次> (1) TensorFlowで「AttributeError: module ‘tensorflow’ has no attribute ‘xxxxx …

確率的勾配降下法(SGD)をロジスティック回帰に適用しPythonで実装した例をご紹介

  <目次> (1) 確率的勾配降下法(SGD)をロジスティック回帰に適用しPythonで実装した例をご紹介  (1-1) (課題)「勾配降下法」が抱える課題  (1-2) (対策)確率的勾 …

no image

Tensorflowで「Could not load dynamic library ‘cudart64_110.dll’」が出る原因と対処

  <目次> (1) Tensorflowで「Could not load dynamic library ‘cudart64_110.dll’」が出る原因と対処   …

no image

Tensorflowにおけるplaceholderとは?v2.0以降での置き換え

  <目次> (1) Tensorflowにおけるplaceholderとは?v2.0以降での置き換え  (1-1) 「placeholder」とは  (1-2) サンプルプログラム  (1 …

  • English (United States)
  • 日本語
Top