<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 教程詳解:用卷積神經(jīng)網(wǎng)絡(luò)檢測臉部關(guān)鍵點(diǎn)(一)

          教程詳解:用卷積神經(jīng)網(wǎng)絡(luò)檢測臉部關(guān)鍵點(diǎn)(一)

          作者: 時間:2018-08-03 來源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://www.ex-cimer.com/article/201808/385311.htm

          ”’ optimization method: ””

          update=nesterov_momentum,

          update_learning_rate=0.01,

          update_momentum=0.9,

          update_learning_rate定義了梯度下降更新權(quán)重的步長。我們稍后討論學(xué)習(xí)率和momentum參數(shù),現(xiàn)在的話,這種健全的默認(rèn)值已經(jīng)足夠了。

          上圖是不同的最優(yōu)化方法的對比(animation by?Alec Radford)。星標(biāo)位置為全局最優(yōu)值。注意到不添加動量的隨機(jī)梯度下降是收斂最慢的,我們在教程中從頭到尾都是用Nesterov加速過的梯度下降。

          在我們的NeuralNet的定義中,我們沒有指定一個目標(biāo)函數(shù)來實(shí)現(xiàn)最小化。這里使用的還有一個默認(rèn)值:對于回歸問題,它是均方誤差(MSE)。

          最后一組參數(shù)聲明我們正在處理一個回歸問題(而不是分類),400是我們愿意訓(xùn)練的時期數(shù),并且我們想在訓(xùn)練期間通過設(shè)置verbose = 1:

          regression=True, # flag to indicate we're dealing with regression problem

          max_epochs=400, # we want to train this many epochs

          verbose=1,

          最后兩行加載了數(shù)據(jù),然后用數(shù)據(jù)訓(xùn)練了我們的第一個神經(jīng)。

          X, y = load()

          net1.fit(X, y)

          運(yùn)行這兩行會輸出一個表格,每次完成一代就輸出一行。每一行里,我們可以看到當(dāng)前的訓(xùn)練損失和驗(yàn)證損失(最小二乘損失),以及兩者的比率。NeuroNet將會自動把輸入數(shù)據(jù)X分成訓(xùn)練集和測試集,用20%的數(shù)據(jù)作驗(yàn)證。(比率可以通過參數(shù)eval_size=0.2調(diào)整)

          $ python kfkd.py

          ...

          InputLayer (None, 9216) produces 9216 outputs

          DenseLayer (None, 100) produces 100 outputs

          DenseLayer (None, 30) produces 30 outputs

          Epoch | Train loss | Valid loss | Train / Val

          --------|--------------|--------------|----------------

          1 | 0.105418 | 0.031085 | 3.391261

          2 | 0.020353 | 0.019294 | 1.054894

          3 | 0.016118 | 0.016918 | 0.952734

          4 | 0.014187 | 0.015550 | 0.912363

          5 | 0.013329 | 0.014791 | 0.901199

          ...

          200 | 0.003250 | 0.004150 | 0.783282

          201 | 0.003242 | 0.004141 | 0.782850

          202 | 0.003234 | 0.004133 | 0.782305

          203 | 0.003225 | 0.004126 | 0.781746

          204 | 0.003217 | 0.004118 | 0.781239

          205 | 0.003209 | 0.004110 | 0.780738

          ...

          395 | 0.002259 | 0.003269 | 0.690925

          396 | 0.002256 | 0.003264 | 0.691164

          397 | 0.002254 | 0.003264 | 0.690485

          398 | 0.002249 | 0.003259 | 0.690303

          399 | 0.002247 | 0.003260 | 0.689252

          400 | 0.002244 | 0.003255 | 0.689606

          在相對較快的上訓(xùn)練,我們能夠在1分鐘之內(nèi)完成400個epoch的訓(xùn)練。注意測試損失會一直減小。(如果你訓(xùn)練得足夠長時間,它將會有很小很小的改進(jìn))

          現(xiàn)在我們有了一個很好的結(jié)果了么?我們看到測試誤差是0.0032,和競賽基準(zhǔn)比試一下。記住我們將目標(biāo)除以了48以將其縮放到-1到1之間,也就是說,要是想計算均方誤差和排行榜的結(jié)果比較,必須把我們上面得到的0.003255還原到原來的尺度。

          >>> import numpy as np

          >>> np.sqrt(0.003255) * 48

          2.7385251505144153

          這個值應(yīng)該可以代表我們的成績了。當(dāng)然,這得假設(shè)測試集合的數(shù)據(jù)和訓(xùn)練集合的數(shù)據(jù)符合相同的分布,但事實(shí)卻并非如此。

          測試

          我們剛剛訓(xùn)練的net1對象已經(jīng)保存了訓(xùn)練時打印在控制臺桌面中的記錄,我們可以獲取這個記錄通過train_history_相關(guān)屬性,讓我們畫出這兩個曲線。

          train_loss = np.array([i[train_loss] for i in net1.train_history_])

          valid_loss = np.array([i[valid_loss] for i in net1.train_history_])

          pyplot.plot(train_loss, linewidth=3, label=train)

          pyplot.plot(valid_loss, linewidth=3, label=valid)

          pyplot.grid()

          pyplot.legend()

          pyplot.xlabel(epoch)

          pyplot.ylabel(loss)

          pyplot.ylim(1e-3, 1e-2)

          pyplot.yscale(log)

          pyplot.show()

          我們能夠看到我們的過擬合了,但是結(jié)果還不錯。事實(shí)上,我們找不到驗(yàn)證錯誤開始上升的點(diǎn),所以那種通常用來避免過擬合的early stopping方法在現(xiàn)在還沒有什么用處。注意我們沒有采用任何正則化手段,除了選擇節(jié)點(diǎn)比較少的隱層——這可以讓過擬合保持在可控范圍內(nèi)。

          那么網(wǎng)絡(luò)的預(yù)測結(jié)果是什么樣的呢?讓我們選擇一些樣例來看一看。

          def plot_sample(x, y, axis):

          img = x.reshape(96, 96)

          axis.imshow(img, cmap='gray')

          axis.scatter(y[0::2] * 48 + 48, y[1::2] * 48 + 48, marker='x', s=10)

          X, _ = load(test=True)

          y_pred = net1.predict(X)

          fig = pyplot.figure(figsize=(6, 6))

          fig.subplots_adjust(

          left=0, right=1, bottom=0, top=1, hspace=0.05, wspace=0.05)

          for i in range(16):

          ax = fig.add_subplot(4, 4, i + 1, xticks=[], yticks=[])

          plot_sample(X[i], y_pred[i], ax)

          pyplot.show()

          第一個模型預(yù)測的結(jié)果(從測試集抽出了16個樣例)

          預(yù)測結(jié)果看起來還不錯,但是有點(diǎn)時候還是有一點(diǎn)偏。讓我們試著做的更好一些。


          上一頁 1 2 3 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();