.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

行列の積による実装

簡単なニューラルネットワークの実装

対象

バイアスと活性化関数を省略し重みだけとする。

X行列 * W行列=Y行列

┌      ┐ ┌          ┐   ┌                               ┐
│a1  b1│ │a2  b2  c2│ = │a1a2+b1d2  a1b2+b1e2  a1c2+b1f2│
└      ┘ │          │   └                               ┘
           │d2  e2  f2│
           └          ┘
  X行列       W行列               Y行列
簡単なニューラルネットワークの実装
┌    ┐   ┌       ┐      ┌                   ┐
│a  b│   │1  3  5│   =  │1a+2b  3a+4b  5a+6b│
└    ┘   │       │      └                   ┘
           │2  4  6│
           └       ┘
  X行列      W行列                Y行列

実装

>>> x=np.array([1,2])
>>> x
array([1, 2])
>>> w=np.array([[1,3,5],[2,4,6]])
>>> w
array([[1, 3, 5],
       [2, 4, 6]])
>>> y=np.dot(x,w)
>>> y
array([ 5, 11, 17])

3層のニューラルネットワークの実装

対象

3層のニューラルネットワークの実装

実装

そのまんま実装した。

"""This is a test program."""

import numpy as np

def sigmoid(x_1):
    """sigmoid."""
    return 1 / (1 + np.exp(-x_1))

def identity_function(y_1):
    """出力層の活性化関数"""
    return y_1

# 第一層
X1 = np.array([1.0, 0.5])
W1 = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
B1 = np.array([0.1, 0.2, 0.3])

print("第一層")
A1 = np.dot(X1, W1) + B1
print("A1:" + str(A1))
Z1 = sigmoid(A1)
print("Z1:" + str(Z1))

# 第二層
X2 = Z1
W2 = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
B2 = np.array([0.1, 0.2])

print("第二層")
A2 = np.dot(X2, W2) + B2
print("A2:" + str(A2))
Z2 = sigmoid(A2)
print("Z2:" + str(Z2))

# 第三層
X3 = Z2
W3 = np.array([[0.1, 0.3], [0.2, 0.4]])
B3 = np.array([0.1, 0.2])

print("第三層")
A3 = np.dot(X3, W3) + B3
print("A3:" + str(A3))
Z3 = identity_function(A3)
print("Z3:" + str(Z3))

慣例的実装

"""This is a test program."""

import numpy as np

def sigmoid(x_1):
    """sigmoid."""
    return 1 / (1 + np.exp(-x_1))

def identity_function(y_1):
    """出力層の活性化関数"""
    return y_1

def init_network():
    """ニューラルネットワーク"""
    network = {}
    networkw = {}
    networkw[0] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
    networkw[1] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
    networkw[2] = np.array([[0.1, 0.3], [0.2, 0.4]])
    networkb = {}
    networkb[0] = np.array([0.1, 0.2, 0.3])
    networkb[1] = np.array([0.1, 0.2])
    networkb[2] = np.array([0.1, 0.2])
    network["W"] = networkw
    network["b"] = networkb
    return network

def forward(network, zzz):
    """ニューラルネットワークの実行"""
    tier = len(network["W"])

    for num in range(tier - 1):
        print("第" + str(num + 1) + "層")
        xxx = zzz
        aaa = np.dot(xxx, network["W"][num]) + network["b"][num]
        print("A" + str(num + 1) + ":" + str(aaa))
        zzz = sigmoid(aaa)
        print("Z" + str(num + 1) + ":" + str(zzz))

    print("第" + str(tier) + "層")
    xxx = zzz
    aaa = np.dot(xxx, network["W"][tier -1]) + network["b"][tier -1]
    print("A" + str(tier) + ":" + str(aaa))
    zzz = identity_function(aaa) # 出力層の活性化関数
    print("Z" + str(tier) + ":" + str(zzz))

    return zzz

print(forward(init_network(), np.array([1.0, 0.5])))

出力層の設計

活性化関数

用いることができる。

を利用する。

恒等関数

入力をそのまま返す。

恒等関数

ソフトマックス関数

対象

            exp(Ak)
Yk = ───────────
            n
           Σexp(Ai)
           i=1

シグモイド関数の項で説明した通り、

ソフトマックス関数

実装

オーバーフロー対策の実装

ソフトマックス関数は指数関数を使用するため、オーバーフローし易い。
従って、ここでは、オーバーフロー対策について考える。

          C exp(Ak)
   = ───────────
            n
         C Σexp(Ai)
           i=1
            exp(Ak + logeC)
   = ───────────
            n
           Σexp(Ai + logeC)
           i=1
            exp(Ak + C')
   = ───────────
            n
           Σexp(Ai + C')
           i=1

ニューロンの数

出力層のニューロンの数は、問題に合わせて決定する。

手書き数字画像の認識

MNISTデータセット

機械学習分野で最も有名なデータセット

概要

データの取得

推論処理

ニューロン構成

実行

以下のようにneuralnet_mnist.pyを実行すると、

>python neuralnet_mnist.py

バッチ化

ニューロン構成

実行

以下のようにneuralnet_mnist_batch.pyを実行すると、

>python neuralnet_mnist_batch.py

参考


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS