电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Python創(chuàng)建簡單的神經(jīng)網(wǎng)絡(luò)實(shí)例講解

瀏覽:86日期:2022-06-30 14:44:37

在過去的幾十年里,機(jī)器學(xué)習(xí)對世界產(chǎn)生了巨大的影響,而且它的普及程度似乎在不斷增長。最近,越來越多的人已經(jīng)熟悉了機(jī)器學(xué)習(xí)的子領(lǐng)域,如神經(jīng)網(wǎng)絡(luò),這是由人類大腦啟發(fā)的網(wǎng)絡(luò)。在本文中,將介紹用于一個簡單神經(jīng)網(wǎng)絡(luò)的 Python 代碼,該神經(jīng)網(wǎng)絡(luò)對于一個 1x3 向量,分類第一個元素是否為 10。

步驟1: 導(dǎo)入 NumPy、 Scikit-learn 和 Matplotlib

import numpy as npfrom sklearn.preprocessing import MinMaxScalerimport matplotlib.pyplot as plt

我們將在這個項(xiàng)目中使用上述三個庫。NumPy 將用于創(chuàng)建向量和矩陣以及數(shù)學(xué)操作。Scikit-learn 將用于縮放數(shù)據(jù),Matplotlib 將用于在神經(jīng)網(wǎng)絡(luò)訓(xùn)練期間繪圖。

步驟2: 創(chuàng)建一個訓(xùn)練和測試數(shù)據(jù)集

神經(jīng)網(wǎng)絡(luò)在大型和小型數(shù)據(jù)集的學(xué)習(xí)趨勢方面都很擅長。然而,數(shù)據(jù)科學(xué)家必須意識到過擬合的危險(xiǎn),這在使用小數(shù)據(jù)集的項(xiàng)目中更為明顯。過擬合是當(dāng)一個算法訓(xùn)練和建模過于接近一組數(shù)據(jù)點(diǎn),以至于它不能很好地推廣到新的數(shù)據(jù)點(diǎn)。

通常情況下,過擬合的機(jī)器學(xué)習(xí)模型在訓(xùn)練的數(shù)據(jù)集上有很高的準(zhǔn)確性,但是作為一個數(shù)據(jù)科學(xué)家,目標(biāo)通常是盡可能精確地預(yù)測新的數(shù)據(jù)點(diǎn)。為了確保根據(jù)預(yù)測新數(shù)據(jù)點(diǎn)的好壞來評估模型,而不是根據(jù)對當(dāng)前數(shù)據(jù)點(diǎn)的建模好壞來評估模型,通常將數(shù)據(jù)集拆分為一個訓(xùn)練集和一個測試集(有時是一個驗(yàn)證集)。

input_train = np.array([[0, 1, 0], [0, 1, 1], [0, 0, 0], [10, 0, 0], [10, 1, 1], [10, 0, 1]])output_train = np.array([[0], [0], [0], [1], [1], [1]])input_pred = np.array([1, 1, 0]) input_test = np.array([[1, 1, 1], [10, 0, 1], [0, 1, 10], [10, 1, 10], [0, 0, 0], [0, 1, 1]])output_test = np.array([[0], [1], [0], [1], [0], [0]])

在這個簡單的神經(jīng)網(wǎng)絡(luò)中,我們將1x3向量分類,10作為第一個元素。使用 NumPy 的 array 函數(shù)創(chuàng)建輸入和輸出訓(xùn)練集和測試集,并創(chuàng)建 input_pred 以測試稍后將定義的 prediction 函數(shù)。訓(xùn)練和測試數(shù)據(jù)由6個樣本組成,每個樣本具有3個特征,由于輸出已經(jīng)給出,我們理解這是監(jiān)督式學(xué)習(xí)的一個例子。

第三步: 擴(kuò)展數(shù)據(jù)集

許多機(jī)器學(xué)習(xí)模型不能理解例如單位之間的區(qū)別,自然而然地對高度的特征應(yīng)用更多的權(quán)重。這會破壞算法預(yù)測新數(shù)據(jù)點(diǎn)的能力。此外,訓(xùn)練具有高強(qiáng)度特征的機(jī)器學(xué)習(xí)模型將會比需要的慢,至少如果使用梯度下降法。這是因?yàn)楫?dāng)輸入值在大致相同的范圍內(nèi)時,梯度下降法收斂得更快。

