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