Pythonニューラルネットワーク-よく見られる科学計算ライブラリの誤り点とテクニック


本文の主な内容は呉恩達先生のニューラルネットワーク課程の授業後の練習から来て、どの幅のブログを結びつけて、みんなのためにもっと通俗的にはっきりとPythonを使ってニューラルネットワークを実現する中で出会う可能性のあるいくつかの問題を理解して解決することを望んでいます.
文書ディレクトリ
  • よく見られる科学計算ライブラリの誤りやすい点とテクニック
  • 行列加算
  • 行列乗算
  • 放送メカニズムの欠点
  • よくある科学計算ライブラリの誤りやすい点とテクニック
    マトリックス加算
    次の2つのランダム配列「a」と「b」を見てみましょう.
    a = np.random.randn(2, 3) # a.shape = (2, 3)
    b = np.random.randn(2, 1) # b.shape = (2, 1)
    c = a + b
    

    配列cの次元はいくらですか?
    A:Bの列の次元数は1なので、まずBの列のベクトルのために3回コピーして、AとBの行の次元数と列の次元数がすべて等しいようにして、それから各元素の加算を行って、得ます:c.shape = (2, 3)これがPython文法の放送メカニズムです.
    もう1つのケースは、A、Bマトリクス要素の乗算、すなわちA * Bであり、AとBのマトリクス間の次元数が等しい場合にのみ、A、Bが乗算され、Aマトリクスの列数がBマトリクスの列数に等しくない、またはAマトリクスの行数がBマトリクスの行数に等しくない場合には、2つのマトリクスを乗算することができず、プログラムはエラーを報告する.
    a = np.random.randn(4, 3) # a.shape = (4, 3)
    b = np.random.randn(3, 2) # b.shape = (3, 2)
    c = a * b
    # ValueError: operands could not be broadcast together with shapes (4,3) (3,2)
    

    しかし、a、b行列の行数または列数のうちの1つが等しい場合、乗算は以下のように成立することができる.
    # a,b       ,     
    a = np.random.randn(3, 3)
    b = np.random.randn(3, 1)
    c = a * b
    """
    [[ 0.30044552  0.32163572  0.83089828]
     [-0.41384331  0.140933    0.20342014]
     [ 0.15084242 -0.24968459  0.06532467]]
    """
    

    この場合,ブロードキャストメカニズムが用いられ,bは3回コピーされ,(3,3)になり,要素乗算が用いられる.c.shape = (3, 3)です
    マトリックス乗算np.dot(a,bはaおよびb上で行列乗算を実行し、a * bは要素方式の乗算を実行する.
    例えば、次の2つのランダム配列aおよびb:
    a = np.random.randn(4, 3) # a.shape = (4, 3
    b = np.random.randn(3, 2) # b.shape = (3, 2)
    c = np.dot(a, b)
    

    cの次元はいくらですか.
    答え:2つのマトリクスが乗算され、得られたマトリクスの行数は前のマトリクスの行数に等しく、列数は後のマトリクスの列数c.shape = (4, 2)に等しい.
    放送メカニズムの欠点
    numpyを使用して科学計算を行う場合、ランク1のマトリクスを生成することができます.たとえば、次のようにします.
    import numpy as np
    a = np.random.randn(5)
    a.shape
    # (5,)
    

    このとき、aマトリクスとaマトリクスの回転を乗算すると、結果は
    print(np.dot(a,a.T))
    # 3.948322708713407
    

    結果は行列ではなく数を得た.
    別の例を見てみましょう.
    A = np.random.randn(4,3)
    B = np.sum(A, axis = 0)
    B.shape
    

    いくつかの結果を推測してみましょう
    答えは:(3,)です.これは,A行列を行縦加算した後,1ランクの行列を返したためである.
    では、A.shape(4,1)であり、(4,)ではないことを確認するためには、sum関数にパラメータkeepdims = Trueを追加する必要があります.これにより、コードがより厳密になります.
    まとめ:
    ニューラルネットワークを書く場合、類似のランクが1のマトリクスは推奨されず、いくつかの誤差をもたらす可能性があります.
    しかし、aは配列に変換できます.
    a = np.random.randn(5,1)
    a.shape
    # (5,1)
    

    この時、さっきの状況は起こりません.
    テクニック:
    マトリクスaの形状が正しいか否かを自分で判断しない場合、assert(a.shape==(m,n)を用いてaの形状を断言することができ、この場合aの形状が間違っているとプログラムは異常を投げ出し、エラーを恐れない.
    未完待続~~~