Python勉強読書ノート_第二章:テンソル計算のいくつかの総括について


「Python深さ学習」という本の第2章を読んでテンソル演算を理解したので、記録をまとめてみました.
エレメント単位の演算
relu演算と加算演算はいずれも要素単位の演算であり,要素単位とはテンソルの各要素を逐一演算することを指す.
ここで、relu(X)はmax(X,0)である
#    relu  
def naive_relu(x):
    assert len(x.shape) == 2   # x    Numpy 2D  
    x = x.copy()
    for i in range(x.shape[0]):   #         
        for j in range(x.shape[1]):
            x[i, j] = max(x[i, j], 0)
    return x
#        
def naive_add(x, y):
    assert len(x.shape) == 2    # x,y Numpy 2D  
    assert x.shape == y.shape
    
    x = x.copy()
    for i in range(x.shape[0]):
        for j in range(x.shape[1]):
            x[i, j] += y[i, j]
    return x

行列とベクトルが加算されると、ベクトルはブロードキャストされ、ベクトルと行列の各行が加算されます.
#        
def naive_add_matrix_and_vector(x, y):
    assert len(x.shape) == 2    # x   Numpy 2D  
    assert len(y.shape) == 1    # y   Numpy   
    assert x.shape[1] == y.shape[0]
    
    x = x.copy()
    for i in range(x.shape[0]):
        for j in range(x.shape[1]):
            x[i, j] += y[j]
    return x
x = np.array([[1,2,3],
     [4,5,6]])
y = np.array([1,2,3])
z = naive_add_matrix_and_vector(x, y)
z

次の例では、要素毎のmaxinum演算を、2つの形状の異なるテンソルにブロードキャストを用いて適用する.
import numpy as np

x = np.random.random((2,1))
y = np.random.random((1))
z = np.maximum(x, y)
print(x)
print(y)
print(z)