11 神經網路調優

2021-09-28 14:49:58 字數 3168 閱讀 4997

在分類與回歸問題中,預設返回的是訓練的誤差,但是誤差這個度量不夠直觀,也不方便兩個模型做比較。例如:**學生分數誤差是20分,但是**房價的誤差是200元,雖然後者比前者的誤差大,但是大家都應該知道後者**模型肯定比前者要好。為了避免這種情況出現,我們應該把誤差轉化為正確率。

import numpy as np

import tensorflow as tf

y_predict = np.array([[

1,9,

3,4,

6],[

0,2,

4,4,

8]])

y_true = np.array([[

2,3,

4,5,

9],[

1,3,

3,3,

8]])

with tf.session(

)as sess:

# axis為0代表獲取每列最大值,1代表獲取每行最大值

print

(sess.run(tf.argmax(y_predict,1)

))# [1 4]

print

(sess.run(tf.argmax(y_true,1)

))# [4 4]

# 張量(標量,向量,矩陣)的每個值進行比較,比對成功返回為true否則為false

print

(sess.run(tf.equal([1

,2,3

],[3

,2,1

])))

# [false true false]

equal_list = sess.run(tf.equal(tf.argmax(y_predict,0)

, tf.argmax(y_true,0)

))print

(equal_list)

# [ true true false true false]

# 看原始碼:將x的資料格式轉化成dtype.

# 如果是bool則轉化為0,1 反之亦然

accuracy_list = sess.run(tf.cast(equal_list, tf.float32)

)print

('命中率列表'

, accuracy_list)

# [1. 1. 0. 1. 0.]

# 求和在求平均,則可以得到正確率

accuracy = tf.reduce_mean(accuracy_list)

# 0.6

print

('求準確率'

, sess.run(accuracy)

)

# 完成圖形影象的載入 (解析度和尺寸相同)

from tensorflow.examples.tutorials.mnist import input_data

import tensorflow as tf

mnist = input_data.read_data_sets(

"../data/input_data"

,one_hot=

true

)# 訓練的時候不會一次性載入55000,因此需要採用佔位符

x = tf.placeholder(tf.float32,

[none

,784])

y_true = tf.placeholder(tf.float32,

[none,10

])# 多少個連線就會有多少個權重weight [none,784] dot [784,10] ===> [none,10]

# 變數: 深度學習過程中可變的量

weight = tf.variable(tf.random.normal(

[784,10

]),name=

"weight"

)bias = tf.variable(tf.random.normal([10

]),name=

"bias"

)y_predict = tf.matmul(x,weight)

+ bias # matmul == dot

# softmax: 就是把向量值歸一化到[0,1]之間,總和為1

y_predict = tf.nn.softmax(y_predict)

loss =

-tf.reduce_mean(y_true * tf.log(y_predict)

)# 採用梯度下降公式來減少誤差值: 學習率 0,1之間

train_op = tf.train.gradientdescentoptimizer(

0.7)

.minimize(loss)

# 獲取神經網路每次執行的正確率

result = tf.equal(tf.argmax(y_predict,axis=1)

,tf.argmax(y_true,axis=1)

)result = tf.cast(result,tf.float32)

accuracy = tf.reduce_mean(result)

# 通過會話連線graph圖

with tf.session(

)as sess:

sess.run(tf.global_variables_initializer())

for i in

range

(5000):

# 每一次獲取指定數量的樣本和樣本的目標值

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

d =sess.run(train_op,feed_dict=d)

print

(f'第次訓練的正確率為:'

)

通過上面**可以看書,無論步長是5000還是10000 我們的正確率基本上在85%~90%之間,很難在有新的提公升,在這種情況下就不是訓練次數不夠了,而是模型本身需要優化。

簡單神經網路只有輸入和輸出,沒有隱藏層,問題不能被拆分因此訓練模型粗糙

如果物體本身比較複雜,例如人臉識別,那麼很多時候我們應該把人臉進行拆分鼻子、嘴巴、耳朵… 這樣就需要構建隱藏神經網路

如果一張圖有很多的物體,那麼我們應該把每個物體單獨拿來處理,這個時候就會用到更高階的卷積神經網路

神經網路調參

神經網路的一些調參方法小結 1 網格搜尋法 網格搜尋就是將多個引數進行笛卡爾乘積後逐個試驗,很費時間。sklearn庫有gridsearchcv函式,結合了交叉驗證,我還沒在神經網路上應用過。2 逐個調參 用列舉的方法逐個引數調優,乙個引數取最佳值後固定住再進行下乙個引數調優,比網格搜尋快一些。不過...

神經網路 卷積神經網路

這篇卷積神經網路是前面介紹的多層神經網路的進一步深入,它將深度學習的思想引入到了神經網路當中,通過卷積運算來由淺入深的提取影象的不同層次的特徵,而利用神經網路的訓練過程讓整個網路自動調節卷積核的引數,從而無監督的產生了最適合的分類特徵。這個概括可能有點抽象,我盡量在下面描述細緻一些,但如果要更深入了...

神經網路 卷積神經網路

1.卷積神經網路概覽 來自吳恩達課上一張,通過對應位置相乘求和,我們從左邊矩陣得到了右邊矩陣,邊緣是白色寬條,當畫素大一些時候,邊緣就會變細。觀察卷積核,左邊一列權重高,右邊一列權重低。輸入,左邊的部分明亮,右邊的部分灰暗。這個學到的邊緣是權重大的寬條 都是30 表示是由亮向暗過渡,下面這個圖左邊暗...