close

博翔科技為專業機械設備歐規/台灣TS標章/美規及半導體設備SEMI S2輔導顧問公司

博翔對於各類機械的安全技術 安全開關 安全模組 安全繼電器模組 安全繼電器 緊急停止 安全元件 歐盟電路設計 安全迴路 安全設計

由於科技的進步,各種無線通訊設備及數位裝置技術的高度發展,電磁干擾已成為電子時代中世界各國關注的問題。

機械產品的製造為迎向消費市場需求,亦朝向高速度、高精度、自動化且大量使用數值控制而使機械產品電磁干擾問題更加複雜

而博翔科技協助您解決相關安全技術問題以專業級檢測與規畫經驗並協助各種機械廠快速獲得相關認證

邀請您一起邁向世界的安全技術頂端

請立即點擊上方圖片了解更多細節吧!

 

好文分享

 

... 神經網絡是最著名且使用最廣泛的算法之一。在監督學習中,我們標記了輸出數據,我們將預測輸出與實際標籤進行比較,然後計算誤差。在神經網絡中,我們以同樣的方式定義神經網絡體系結構,通過比較實際標籤和預測標籤來計算誤差,然後使用某種優化算法來優化該誤差。訓練神經網絡最廣泛使用的算法是反向傳播和梯度下降。但是,我們可以使用任何優化算法來訓練我們的神經網絡模型。今天我們將看看如何在Python中使用Numpy用粒子群優化來訓練神經網絡模型。 神經網絡 導入Python庫 from sklearn.datasets import load_iris from pso_numpy import * import numpy as np 導入sklearn加載Iris flower機器學習數據集,pso_numpy使用PSO算法,numpy執行神經網絡的forward pass。 加載機器學習數據集 #load iris dataset.. data = load_iris() #Store input & target in X and Y.. X = data.data Y = data.target 從sklearn加載Iris數據集,並將輸入數據分配給X,將目標標籤分配給Y。 定義架構 #define no of nodes in each layer.. INPUT_NODES = 4 HIDDEN_NODES = 20 OUTPUT_NODES = 3 在神經網絡模型中定義輸入,隱藏和輸出節點數。 One-hot編碼 def one_hot_encode(Y): """ create one-hot encoded vectors from target labels(Y). :param Y: int(N, ) :return: int(N, C) Returns an array of shape(N, C) where C is number of classes. """ num_unique = len(np.unique(np.array(Y))) zeros = np.zeros((len(Y), num_unique)) zeros[range(len(Y)), Y] = 1 return zeros 如果我們要計算分類交叉熵損失,則使用One-hot編碼。將唯一的向量分配給每個目標標籤(類)。該函數將Y作為輸入,並為每個類返回One-hot編碼向量。 ... Softmax激活 def softmax(logits): """ Apply softmax function on logits and return probabilities. :param logits: double(N, C) Logits of each instance for each class. :return: double(N, C) probability for each class of each instance. """ exps = np.exp(logits) return exps / np.sum(exps, axis=1, keepdims=True) 使用Softmax函數從logits(不應用任何激活的最後一層的輸出)計算每個類的機率。 ... 損失函數 def Negative_Likelihood(probs, Y): """ Calculates Negative Log Likelihood loss. :param probs: double(N, C) Probability of each instance for each class. :param Y: int(N, ) Integer representation of each class. :return: double Returns value of loss calculated. """ num_samples = len(probs) corect_logprobs = -np.log(probs[range(num_samples), Y]) return np.sum(corect_logprobs) / num_samples def Cross_Entropy(probs, Y): """ Calculates Categorical Cross Entropy loss. :param probs: double(N, C) Probability of each instance for each class. :param Y: int(N, C) One-hot encoded representation of classes. :return: double Returns value of loss calculated. """ num_samples = len(probs) ind_loss = np.max(-1 * Y * np.log(probs + 1e-12), axis=1) return np.sum(ind_loss) / num_samples 我們可以根據輸入使用這兩個損失函數之一。如果我們不將目標標籤編碼為one hot向量,則使用負對數似然法,如果我們對標籤進行編碼,則使用分類交叉熵。這這裡probs是計算機率,Y是目標類的實際標籤。 Forward Pass def forward_pass(X, Y, W): """ Performs forward pass during Neural Net training. :param X: double(N, F) X is input where N is number of instances and F is number of features. :param Y: int(N, ) | int(N, C) Y is target where N is number of instances and C is number of classes in case of one-hot encoded target. :param W: double(N, ) Weights where N is number of total weights(flatten). :return: double Returns loss of forward pass. """ if isinstance(W, Particle): W = W.x w1 = W[0 : INPUT_NODES * HIDDEN_NODES].reshape((INPUT_NODES, HIDDEN_NODES)) b1 = W[INPUT_NODES * HIDDEN_NODES:(INPUT_NODES * HIDDEN_NODES) + HIDDEN_NODES].reshape((HIDDEN_NODES, )) w2 = W[(INPUT_NODES * HIDDEN_NODES) + HIDDEN_NODES:(INPUT_NODES * HIDDEN_NODES) + HIDDEN_NODES + (HIDDEN_NODES * OUTPUT_NODES)].reshape((HIDDEN_NODES, OUTPUT_NODES)) b2 = W[(INPUT_NODES * HIDDEN_NODES) + HIDDEN_NODES + (HIDDEN_NODES * OUTPUT_NODES): (INPUT_NODES * HIDDEN_NODES) + HIDDEN_NODES + (HIDDEN_NODES * OUTPUT_NODES) + OUTPUT_NODES].reshape((OUTPUT_NODES, )) z1 = np.dot(X, w1) + b1 a1 = np.tanh(z1) z2 = np.dot(a1, w2) + b2 logits = z2 probs = softmax(logits) return Negative_Likelihood(probs, Y) #return Cross_Entropy(probs, Y) #used in case of one-hot vector target Y... 該函數執行神經網絡的forward pass,使用預測標籤和實際標籤計算誤差,然後將該誤差返回給PSO,PSO會優化誤差並更新權重。它需要神經網絡層中神經元之間的連接的X(輸入數據),Y(目標標籤)和W(權重)。 預測 def predict(X, W): """ Performs forward pass during Neural Net test. :param X: double(N, F) X is input where N is number of instances and F is number of features. :param W: double(N, ) Weights where N is number of total weights(flatten). :return: int(N, ) Returns predicted classes. """ w1 = W[0: INPUT_NODES * HIDDEN_NODES].reshape((INPUT_NODES, HIDDEN_NODES)) b1 = W[INPUT_NODES * HIDDEN_NODES:(INPUT_NODES * HIDDEN_NODES) + HIDDEN_NODES].reshape((HIDDEN_NODES,)) w2 = W[(INPUT_NODES * HIDDEN_NODES) + HIDDEN_NODES:(INPUT_NODES * HIDDEN_NODES) + HIDDEN_NODES + (HIDDEN_NODES * OUTPUT_NODES)].reshape((HIDDEN_NODES, OUTPUT_NODES)) b2 = W[(INPUT_NODES * HIDDEN_NODES) + HIDDEN_NODES + (HIDDEN_NODES * OUTPUT_NODES): (INPUT_NODES * HIDDEN_NODES) + HIDDEN_NODES + (HIDDEN_NODES * OUTPUT_NODES) + OUTPUT_NODES].reshape((OUTPUT_NODES,)) z1 = np.dot(X, w1) + b1 a1 = np.tanh(z1) z2 = np.dot(a1, w2) + b2 logits = z2 probs = softmax(logits) Y_pred = np.argmax(probs, axis=1) return Y_pred 需要X(輸入)和W(在PSO訓練完成後的訓練權重)。 準確性 def get_accuracy(Y, Y_pred): """ Calcualtes accuracy. :param Y: int(N, ) Correct labels. :param Y_pred: int(N, ) | double(N, C) Predicted labels of shape(N, ) or (N, C) in case of one-hot vector. :return: double Accuracy. """ return (Y == Y_pred).mean() #return (np.argmax(Y, axis=1) == Y_pred).mean() #used in case of one-hot vector and loss is Negative Likelihood. 使用實際標籤和預測標籤作為輸入來計算測試數據的準確性。它使用Y(實際標籤)和Y_pred(預測標籤),然後計算真實預測的數量,然後取其平均值。 運行 if __name__ == '__main__': no_solution = 100 no_dim = (INPUT_NODES * HIDDEN_NODES) + HIDDEN_NODES + (HIDDEN_NODES * OUTPUT_NODES) + OUTPUT_NODES w_range = (0.0, 1.0) lr_range = (0.0, 1.0) iw_range = (0.9, 0.9) # iw -> inertial weight... c = (0.5, 0.3) # c[0] -> cognitive factor, c[1] -> social factor... s = Swarm(no_solution, no_dim, w_range, lr_range, iw_range, c) #Y = one_hot_encode(Y) #Encode here... s.optimize(forward_pass, X, Y, 100, 1000) W = s.get_best_solution() Y_pred = predict(X, W) accuracy = get_accuracy(Y, Y_pred) print("Accuracy: %.3f"% accuracy) 這裡我們只定義了no_solution(PSO中的粒子數),no_dim(PSO中每個粒子的維數),w_range(權重範圍),lr_range(學習速率範圍),iw_range(慣性權重範圍)和一個元組c作為cognitive和social參數。然後初始化Swarm並使用forward_pass(orward pass函數)、X(輸入)、Y(標籤)、print_step(要查看損失的疊代次數)和疊代次數調用優化函數。優化後,調用方法get_best_solution()與Swarm對象一起獲得最佳的一對權重。然後傳遞該對權重以預測並獲得輸出,最後計算模型的準確性。 結果 ... 正如你所看到的,對於訓練集來說,結果很不錯。如果PSO的參數值被正確分配和訓練了足夠多的疊代次數,它也可以為其他應用提供良好的結果。 粒子群優化 現在,我們已經完成有關神經網絡的討論,讓我們討論粒子群優化。 粒子 import numpy as np #This is a PSO(interia weight) variation... class Particle: """ Particle class represents a solution inside a pool(Swarm). """ def __init__(self, no_dim, x_range, v_range): """ Particle class constructor :param no_dim: int No of dimensions. :param x_range: tuple(double) Min and Max value(range) of dimension. :param v_range: tuple(double) Min and Max value(range) of velocity. """ self.x = np.random.uniform(x_range[0], x_range[1], (no_dim, )) #particle position in each dimension... self.v = np.random.uniform(v_range[0], v_range[1], (no_dim, )) #particle velocity in each dimension... self.pbest = np.inf self.pbestpos = np.zeros((no_dim, )) 創建Particle類,該構造函數接受no_dim(維數)、x_range(搜索空間範圍)、v_range(每個維數的速度範圍)的輸入。 群 class Swarm: """ Swarm class represents a pool of solution(particle). """ def __init__(self, no_particle, no_dim, x_range, v_range, iw_range, c): """ Swarm class constructor. :param no_particle: int No of particles(solutions). :param no_dim: int No of dimensions. :param x_range: tuple(double) Min and Max value(range) of dimension. :param v_range: tuple(double) Min and Max value(range) of velocity. :param iw_range: tuple(double) Min and Max value(range) of interia weight. :param c: tuple(double) c[0] -> cognitive parameter, c[1] -> social parameter. """ self.p = np.array([Particle(no_dim, x_range, v_range) for i in range(no_particle)]) self.gbest = np.inf self.gbestpos = np.zeros((no_dim, )) self.x_range = x_range self.v_range = v_range self.iw_range = iw_range self.c0 = c[0] self.c1 = c[1] self.no_dim = no_dim 創建Swarm類,並將參數傳遞給其構造函數,no_particle(粒子數,其中每個粒子是一對權重的獨立解),no_dim(維數,其中維度是指神經網絡模型的單個權重或偏差) ,x_range(搜索空間範圍或以神經網絡為單位的權重範圍),v_range(每個維度的速度或每個權重參數的學習率),iw_range(慣性權重範圍)和c是cognitive和social因子對。 優化 def optimize(self, function, X, Y, print_step, iter): """ optimize is used start optimization. :param function: function Function to be optimized. :param X: input Used in forward pass. :param Y: target Used to calculate loss. :param print_step: int Print pause between two adjacent prints. :param iter: int No of iterations. """ for i in range(iter): for particle in self.p: fitness = function(X, Y, particle.x) if fitness < particle.pbest: particle.pbest = fitness particle.pbestpos = particle.x.copy() if fitness < self.gbest: self.gbest = fitness self.gbestpos = particle.x.copy() for particle in self.p: #Here iw is inertia weight... iw = np.random.uniform(self.iw_range[0], self.iw_range[1], 1)[0] particle.v = iw * particle.v + (self.c0 * np.random.uniform(0.0, 1.0, (self.no_dim, )) * (particle.pbestpos - particle.x)) + (self.c1 * np.random.uniform(0.0, 1.0, (self.no_dim, )) * (self.gbestpos - particle.x)) #particle.v = particle.v.clip(min=self.v_range[0], max=self.v_range[1]) particle.x = particle.x + particle.v #particle.x = particle.x.clip(min=self.x_range[0], max=self.x_range[1]) if i % print_step == 0: print('iteration#: ', i+1, ' loss: ', fitness) print("global best loss: ", self.gbest) 該optimize函數接受函數(由forward pass計算損失),X(輸入),ÿ(標籤),print_step(print step to log loss),ITER(疊代數或訓練模型的epochs數)。在每個epoch,它將通過X、W和Y來進行函數運算並計算更新粒子的損失。 最優解 def get_best_solution(self): ''' :return: array of parameters/weights. ''' return self.gbestpos 通過對函數進行優化,得到最優解。

 

TTT77941YYDDEE156365GG

 

 

文章來源取自於:

 

 

 

每日頭條 https://kknews.cc/code/r64vbyn.html

 

 

如有侵權,請來信告知,我們會立刻下架。

 

 

DMCA:dmca(at)kubonews.com

 

 

聯絡我們:contact(at)kubonews.com

 


台中限位開關台中靜止狀態安全繼電器台中淨水設備安全迴路設計台南喇叭/藍牙喇叭安全迴路設計台中HS7A-DMP型非接觸式安全開關
桃園安全雷射掃描器設計與電路設計 台北HS5系列用滑插式促動器 優質的接點安全可靠台南安全模組設計與電路設計 新竹HS5系列用插頭式促動器 警告標籤貼紙,警告標示貼紙製作批發與設計台南電玩遊戲符合歐盟歐規電路設計 台北瓦斯爐符合歐盟歐規電路設計 使用個別開口來檢查電壓桃園大蘑菇頭型緊急停止開關 台北吹風機/造型美髮安全迴路設計 輔導安全迴路設計的符合歐規電路的CE認證公司

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 開心一下 的頭像
    開心一下

    開心一下的部落格

    開心一下 發表在 痞客邦 留言(0) 人氣()