scaler = MinMaxScaler()input_train_scaled = scaler.fit_transform(input_train)output_train_scaled = scaler.fit_transform(output_train)input_test_scaled = scaler.fit_transform(input_test)output_test_scaled = scaler.fit_transform(output_test)

在我們的訓(xùn)練和測試數(shù)據(jù)集中,這些值的范圍相對較小,因此可能沒有必要進(jìn)行特征擴(kuò)展。然而,這樣可以使得小伙伴們使用自己喜歡的數(shù)字,而不需要更改太多的代碼。由于 Scikit-learn 包及其 MinMaxScaler 類,在 Python 中實(shí)現(xiàn)特征伸縮非常容易。只需創(chuàng)建一個 MinMaxScaler 對象,并使用 fit_transform 函數(shù)將非縮放數(shù)據(jù)作為輸入,該函數(shù)將返回相同的縮放數(shù)據(jù)。Scikit-learn 包中還有其他縮放功能,我鼓勵您嘗試這些功能。

第四步: 創(chuàng)建一個神經(jīng)網(wǎng)絡(luò)類

要熟悉神經(jīng)網(wǎng)絡(luò)的所有元素,最簡單的方法之一就是創(chuàng)建一個神經(jīng)網(wǎng)絡(luò)類。這樣一個類應(yīng)該包括所有的變量和函數(shù),將是必要的神經(jīng)網(wǎng)絡(luò)工作正常。

class NeuralNetwork(): def __init__(self, ): self.inputSize = 3 self.outputSize = 1 self.hiddenSize = 3 self.W1 = np.random.rand(self.inputSize, self.hiddenSize) self.W2 = np.random.rand(self.hiddenSize, self.outputSize) self.error_list = [] self.limit = 0.5 self.true_positives = 0 self.false_positives = 0 self.true_negatives = 0 self.false_negatives = 0 def forward(self, X): self.z = np.matmul(X, self.W1) self.z2 = self.sigmoid(self.z) self.z3 = np.matmul(self.z2, self.W2) o = self.sigmoid(self.z3) return o def sigmoid(self, s): return 1 / (1 + np.exp(-s)) def sigmoidPrime(self, s): return s * (1 - s) def backward(self, X, y, o): self.o_error = y - o self.o_delta = self.o_error * self.sigmoidPrime(o) self.z2_error = np.matmul(self.o_delta, np.matrix.transpose(self.W2)) self.z2_delta = self.z2_error * self.sigmoidPrime(self.z2) self.W1 += np.matmul(np.matrix.transpose(X), self.z2_delta) self.W2 += np.matmul(np.matrix.transpose(self.z2), self.o_delta) def train(self, X, y, epochs): for epoch in range(epochs): o = self.forward(X) self.backward(X, y, o) self.error_list.append(np.abs(self.o_error).mean()) def predict(self, x_predicted): return self.forward(x_predicted).item() def view_error_development(self): plt.plot(range(len(self.error_list)), self.error_list) plt.title(’Mean Sum Squared Loss’) plt.xlabel(’Epoch’) plt.ylabel(’Loss’) def test_evaluation(self, input_test, output_test): for i, test_element in enumerate(input_test): if self.predict(test_element) > self.limit and output_test[i] == 1: self.true_positives += 1 if self.predict(test_element) < self.limit and output_test[i] == 1: self.false_negatives += 1 if self.predict(test_element) > self.limit and output_test[i] == 0: self.false_positives += 1 if self.predict(test_element) < self.limit and output_test[i] == 0: self.true_negatives += 1 print(’True positives: ’, self.true_positives, ’nTrue negatives: ’, self.true_negatives, ’nFalse positives: ’, self.false_positives, ’nFalse negatives: ’, self.false_negatives, ’nAccuracy: ’, (self.true_positives + self.true_negatives) / (self.true_positives + self.true_negatives + self.false_positives + self.false_negatives))

步驟4.1: 創(chuàng)建一個 Initialize 函數(shù)

當(dāng)我們在 Python 中創(chuàng)建一個類以便正確地初始化變量時,會調(diào)用 __init__ 函數(shù)。

Python創(chuàng)建簡單的神經(jīng)網(wǎng)絡(luò)實(shí)例講解

