iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 8
0
AI & Machine Learning

探索 Microsoft CNTK 機器學習工具系列 第 8

前饋神經網路

Introduction

前饋神經網路(Feedforward Neural Network)是最簡單的神經網路模型,資料經由輸入層通過隱藏層(hedden layer)到輸出層單向傳播,神經元(neuron)之間沒有連接迴路存在。

feedforward neural network

Tasks

學習資源:cntk\Tutorials\CNTK_102_FeedForward.ipynb
結合多個邏輯回歸作為神經元,組成一個隱藏層,形成非線性網路模型。

CNTK 物件宣告,此步驟在所有程式中大致相同,可重複使用。

# 引用相關組件
# 相容性需求,若使用舊版pyton時,可使用新版python函式
from __future__ import print_function 

import matplotlib.pyplot as plt
%matplotlib inline

import numpy as np
import sys
import os

import cntk as C
import cntk.tests.test_utils

# 測試並設定使用 CPU 或 GPU 作為目前測試環境
cntk.tests.test_utils.set_device_from_pytest_env()

1.資料讀取(Data reading):

重設亂數種子

# 重新設定 CNTK、Numpy 的亂數種子
C.cntk_py.set_fixed_random_seed(1)
np.random.seed(0)

定義資料維度

# 資料特徵:設定為 2 個輸入變數
input_dim = 2
# 資料標籤:設定為 2 個輸出變數
num_output_classes = 2

宣告函式:產生亂數資料

# sample_size:資料樣本數
# feature_dim:輸入變數 - 資料特徵
# num_classes:輸出變數 - 資料標籤
def generate_random_data_sample(sample_size, feature_dim, num_classes):

    # 使用 Numpy 亂數產生一個指定範圍中的整數
    Y = np.random.randint(size=(sample_size, 1), low=0, high=num_classes)
    
    # 使用 Numpy 亂數產生一組資料
    X = (np.random.randn(sample_size, feature_dim)+3) * (Y+1)    
    X = X.astype(np.float32)
    
    # 將資料水平(horizontally)展開為向量
    class_ind = [Y==class_number for class_number in range(num_classes)]
    Y = np.asarray(np.hstack(class_ind), dtype=np.float32)
    
    # X:資料特徵 - 來自亂數資料集
    # Y:資料標籤 - 來自亂數資料集的向量值
    return X, Y   

產生亂數資料

# 資料樣本數
mysamplesize = 64

# features:資料特徵
# lables:資料標籤
features, labels = generate_random_data_sample(mysamplesize, input_dim, num_output_classes)

資料視覺化

# 引用繪圖組件
import matplotlib.pyplot as plt
%matplotlib inline

# 將所有資料分為兩類
colors = ['r' if l == 0 else 'b' for l in labels[:,0]]

# 設定散布圖所需參數
plt.scatter(features[:,0], features[:,1], c=colors)

# 設置 x、y 軸的標籤名稱
plt.xlabel("Scaled age (in yrs)")
plt.ylabel("Tumor size (in cm)")

plt.show()

2.資料處理(Data preprocessing):

3.建立模型(Model creation):

設定隱藏層(hedden_layers)

# 隱藏層:設定為 2 層
num_hidden_layers = 2
# 隱藏層:設定為 50 個維度
hidden_layers_dim = 50

設定輸入、輸出

# 資料特徵:設定為 2 個輸入變數
# 資料標籤:設定為 2 個輸出變數
input = C.input_variable(input_dim)
label = C.input_variable(num_output_classes)

宣告 linear_layer :
1.計算權重 weight 將輸入資料 input_var 相乘後,把所有的輸出值加起來。
2.加上偏移量 bias。

input_dim:輸入層維度
output_dim:輸出層維度,或下一個隱藏層神經元個數
weight:權重是 input_dim × output_dim 的矩陣,每一個輸入層的參數都經由權重(weight)連接到下一個圖層。
bias:偏移值,維度與輸出層維度相同

def linear_layer(input_var, output_dim):
    input_dim = input_var.shape[0]
    
    weight = C.parameter(shape=(input_dim, output_dim))
    bias = C.parameter(shape=(output_dim))

    return bias + C.times(input_var, weight)

宣告函式:定義一個隱藏層
將輸出值使用一個非線性的Sigmoid函式作為激活函數(activate function)轉換資料
轉換後的資料稱為證據(evidence),做為下一個隱藏層或輸出層的輸入值,ReLU、Sigmoid、Tanh函數都是常用的激活函數。

def dense_layer(input_var, output_dim, nonlinearity):
    l = linear_layer(input_var, output_dim)
    
    return nonlinearity(l)

宣告函式:遞迴運算,把上一個隱藏層的輸出值當作下一個隱藏層的輸出值,將前一個函式組合成多個隱藏層

def fully_connected_classifier_net(input_var, num_output_classes, hidden_layer_dim, 
                                   num_hidden_layers, nonlinearity):
    
    h = dense_layer(input_var, hidden_layer_dim, nonlinearity)
    
    for i in range(1, num_hidden_layers):
        h = dense_layer(h, hidden_layer_dim, nonlinearity)
    
    return linear_layer(h, num_output_classes)

上一篇
邏輯迴歸
下一篇
MNIST 手寫數字資料集
系列文
探索 Microsoft CNTK 機器學習工具30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言