教AI做件簡單的事:從零開始構建首個神經網絡

2021-01-07 讀芯術

全文共2278字,預計學習時長6分鐘

圖源:Google

很長時間以來,我一直對構建神經網絡躍躍欲試,現在終於有機會來研究它了。我想我並沒有完全掌握神經網絡背後的數學原理,所以先教人工智慧做一些簡單的事情吧。

代碼原理

神經網絡並不是一個新概念,1943年,由沃倫·麥卡洛克(WarrenMcCulloch)和沃爾特·皮茨(Walter Pitts)首次提出。

我們將構建一個沒有隱藏層或感知器的單層神經網絡。它由一個包含訓練示例、突觸或權重以及神經元的輸入層和一個含有正確答案的輸出層組成。神經網絡圖形如下所示:

此外,需要了解一些如sigmoid和導數之類的數學概念,以清楚神經元的學習方式。神經元只需進行簡單操作,即取一個輸入值,乘以突觸權重。之後,對所有這些乘法結果求和,並使用sigmoid函數獲得0到1內的輸出值。

神經元表示:

Sigmoid函數:

問題界定

輸入層上有數字序列。我們預期的理想結果是,在數據集樣本中,如果輸入第一個數字是1,則神經網絡返回1;如果第一個數字是0,則返回0。結果在輸出層中顯示。問題集如下圖:

先決條件

開始編碼的前提——在概念上達到一定程度的理解。

NumPY安裝:

pip install numpy

安裝成功,即可進入編碼部分。首先,將NumPy導入Python文件中:

import numpy as np

訓練神經網絡

首先,創建一個sigmoid函數:

其次,定義訓練示例、輸入(4×5矩陣)和輸出:

接下來,通過生成隨機值來初始化突觸權重,並將結果排列在4×1的矩陣中:

最後,構建訓練模型。使用for循環,所有的訓練都將在此循環中進行。調用sigmoid函數,並將所有輸入的總和乘以sigmoid權重。然後採用Np.dot進行矩陣乘法。過程如下圖:

輸出結果如下圖:

現在進行神經網絡模型訓練,方法是計算sigmoid函數的輸出和實際輸出之間的差值。之後可以根據誤差的嚴重性調整權重。多次重複這個過程,比如說一萬次。定義sigmoid導數:

以下是計算和調整權重的方法:

開始學習,觀察學習時長會如何影響結果。從100次迭代開始:

開始情況比較樂觀——我們的人工智慧已經學會了識別模式,但錯誤率仍然居高不下。現在進行1000次迭代:

情況好轉,繼續進行10000次迭代:

10萬次迭代:

我們可以繼續更多次的學習迭代,但永遠無法達到100%的準確性,因為這需要進行無限次的計算。但即使在最壞的情況下,準確率也達到了99.77%,這相當不錯。

對於最終代碼,我寫得很漂亮,並通過函數將其分開。除此之外,在文本文件中,我還添加了一種非常複雜方法以存儲權重。這樣只需進行一次學習,而且需要使用AI時,只需導入權重並利用sigmoid函數即可。

import numpy as npfrom tempfile import TemporaryFiledef sigmoid(x): return1 / (1 + np.exp(-x))def sigmoid_der(x): return x * (1 - x)def training(): training_inputs = np.array([[0,0,1,0], [1,1,1,0], [1,0,1,0], [0,1,1,1], [0,1,0,1]]) trainign_outputs = np.array([[0,1,1,0,0]]).T np.random.seed(1) synaptic_weights = 2 * np.random.random((4,1)) - 1for i in range(50000): inputs = training_inputs outputs = sigmoid(np.dot(inputs, synaptic_weights)) error = trainign_outputs - outputs adjustments = error * sigmoid_der(outputs) synaptic_weights += np.dot(inputs.T, adjustments) data_file = open("data.txt", "w") for row in synaptic_weights: np.savetxt(data_file, row) data_file.close()def thinking(inputs): synaptic_weights = np.loadtxt("data.txt").reshape(4, 1) outputs = sigmoid(np.dot(inputs, synaptic_weights)) print(outputs) return outputstraining()thinking(np.array([1,1,0,1]))

圖源:Pixabay

我的第一個人工智慧已經準備就緒,隨時可以投入生產。即使它只能在極小的數據集上識別非常簡單的模式,但現在我們可以擴展它,例如,嘗試教授人工智慧識別圖片中的內容。學無止境,精進不休!

留言點讚關注

我們一起分享AI學習與發展的乾貨

如轉載,請後臺留言,遵守轉載規範

