iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 30
0
Google Developers Machine Learning

Google'sMachineLearning-挑戰機器智慧極限系列 第 30

[Day30]Preceptron實作(With Python)

import numpy as np
from math import exp,pow

首先Import東西進來!

class preceptron():
    def __init__(self):                    #初始參數
        self.bias = 0                      #偏差
        self.weights = np.array([])        #權重
    # monitor
    def show_weights(self):             #外部監控參數用
        print(self.weights)
    def show_bias(self):
        print(self.bias)
   # math function 
    def Active_value(self,data):        #計算激發強度(訊息*權重的加權合+偏差)
        value = np.dot(self.weights,data)-self.bias
        return value
    def Sigmoid (self,x):               #激活函數
        result = 1/(1+exp(-x))
        return result
    def Err (self,predict,label):       #誤差
        return(label - predict)
    def MSE (self,err):                 #均方誤差(Loss Function)
        MSError = 0.5*pow(err,2)
        return MSError
    # Process control
    def initalization(self,data,label,input_dim,lr):     #讀資料,完全初始化
        self.weights = np.zeros(input_dim)
        self.bias = np.random.rand(1)
        self.data = data
        self.label = label
        self.lr = lr
        self.input_dim = input_dim
    def fit(self):                                       #開始訓練
        totalLoss=0
        for dat in range(data.shape[0]):
            Act = self.Active_value(self.data[dat])
            result = self.Sigmoid(Act)
            Err = self.Err(result,self.label[dat])
            Loss = self.MSE(Err)
            totalLoss +=Loss                            #計算Loss
            
            print("Activevalue =",Act)                  #印出來監控
            print("result =",result)
            print("Error = ",Err)
            print("Loss =",Loss)
            for weight in range(self.input_dim):
                Gradient = (result-Err)*result*(1-result)*self.data[dat][weight]   #更新權重Array
                print("Gradient =",Gradient)            #印出來監控
                self.weights[weight] = self.weights[weight]-self.lr*Gradient       #更新偏差
            self.bias =self.bias-self.lr*(Err*result*(1-result))
            print("==============================================")     #分隔線

再來創建Preceptron的Class!
現在我們要來讀取資料了,在Sklearn的套件裡,我們可以簡單地讀入Iris的資料!

from sklearn import datasets
iris = datasets.load_iris()      #讀取資料
data,label = iris["data"][:100],iris["target"][:100]    #取前100

至於為什麼要取前100前一篇已經有說過囉!
我們要來開始訓練了!
先來初始化Preceptron!

model = preceptron()

再來讀入資料,設定超參數。

model.initalization(data = data,label = label,input_dim=4 ,lr = 0.1)

讀入後我們的Model就準備好可以訓練囉!

model.fit()

當然只訓練一次Model的表現可能會不怎麼樣!
我們可以用For迴圈來達到Epoch的效果。

for i in range(100):
    model.fit()

就這樣啦!好好觀察Loss Function的數值,是不是會越來越小呢?
我們的ML鐵人30天就這樣完美的結束囉。


上一篇
[Day29]Preceptron實作前整理
系列文
Google'sMachineLearning-挑戰機器智慧極限30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言