新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 教程詳解:用卷積神經網絡檢測臉部關鍵點(一)

        教程詳解:用卷積神經網絡檢測臉部關鍵點(一)

        作者: 時間:2018-08-03 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201808/385311.htm

        ”’ optimization method: ””

        update=nesterov_momentum,

        update_learning_rate=0.01,

        update_momentum=0.9,

        update_learning_rate定義了梯度下降更新權重的步長。我們稍后討論學習率和momentum參數,現在的話,這種健全的默認值已經足夠了。

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

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

        最后一組參數聲明我們正在處理一個回歸問題(而不是分類),400是我們愿意訓練的時期數,并且我們想在訓練期間通過設置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,

        最后兩行加載了數據,然后用數據訓練了我們的第一個神經

        X, y = load()

        net1.fit(X, y)

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

        $ 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

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

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

        >>> import numpy as np

        >>> np.sqrt(0.003255) * 48

        2.7385251505144153

        這個值應該可以代表我們的成績了。當然,這得假設測試集合的數據和訓練集合的數據符合相同的分布,但事實卻并非如此。

        測試

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

        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()

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

        那么網絡的預測結果是什么樣的呢?讓我們選擇一些樣例來看一看。

        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()

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

        預測結果看起來還不錯,但是有點時候還是有一點偏。讓我們試著做的更好一些。


        上一頁 1 2 3 下一頁

        關鍵詞: 卷積神經 網絡 GPU CPU

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 楚雄市| 石台县| 彩票| 宣汉县| 达州市| 泸州市| 同心县| 澄城县| 西充县| 江津市| 余姚市| 哈密市| 来凤县| 瓦房店市| 巢湖市| 库尔勒市| 咸丰县| 大荔县| 丰县| 保康县| 喀什市| 阳高县| 合山市| 察隅县| 海盐县| 当涂县| 南召县| 博兴县| 蒙自县| 萨迦县| 林周县| 巫溪县| 麻栗坡县| 巧家县| 望谟县| 沅陵县| 武宁县| 科技| 高尔夫| 咸阳市| 南平市|