相關焦點

  • 從零開始用 Python 構建循環神經網絡
    >引言人類不會每聽到一個句子就對語言進行重新理解。看到一篇文章時,我們會根據之前對這些詞的理解來了解背景。我們將其定義為記憶力。算法可以複製這種模式嗎?神經網絡(NN)是最先被想到的技術。但令人遺憾的是傳統的神經網絡還無法做到這一點。 舉個例子,如果讓傳統的神經網絡預測一個視頻中接下來會發生什麼,它很難有精確的結果。這就是循環神經網絡(RNN)發揮作用的地方。
  • 無需深度學習框架,如何從零開始用Python構建神經網絡
    作者根據自己從零開始學習用 Python 構建神經網絡的經驗,編寫了一份攻略。內容涵蓋神經網絡定義、損失函數、前向傳播、反向傳播、梯度下降算法,對於想要了解深度學習運作原理的各位來說,內容精彩不可錯過。動機:為了深入了解深度學習,我決定從零開始構建神經網絡,並且不使用類似 Tensorflow 的深度學習庫。
  • 從Y = X到構建完整的人工神經網絡
    在本教程中,我們打算回答那些問題,我們從最簡單的人工神經網絡(ANN)做起,一直到複雜得多的模型。讓我們從構建一個沒有參數的機器學習模型開始,即Y=X。然後,我們將逐步增加一些參數到模型中,直到我們建立了一個單個神經元,這個神經元被設計成接收一個或多個輸入。接著,神經元從數學公式映射成圖形形式。
  • 從頭開始構建最先進的深度學習模型
    導讀:近日,Fast.ai 發布一門新課程——從零開始學深度學習(Deep Learning from the Foundations),該課程由 Jeremy Howard 教授,展示了如何從頭開始構建最先進的深度學習模型。
  • 用Keras從零開始6步驟訓練神經網絡
    本文將簡要介紹Keras的功能特點,使用Keras構建模型一般流程的6個步驟,以及使用Keras處理mnist分類問題的一個簡單範例。
  • 利用 PyTorch 構建神經網絡(詳細版)
    在本文章中,我們將使用 PyTorch 從頭開始實現一個簡單的神經網絡。註:閱讀本文之前,最好可以了解神經網絡的工作原理。雖然有很多庫可以用於深度學習,但我最喜歡 PyTorch。作為一名 python 程式設計師,我喜歡 PyTorch 的 python 行為是原因之一。它主要使用了 python 的風格和能力,這是很容易理解和使用。
  • 神經網絡原來這麼簡單 機器學習入門貼送給你
    什麼神經網絡、隨機森林、計算機視覺通通一網打盡。這個Facebook軟體工程師做了一個入門貼。專為基礎為零的初學者打造。有基礎的同學,也可以來看看加深一下理解。「神經網絡」一詞很流行,人們通常認為它很難,但其實要簡單得多。是不是這樣呢?先看再說。神經網絡的理解主要分為三個部分,神經元、神經網絡的構建、訓練神經網絡。神經元——神經網絡的基本單元
  • 神經網絡原來這麼簡單,機器學習入門貼送給你|乾貨
    什麼神經網絡、隨機森林、計算機視覺通通一網打盡。這個Facebook軟體工程師做了一個入門貼。專為基礎為零的初學者打造。有基礎的同學,也可以來看看加深一下理解。神經網絡的理解主要分為三個部分,神經元、神經網絡的構建、訓練神經網絡。神經元——神經網絡的基本單元這是2-input神經元的樣子。首先神經元接受輸入x1、x2,進行一些數學運算以後,然後產生一個輸出y。
  • Translated_AI 第三代神經網絡突破進展|一周AI最火學術
    每周更新,做AI科研,每周從這一篇開始就夠啦!該研究也為基礎數據處理提供了工具,未來研究人員有望利用雷達、裡程計和神經網絡數據預處理傳感器對數據進行更新。原文:https://arxiv.org/abs/1909.05840v1Google AI:脈衝神經網絡中的時間編碼在一個稱之為Ihmehimmeli的項目中,谷歌研究人員展示了人工脈衝神經網絡如何利用多種架構和學習設置來開發時間動態。
  • 深度學習之用Go語言構建一個屬於自己的神經網絡(附代碼)
    Go語言完全從頭開始構建簡單神經網絡的初學者指南介紹在本文中,我們將完全從頭開始在Golang中構建一個簡單的神經網絡(單層感知器)。我們還將在樣本數據上訓練它並進行一些預測。從頭開始創建自己的神經網絡將會更好地了解神經網絡內部發生的情況,對之後學習算法的工作更加了解。什麼是感知器?感知器由弗蘭克·羅森布拉特於1958 年發明,是最簡單的神經網絡,由n個輸入,一個神經元和一個輸出組成,其中n是數據集的特徵數量。
  • 2 個月從零開始入門 AI ,我是如何做到的?
    在Shival Gupta發表在Hacker Noon上的一篇文章中,他介紹了自己怎樣在2個月入門學習人工智慧的歷程。文章由36氪編譯。現在這個時代,每個人都很忙。人們的個人生活和職業生涯都在發生著巨大的變化。最重要的是,隨著像人工智慧這樣的技術開始變得越來越流行,你會發現在接下來的兩年裡,你所掌握的技能會變得過時。當我關閉我的創業公司Zeading時,我猛然醒悟過來。
  • 從零開始實現循環神經網絡(無框架)
    循環神經網絡從最初的RNN,慢慢發展出LSTM、GRU、BidirectionalRNN、BidirectionalLSTM等種類繁多的算法,各種變形算法可能適用於不同的場景,或者針對某一方面做了優化,如LSTM可以部分解決RNN在長序列問題上容易梯度消失的問題,GRU相對LSTM結構更加簡單訓練效率更高,但是這些算法本質上都聚焦於「循環「一詞,有研究對上千種不同結構的循環神經網絡進行了實驗,發現這些算法效果上其實差別並不像想像中那麼大
  • 理解神經網絡:從神經元到RNN、CNN、深度學習
    其中,如果x的值大於等於零,則輸出為1;如果x的值小於零,則輸出為0。我們可以看到階躍函數在零點是不可微的。目前,神經網絡採用反向傳播法和梯度下降法來計算不同層的權重。 神經網絡 到目前為止,我們已經介紹完了神經元和激活函數,它們一起是構建任意神經網絡的基本構件。現在,我們更深入的了解什麼是神經網絡,以及它們不同的種類。我強烈的建議你,如果對於神經元和激活函數有任何的疑惑,回過頭去複習一下它們。
  • 神經網絡篇——從代碼出發理解BP神經網絡
    一提到反向傳播算法,我們就不自覺的想到隨機梯度下降、sigmoid激活函數和最讓人頭大的反向傳播法則的推導,即便是把反向傳播神經網絡的原理學了一遍,也還是一頭霧水,在這裡推薦一本小編認為把BP神經網絡講的最通透的教材《Python神經網絡編程》。
  • Facebook想教AI理解數學,這件事有多難?
    因此,即使神經網絡可能不知道函數是什麼或變量是什麼意思,它們也會根據大量數據訓練發展出一種本能,即神經網絡也會開始感覺怎麼樣計算可以得到答案。為了讓神經網絡像數學家一樣處理數學符號,Charton 和 Lample 首先將數學表達式翻譯成更有用的形式。
  • 如何有效地對神經網絡參數進行初始化
    神經網絡的初始化是訓練流程的重要基礎環節,會對模型的性能、收斂性、收斂速度等產生重要的影響。本文是deeplearning.ai的一篇技術博客,文章指出,對初始化值的大小選取不當,  可能造成梯度爆炸或梯度消失等問題,並提出了針對性的解決方法。 初始化會對深度神經網絡模型的訓練時間和收斂性產生重大影響。
  • 神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨
    什麼神經網絡、隨機森林、計算機視覺通通一網打盡。這個Facebook軟體工程師做了一個入門貼。專為基礎為零的初學者打造。有基礎的同學,也可以來看看加深一下理解。神經網絡概論作者說,神經網絡並不複雜!「神經網絡」一詞很流行,人們通常認為它很難,但其實要簡單得多。是不是這樣呢?先看再說。神經網絡的理解主要分為三個部分,神經元、神經網絡的構建、訓練神經網絡。神經元——神經網絡的基本單元
  • Keras入門系列教程:兩分鐘構建你的第一個神經網絡模型
    構建一個簡單的模型順序模型在Keras中,您可以組裝網絡層來構建模型。模型通常是一個網絡層構成的圖。構建一個簡單的全連接的網絡(即多層感知器):model = keras.models.Sequential()# 添加一個含有64個神經網絡單元的全連接層到模型中,並且指定輸入數據的維度model.add(keras.layers.Dense(64, activation
  • 二次元少女生成器、會開車的神經網絡...2019年最好的17個機器學習項目
    然後用一個可以學習的神經描述編碼擴展每個點。局部幾何形狀和外觀利用神經描述編碼,通過將點雲的柵格化從新的視點通過深度渲染網絡來獲得新的場景視圖。論文地址:https://arxiv.org/abs/1906.08240
  • 全新教材,全新實戰案例:fast.ai最新2019深度學習課程出爐
    最近更新了新版本的針對開發者的深度學習實踐課程,將原來的14課時縮短到7課時,比較適合經常加班做開發的程式設計師。共有7個課時,區別於之前的14課時,但內容質量並沒有降低。每節課2個小時,加上課後複習的時間,基本上一節課能夠讓你飽飽滿滿充充實實的學夠10個小時。