マトリックス&パイソン伝搬行列操作機構

 

Pythonのマトリックス伝播機構(放送)

ニューラルネットワークの最近の研究。私たちはしばしば、学習の深さに行列(マトリックス)の様々な動作しなければならないことを知っています。
我々は配列(リスト)を操作するとき、しばしばforループ(forループ)で配列の各要素上で動作するために使用されることを想起されたいです。例えば:

my_list = [1,2,3,4]
new_list = []
for each in my_list:
    new_list.append(each*2)
print(new_list)  
# 输出 [2,3,4,5]

それが行列の場合:

my_matrix = [[1,2,3,4],
             [5,6,7,8]]
new_matrix = [[],[]]
for i in range(2):
    for j in range(4):
        new_matrix[i].append(my_matrix[i][j]*2)
print(new_matrix)
# 输出 [[2, 4, 6, 8], [10, 12, 14, 16]]

実際には、上記のアプローチは非常に非効率的です!大量のデータは、特にループのために使用私たちはしばしば巨大な対処行列の深さの調査は、行列を実行する場合は、少量のデータは明白ではない、あなたは数時間または数日であるかもしれない場合。

Pythonは、この論文は、機構が広がっている「Pythonの放送」を紹介したいと思いでこの点を、考えます。
まず、パイソン定義される行列、加工行列を言うために、我々は一般的にnumpyのライブラリを使用します。

Pythonの伝播メカニズムが何であるかを以下に示します:

import numpy as np

# 先定义一个3×3矩阵 A:
A = np.array( [[1,2,3], [4,5,6], [7,8,9]]) print("A:\n",A) print("\nA*2:\n",A*2) # 直接用A乘以2 print("\nA+10:\n",A+10) # 直接用A加上10 

結果:

A:
 [[1 2 3] [4 5 6] [7 8 9]] A*2: [[ 2 4 6] [ 8 10 12] [14 16 18]] A+10: [[11 12 13] [14 15 16] [17 18 19]] 

次に、(+)行列×行列を見て:

#定义一个3×1矩阵(此时也可叫向量了)
B = np.array([[10], [100], [1000]]) print("\nB:\n",B) print("\nA+B:\n",A+B) print("\nA*B:\n",A*B) 

結果:

B:
 [[  10] [ 100] [1000]] A+B: [[ 11 12 13] [ 104 105 106] [1007 1008 1009]] A*B: [[ 10 20 30] [ 400 500 600] [7000 8000 9000]] 

AとBの形状は同じではないが、見られる、3×3であり、3×1であり、私たちは直接Pythonの他に、乗算、減算位相を分割することができることができます。

多分これを参照してください、我々はすべての放送の気持ちを持っています。
表情で模式的に図:

 
概略的な伝播メカニズム


いわゆる「スプレッド」は、ベクターまたは「コピー」の数であるので、行列の各要素に作用します。

 

このメカニズムでは、それはベクトルや行列演算を実行し、それはあまりにも便利です!
理解通信機構は、便利な操作の任意マトリックス品種であってもよいです。

内蔵の行列演算のための機能のnumpyの使用:

numpyのは)などnp.logなどの数学関数、(多くのを建て、np.abs()、 np.maximum() など数百人に。マトリックスへの直接投げる、あなたは新しい行列を計算することができます!
例:

print(np.log(A))

新しいマトリクス出力要求ログの各要素の結果の行列:

array([[0.        , 0.69314718, 1.09861229], [1.38629436, 1.60943791, 1.79175947], [1.94591015, 2.07944154, 2.19722458]]) 

 

 

ReLU活性化機能を学習する別の例示的な一般的な深さは、(0、x)はyが最大=です

 
ReLU機能

また、直接操作行列になります

X = np.array([[1,-2,3,-4], [-9,4,5,6]]) Y = np.maximum(0,X) print(Y) 

取得:

[[1 0 3 0] [0 4 5 6]] 

:もっとnumpyの数学関数は、ドキュメントに記載されています
https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.math.html

行列を処理するために独自の関数を定義します。

実際には、これは私が書いたこの記事の目的です。そんなにフロントプル、ちょうど伏線ことにする(/ω\

昨日、私は私が簡単に知ることが、ReLU導出関数に何をしたいの問題に遭遇し、yはMAX(0、Xを= ) 関数の誘導体である:
Y-'the X-IF = 0 <0
」のy = IF X-1> 0
が、このY「(x)が定義されていないnumpyの、自分自身を構築する必要があります。
すなわち、IはX 0が0となる行列の要素よりも小さくする必要があり、素子1は0よりも大きくなります。
そして、出てStackOverflowの上で解決策を見ていない長い時間に従事する:

def relu_derivative(x): x[x<0] = 0 x[x>0] = 1 return x X = np.array([[1,-2,3,-4], [-9,4,5,6]]) print(relu_derivative(X)) 

出力:

[[1 0 1 0] [0 1 1 1]] 

とても簡単かもしれ出てきました!サンミ゚Д゚(゚Д゚#)

この関数は、x [X> 0]アップがどこにあるか理解するために最も困難をrelu_derivative。
私はそれを試してみましたので:

X = np.array([[1,-2,3,-4], [-9,4,5,6]]) print(X[X>0]) print(X[X<0]) 

出力:

[1 3 4 5 6] [-2 -4 -9] 

これは、直接Xの行列要素に満たす条件は取り出すこと!元のpythonだけでなく、この演算行列!

 


私は長い時間のためにショックを受けた-
それは、Xを理解することができる[X> 0]が選択された要素は、すべての直接割り当ての条件を満たすように、「セレクタ」に相当します。
このように、我々は我々が必要とするさまざまな機能をカスタマイズして、全体の行列を更新することができます!

 

要約で

図から分かるように、Pythonとnumpyの行列演算は、単純に、素晴らしい便利で手頃な価格です。実際に、私は上記の点を書くことを忘れて、コンピュータの行列演算の効率がforループ動作よりもはるかに高いされ、
レースを実行するために使用することができます信じていません。

# vetorization vs for loop
# define two arrays a, b:
a = np.random.rand(1000000) b = np.random.rand(1000000) # for loop version: t1 = time.time() c = 0 for i in range(1000000): c += a[i]*b[i] t2 = time.time() print(c) print("for loop version:"+str(1000*(t2-t1))+"ms") time1 = 1000*(t2-t1) # vectorization version: t1 = time.time() c = np.dot(a,b) t2 = time.time() print(c) print("vectorization version:"+str(1000*(t2-t1))+"ms") time2 = 1000*(t2-t1) print("vectorization is faster than for loop by "+str(time1/time2)+" times!") 

結果:

249765.8415288075
for loop version:627.4442672729492ms
249765.84152880745
vectorization version:1.5032291412353516ms
vectorization is faster than for loop by 417.39762093576525 times!

可见,用for方法和向量化方法,计算结果是一样,但是后者比前者快了400多倍!
因此,在计算量很大的时候,我们要尽可能想办法对数据进行Vectorizing,即“向量化”,以便让计算机进行矩阵运算。

原文 https://www.jianshu.com/p/e26f381f82ad

おすすめ

転載: www.cnblogs.com/php-linux/p/11949961.html