def __init__(self, ): self.inputSize = 3 self.outputSize = 1 self.hiddenSize = 3 self.W1 = torch.randn(self.inputSize, self.hiddenSize) self.W2 = torch.randn(self.hiddenSize, self.outputSize) self.error_list = [] self.limit = 0.5 self.true_positives = 0 self.false_positives = 0 self.true_negatives = 0 self.false_negatives = 0

Python創(chuàng)建簡單的神經(jīng)網(wǎng)絡(luò)實(shí)例講解

在這個例子中,我選擇了一個有三個輸入節(jié)點(diǎn)、三個隱藏層節(jié)點(diǎn)和一個輸出節(jié)點(diǎn)的神經(jīng)網(wǎng)絡(luò)。以上的 __init__ 函數(shù)初始化描述神經(jīng)網(wǎng)絡(luò)大小的變量。inputSize 是輸入節(jié)點(diǎn)的數(shù)目,它應(yīng)該等于輸入數(shù)據(jù)中特征的數(shù)目。outputSize 等于輸出節(jié)點(diǎn)數(shù),hiddenSize 描述隱藏層中的節(jié)點(diǎn)數(shù)。此外,我們的網(wǎng)絡(luò)中不同節(jié)點(diǎn)之間的權(quán)重將在訓(xùn)練過程中進(jìn)行調(diào)整。

除了描述神經(jīng)網(wǎng)絡(luò)的大小和權(quán)重的變量之外,我還創(chuàng)建了幾個在創(chuàng)建神經(jīng)網(wǎng)絡(luò)對象時初始化的變量,這些對象將用于評估目的。誤差列表將包含每個時期的平均絕對誤差(MAE) ,這個極限將描述一個向量應(yīng)該被分類為一個向量,元素10作為第一個元素而不是。然后,還有一些變量可以用來存儲真實(shí)陽性、假陽性、真實(shí)陰性和假陰性的數(shù)量。

步驟4.2: 創(chuàng)建一個前向傳播函數(shù)

前向傳播函數(shù)的作用是通過神經(jīng)網(wǎng)絡(luò)的不同層次進(jìn)行迭代,以預(yù)測特定 epoch 的輸出。然后,根據(jù)預(yù)測輸出和實(shí)際輸出之間的差異,在反向傳播的過程中更新權(quán)重。

def forward(self, X): self.z = np.matmul(X, self.W1) self.z2 = self.sigmoid(self.z) self.z3 = np.matmul(self.z2, self.W2) o = self.sigmoid(self.z3) return o

為了計(jì)算每一層中每個節(jié)點(diǎn)的值,前一層中節(jié)點(diǎn)的值將被乘以適當(dāng)?shù)臋?quán)重,然后應(yīng)用非線性激活函數(shù)來擴(kuò)大最終輸出函數(shù)的可能性。在這個例子中,我們選擇了 Sigmoid 作為激活函數(shù),但也有許多其他的選擇。

步驟4.3: 創(chuàng)建一個反向傳播函數(shù)

反向傳播是對神經(jīng)網(wǎng)絡(luò)中不同節(jié)點(diǎn)的權(quán)值進(jìn)行更新,從而決定其重要性的過程。

def backward(self, X, y, o): self.o_error = y - o self.o_delta = self.o_error * self.sigmoidPrime(o) self.z2_error = np.matmul(self.o_delta, np.matrix.transpose(self.W2)) self.z2_delta = self.z2_error * self.sigmoidPrime(self.z2) self.W1 += np.matmul(np.matrix.transpose(X), self.z2_delta) self.W2 += np.matmul(np.matrix.transpose(self.z2), self.o_delta)

在上面的代碼片段中,輸出層的輸出錯誤被計(jì)算為預(yù)測輸出與實(shí)際輸出之間的差值。然后,在重復(fù)整個過程直到到達(dá)輸入層之前,將這個錯誤與 Sigmoid 相乘以運(yùn)行梯度下降法。最后,更新不同層之間的權(quán)重。

步驟4.4: 創(chuàng)建一個訓(xùn)練函數(shù)

在訓(xùn)練過程中,該算法將運(yùn)行向前和向后傳遞,從而更新每個 epoch 的權(quán)重。為了得到最精確的權(quán)重值,這是必要的。

def train(self, X, y, epochs): for epoch in range(epochs): o = self.forward(X) self.backward(X, y, o) self.error_list.append(np.abs(self.o_error).mean())

