【學習筆記】神經網絡基礎


神經網絡方面的研究很早就已出現,今天“神經網絡”已是一個相當大的、多學科交叉的學科領域。神經網絡中最基本的成分是神經元模型。

上圖中每個圓圈都是一個神經元,每條線表示神經元之間的連接。我們可以看到,上面的神經元被分成了多層,層與層之間的神經元有連接,而層內之間的神經元沒有連接。

感知機

感知機Rosenblatt在1957年,於Cornell航空實驗室時所發明的一種人工神經網絡。

有n個輸入數據,通過權重與各數據之間的計算和,比較激活函數結果,得出輸出。很容易解決與、或、非問題。

可以看到,一個感知器有如下組成部分:

  • 輸入權值,一個感知器可以有多個輸入x1,x2,x3...xn,每個輸入上有一個權值wi
  • 激活函數,感知器的激活函數有許多選擇,以前用的是階躍函數,,其中zz為權重數據積之和
  • 輸出,

神經網絡

定義:在機器學習和認知科學領域,人工神經網絡(artificial neural network,縮寫ANN),簡稱神經網絡(:neural network,縮寫NN)或類神經網絡,是一種模仿生物神經網絡的結構和功能的計算模型,用於對函數進行估計或近似。

神經網絡的種類:

基礎神經網絡:單層感知器,線性神經網絡,BP神經網絡,Hopfield神經網絡等
進階神經網絡:玻爾茲曼機,受限玻爾茲曼機,遞歸神經網絡等
深度神經網絡:深度置信網絡,卷積神經網絡,循環神經網絡,LSTM網絡等

神經網絡的特點

  • 輸入向量的維度和輸入神經元的個數相同
  • 每個連接都有個權值
  • 同一層神經元之間沒有連接
  • 由輸入層,隱層,輸出層組成
  • 第N層與第N-1層的所有神經元連接,也叫全連接

神經網絡的組成

  • 結構(Architecture)例如,神經網絡中的變量可以是神經元連接的權重
  • 激勵函數(Activity Rule)大部分神經網絡模型具有一個短時間尺度的動力學規則,來定義神經元如何根據其他神經元的活動來改變自己的激勵值。
  • 學習規則(Learning Rule)學習規則指定了網絡中的權重如何隨着時間推進而調整。(反向傳播算法)

淺層人工神經網絡模型

SoftMax回歸

MNIST中的每個圖像都是零到九之間的手寫數字。所以給定的圖像只能有十個可能的東西。我們希望能夠看到一個圖像,並給出它是每個數字的概率。例如,我們的模型可能會看到一個九分之一的圖片,80%的人肯定它是一個九,但是給它一個5%的幾率是八分之一(因為頂級循環),並有一點概率所有其他,因為它不是100%確定。這是一個經典的情況,其中softmax回歸是一種自然簡單的模型。如果要將概率分配給幾個不同的東西之一的對象,softmax是要做的事情,因為softmax給出了一個[0,1]之間的概率值加起來為1的列表。稍后,當我們訓練更復雜型號,最后一步將是一層softmax。

那么我們通常說的激活函數有很多,我們這個使用softmax函數.softmax模型可以用來給不同的對象分配概率。即使在之后,我們訓練更加精細的模型時,最后一步也需要用softmax來分配概率。這里的softmax可以看成是一個激勵(activation)函數,把我們定義的線性函數的輸出轉換成我們想要的格式,也就是關於10個數字類的概率分布。因此,給定一張圖片,它對於每一個數字的吻合度可以被softmax函數轉換成為一個概率值。

softmax回歸有兩個步驟:首先我們將我們的輸入的證據加在某些類中,然后將該證據轉換成概率。每個輸出的概率,對應着獨熱編碼中具體的類別。

下面是softmax的公式

在神經網絡中,整個過程如下:

也就是最后的softmax模型,用數學式子表示:

損失計算-交叉熵損失

我們前面學習過了一種計算誤差損失,預測值與標准值差的平方和。不過在這里我們不能再使用這個方式,我們的輸出值是概率並且還有標簽。那么就需要一種更好的方法形容這個分類過程的好壞。這里就要用到交叉熵損失。

確定模型損失的一個非常常見的非常好的功能稱為“交叉熵”。交叉熵來源於對信息理論中的信息壓縮代碼的思考,但是從賭博到機器學習在很多領域都是一個重要的思想。它定義為

SoftMax計算、交叉熵

tf.nn.softmax_cross_entropy_with_logits(labels=None, logits=None,name=None)

  • 計算logits和labels之間的交叉損失熵
  • labels:標簽值(真實值)
  • logits:樣本加權之后的值
  • return:返回損失值列表

准確性計算

equal_list = tf.equal(tf.argmax(y, 1), tf.argmax(y_label, 1))

accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))

Mnist數據集神經網絡案例

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data


def full_connected():

    # 准備數據
    mnist = input_data.read_data_sets("./data/mnist/", one_hot=True)

    # 建立數據的占位符
    with tf.variable_scope("data"):
        x = tf.placeholder(tf.float32, [None, 28 * 28])
        y_true = tf.placeholder(tf.float32, [None, 10])

    # 建立全連接層的神經網絡
    with tf.variable_scope("fc_model"):
        # 隨機初始化權重和偏重
        weight = tf.Variable(tf.random_normal([28 * 28, 10], mean=0.0, stddev=1.0), name="w")
        bias = tf.Variable(tf.constant(0.0, shape=[10]))
        # 預測結果
        y_predict = tf.matmul(x, weight) + bias

    # 所有樣本損失值的平均值
    with tf.variable_scope("soft_loss"):
        loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))

    # 梯度下降
    with tf.variable_scope("optimizer"):
        train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

    # 計算准確率
    with tf.variable_scope("acc"):
        equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))
        accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))

    # 收集變量
    # 單個數字值收集
    tf.summary.scalar("losses", loss)
    tf.summary.scalar("acc", accuracy)
    # 高緯度變量收集
    tf.summary.histogram("weights", weight)
    tf.summary.histogram("biases", bias)

    # 初始化變量op
    init_op = tf.global_variables_initializer()

    # 變量合並op
    merged = tf.summary.merge_all()

    with tf.Session() as sess:
        # 變量初始化
        sess.run(init_op)

        # 建立events文件
        fw = tf.summary.FileWriter("./temp/tf/summary/fc", graph=sess.graph)

        for i in range(3000):

            mnist_x, mnist_y = mnist.train.next_batch(100)

            sess.run(train_op, feed_dict={x: mnist_x, y_true: mnist_y})

            summary = sess.run(merged, feed_dict={x: mnist_x, y_true: mnist_y})
            fw.add_summary(summary, i)

            print("訓練第%d步, 准確率為%f" % (i, sess.run(accuracy, feed_dict={x: mnist_x, y_true: mnist_y})))


if __name__ == '__main__':
    full_connected()

准確值變化:

損失變化:

流程:

  1. 准備數據
  2. 全連接計算結果
  3. 損失優化
  4. 模型評估(計算准確值)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM