1. 程式人生 > 其它 >python人臉識別專案之學習筆記(四):神經網路

python人臉識別專案之學習筆記(四):神經網路

你將會學到的知識點

  • 神經網路是什麼?
  • 構建一個簡單的神經網路

1. 什麼是神經網路

單個的感知器就構成了一個簡單的模型,但在現實世界中,實際的決策模型則要
複雜得多,往往是由多個感知器組成的多層網路,如下圖所示,這也是經典的神
經網路模型,由輸入層、隱含層、輸出層構成。

人工神經網路可以對映任意複雜的非線性關係,具有很強的魯棒性、記憶能力、
自學習等能力,在分類、預測、模式識別等方面有著廣泛的應用

一個簡單的神經網路

一個例子:三好學生的應用

  • 輸入層: 描述輸入資料的形態的;我們用方塊來代表每一條輸入資料的一個數,叫作輸入節點;輸入節點一般用x來命名
  • 隱藏層:描述我們設計的神經網路模型結構中最重要的部分;隱藏層可能有多個;每一層中都會有1個或多個神經元,我們用圓圈來表示,叫作神經元節點或隱藏節點,有時也直接簡稱為節點;每一個節點都接收上一層傳來的資料並進行一定的運算後向下一層輸出資料,符合神經元的特性,神經元節點上的這些運算稱為“操作”(簡稱op)
  • 輸出層:一般是神經網路模型的最後一層,會包含1個或多個以菱形表示的輸出節點;輸出節點代表著整個神經網路計算的最後結果;

有兩位孩子的家長,知道了自己孩子的3項分數及總分,但是學校並沒有告訴家長們計算出總分的規則。家長們猜測出計算總分的方法肯定是把3項分數乘以不同的權重後相加來獲得,唯一不知道的就是這幾個權重值到底是多少。現在家長們就想用人工智慧中神經網路的方法來大致推算出這3個權重分別是多少。

程式碼實現

import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

x1 = tf.placeholder(dtype=tf.float32)
x2 = tf.placeholder(dtype=tf.float32)
x3 = tf.placeholder(dtype=tf.float32)

# 傳入針對每一組輸入資料我們期待的對應計算結果
yTrain = tf.placeholder(dtype=tf.float32)

w1 = tf.Variable(0.1, dtype=tf.float32)
w2 = tf.Variable(0.1, dtype=tf.float32) w3 = tf.Variable(0.1, dtype=tf.float32) n1 = x1*w1 n2 = x2*w2 n3 = x3*w3 y = n1 + n2 + n3 # loss loss = tf.abs(y - yTrain) # 定義了一個優化器變數optimizer # 調整神經網路可變引數的物件 # 其中的引數0.001是這個優化器的學習率(learn rate # 學習率決定了優化器每次調整引數的幅度大小,先賦一個常用的數值0.001 # 是要求優化器按照把loss最小化(minimize)的原則來調整可變引數 optimizer = tf.train.RMSPropOptimizer(0.001) train = optimizer.minimize(loss) sess = tf.Session() init = tf.global_variables_initializer() sess.run(init) for i in range(100): result = sess.run([train, x1, x2, x3, w1, w2, w3, y, yTrain, loss], feed_dict={x1: 90, x2: 80, x3: 70, yTrain: 85}) print(result) result = sess.run([train, x1, x2, x3, w1, w2, w3, y, yTrain, loss], feed_dict={x1: 90, x2: 80, x3: 70, yTrain: 96}) print(result) sess.close()

執行結果

簡化神經網路

我們將剛剛的數字變成一個變數進行輸入、
第一個學生的3項分數可以用[90, 80, 70]這樣一個數組就表示出來了(這個陣列是有順序的)
第二個學生的3項分數可以用[80, 70, 60]這樣一個數組就表示出來了(這個陣列是有順序的)

import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

x = tf.placeholder(shape=[3], dtype=tf.float32)

# 傳入針對每一組輸入資料我們期待的對應計算結果
yTrain = tf.placeholder(shape=[], dtype=tf.float32)

# tf.zeros([3])的返回值將是一個數組[0, 0, 0]
w = tf.Variable(tf.zeros([3]), dtype=tf.float32)


n = x*w

# tf.reduce_sum函式的作用是把作為它的引數的向量(以後還可能會是矩陣)中的所有維度的值相加求和,與原來y=n1+n2+n3的含義是相同的。
y = tf.reduce_sum(n)

# loss
loss = tf.abs(y - yTrain)

# 定義了一個優化器變數optimizer
# 調整神經網路可變引數的物件
# 其中的引數0.001是這個優化器的學習率(learn rate
# 學習率決定了優化器每次調整引數的幅度大小,先賦一個常用的數值0.001
# 是要求優化器按照把loss最小化(minimize)的原則來調整可變引數
optimizer = tf.train.RMSPropOptimizer(0.001)
train = optimizer.minimize(loss)


sess = tf.Session()


init = tf.global_variables_initializer()


sess.run(init)


for i in range(100):
    result = sess.run([train, x, w, y, yTrain, loss], feed_dict={x:[90, 80, 70], yTrain: 85})
    print(result)
    result = sess.run([train, x,w, y, yTrain, loss], feed_dict={x:[98, 95, 87], yTrain: 96})
    print(result)

sess.close()

執行結果