除了向前和向后傳播之外,我們還將平均絕對誤差(MAE)保存到一個錯誤列表中,以便日后觀察平均絕對誤差在訓(xùn)練過程中是如何演變的。

步驟4.5: 創(chuàng)建一個預(yù)測函數(shù)

在訓(xùn)練過程中對權(quán)重進(jìn)行了微調(diào)之后,該算法就可以預(yù)測新數(shù)據(jù)點(diǎn)的輸出。預(yù)測的輸出數(shù)字有望與實(shí)際輸出數(shù)字非常接近。

def predict(self, x_predicted): return self.forward(x_predicted).item()

步驟4.6: 繪制平均絕對誤差發(fā)展圖

評價(jià)機(jī)器學(xué)習(xí)算法質(zhì)量的方法有很多。經(jīng)常使用的測量方法之一是平均絕對誤差,這個誤差應(yīng)該隨著時間的推移而減小。

def view_error_development(self): plt.plot(range(len(self.error_list)), self.error_list) plt.title(’Mean Sum Squared Loss’) plt.xlabel(’Epoch’) plt.ylabel(’Loss’)

Python創(chuàng)建簡單的神經(jīng)網(wǎng)絡(luò)實(shí)例講解

步驟4.7: 計(jì)算精度及其組成部分

真正、假正、真負(fù)和假負(fù)的數(shù)量描述了機(jī)器學(xué)習(xí)分類算法的質(zhì)量。訓(xùn)練后的神經(jīng)網(wǎng)絡(luò)權(quán)值更新,使算法能夠準(zhǔn)確地預(yù)測新的數(shù)據(jù)點(diǎn)。在二進(jìn)制分類任務(wù)中,這些新數(shù)據(jù)點(diǎn)只能是1或0。根據(jù)預(yù)測值是否高于或低于定義的限制,算法將新條目分為1或0。

def test_evaluation(self, input_test, output_test): for i, test_element in enumerate(input_test): if self.predict(test_element) > self.limit and output_test[i] == 1: self.true_positives += 1 if self.predict(test_element) < self.limit and output_test[i] == 1: self.false_negatives += 1 if self.predict(test_element) > self.limit and output_test[i] == 0: self.false_positives += 1 if self.predict(test_element) < self.limit and output_test[i] == 0: self.true_negatives += 1 print(’True positives: ’, self.true_positives, ’nTrue negatives: ’, self.true_negatives, ’nFalse positives: ’, self.false_positives, ’nFalse negatives: ’, self.false_negatives, ’nAccuracy: ’, (self.true_positives + self.true_negatives) / (self.true_positives + self.true_negatives + self.false_positives + self.false_negatives))

當(dāng)運(yùn)行 test _ evaluation 函數(shù)時,我們得到以下結(jié)果:

真正: 2

真負(fù): 4

假正: 0

假負(fù): 0

準(zhǔn)確性由以下公式給出:

Python創(chuàng)建簡單的神經(jīng)網(wǎng)絡(luò)實(shí)例講解

由此我們可以推斷,在我們的案例中,精確度是1。

第五步: 運(yùn)行一個腳本來訓(xùn)練和評估神經(jīng)網(wǎng)絡(luò)模型

NN = NeuralNetwork()NN.train(input_train_scaled, output_train_scaled, 200)NN.predict(input_pred)NN.view_error_development()NN.test_evaluation(input_test_scaled, output_test_scaled)

為了嘗試我們剛剛構(gòu)建的神經(jīng)網(wǎng)絡(luò)類,我們將首先初始化一個神經(jīng)網(wǎng)絡(luò)類型的對象。然后對訓(xùn)練數(shù)據(jù)進(jìn)行神經(jīng)網(wǎng)絡(luò)訓(xùn)練,在新訓(xùn)練的模型在測試向量上進(jìn)行測試之前,對算法的權(quán)值進(jìn)行200個 epoch 以上的“修正”。然后,在利用測試數(shù)據(jù)集對模型進(jìn)行評估之前,繪制誤差圖。

第六步: 改進(jìn)腳本并使用它

提供的代碼可以很容易地修改,以處理其他類似的情況。我們鼓勵讀者嘗試改變變量并使用自己的數(shù)據(jù)等等。改進(jìn)或變更的潛在想法包括但不限于:

