神經網絡方面的研究很早就已出現,今天“神經網絡”已是一個相當大的、多學科交叉的學科領域。神經網絡中最基本的成分是神經元模型。
上圖中每個圓圈都是一個神經元,每條線表示神經元之間的連接。我們可以看到,上面的神經元被分成了多層,層與層之間的神經元有連接,而層內之間的神經元沒有連接。
感知機
感知機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()
准確值變化:
損失變化:
流程:
- 准備數據
- 全連接計算結果
- 損失優化
- 模型評估(計算准確值)