泛化代碼以適用于任何輸入和輸出大小的數(shù)據(jù) 使用平均絕對誤差以外的另一個度量來衡量誤差 使用其他的縮放函數(shù)

到此這篇關(guān)于Python創(chuàng)建簡單的神經(jīng)網(wǎng)絡(luò)實(shí)例講解的文章就介紹到這了,更多相關(guān)如何在Python中創(chuàng)建一個簡單的神經(jīng)網(wǎng)絡(luò)內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 退火炉,燃气退火炉,燃气热处理炉生产厂家-丹阳市丰泰工业炉有限公司 | 除尘布袋_液体过滤袋_针刺毡滤料-杭州辉龙过滤技术有限公司 | 大型低温冷却液循环泵-低温水槽冷阱「厂家品牌」京华仪器_京华仪器 | 企小优-企业数字化转型服务商_网络推广_网络推广公司 | 流程管理|流程管理软件|企业流程管理|微宏科技-AlphaFlow_流程管理系统软件服务商 | 纸箱抗压机,拉力机,脂肪测定仪,定氮仪-山东德瑞克仪器有限公司 | elisa试剂盒-PCR试剂盒「上海谷研实业有限公司」 | 特种电缆厂家-硅橡胶耐高温电缆-耐低温补偿导线-安徽万邦特种电缆有限公司 | 运动木地板_体育木地板_篮球馆木地板_舞台木地板-实木运动地板厂家 | 冷凝锅炉_燃气锅炉_工业燃气锅炉改造厂家-北京科诺锅炉 | 液晶拼接屏厂家_拼接屏品牌_拼接屏价格_监控大屏—北京维康 | 收录网| 西安展台设计搭建_西安活动策划公司_西安会议会场布置_西安展厅设计西安旭阳展览展示 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 天津散热器_天津暖气片_天津安尼威尔散热器制造有限公司 | 高防护蠕动泵-多通道灌装系统-高防护蠕动泵-www.bjhuiyufluid.com慧宇伟业(北京)流体设备有限公司 | 菏泽商标注册_菏泽版权登记_商标申请代理_菏泽商标注册去哪里 | J.S.Bach 圣巴赫_高端背景音乐系统_官网 | 国际船舶网 - 船厂、船舶、造船、船舶设备、航运及海洋工程等相关行业综合信息平台 | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 | 不锈钢/气体/液体玻璃转子流量计(防腐,选型,规格)-常州天晟热工仪表有限公司【官网】 | POS机官网 - 拉卡拉POS机免费办理|官网在线申请入口 | 快干水泥|桥梁伸缩缝止水胶|伸缩缝装置生产厂家-广东广航交通科技有限公司 | 成都软件开发_OA|ERP|CRM|管理系统定制开发_成都码邻蜀科技 | 软启动器-上海能曼电气有限公司 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 精密模具制造,注塑加工,吹塑和吹瓶加工,EPS泡沫包装生产 - 济南兴田塑胶有限公司 | 银川美容培训-美睫美甲培训-彩妆纹绣培训-新娘化妆-学化妆-宁夏倍莱妮职业技能培训学校有限公司 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 壹作文_中小学生优秀满分作文大全 | 体坛网_体坛+_体坛周报新闻客户端 | VI设计-LOGO设计公司-品牌设计公司-包装设计公司-导视设计-杭州易象设计 | 山东led显示屏,山东led全彩显示屏,山东LED小间距屏,临沂全彩电子屏-山东亚泰视讯传媒有限公司 | 天一线缆邯郸有限公司_煤矿用电缆厂家_矿用光缆厂家_矿用控制电缆_矿用通信电缆-天一线缆邯郸有限公司 | 桂林腻子粉_内墙外墙抗裂砂浆腻子粉推荐广西鑫达涂料厂家供应 | 多功能真空滤油机_润滑油全自动滤油机_高效真空滤油机价格-重庆润华通驰 | 圆周直径尺-小孔内视镜-纤维研磨刷-东莞市高腾达精密工具 | 丹佛斯压力传感器,WISE温度传感器,WISE压力开关,丹佛斯温度开关-上海力笙工业设备有限公司 | 河南15年专业网站建设制作设计,做网站就找郑州启凡网络公司 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 小威小说网 - 新小威小说网 - 小威小说网小说搜索引擎 | 广州食堂承包_广州团餐配送_广州堂食餐饮服务公司 - 旺记餐饮 |