新聞中心

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

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

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

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

        X = np.vstack(df['Image'].values) / 255. # scale pixel values to [0, 1]

        X = X.astype(np.float32)

        if not test: # only FTRAIN has any target columns

        y = df[df.columns[:-1]].values

        y = (y - 48) / 48 # scale target coordinates to [-1, 1]

        X, y = shuffle(X, y, random_state=42) # shuffle train data

        y = y.astype(np.float32)

        else:

        y = None

        return X, y

        X, y = load()

        print(X.shape == {}; X.min == {:.3f}; X.max == {:.3f}.format(

        X.shape, X.min(), X.max()))

        print(y.shape == {}; y.min == {:.3f}; y.max == {:.3f}.format(

        y.shape, y.min(), y.max()))

        你沒有必要看懂這個函數的每一個細節。 但讓我們看看上面的腳本輸出:

        $ python kfkd.py

        left_eye_center_x 7034

        left_eye_center_y 7034

        right_eye_center_x 7032

        right_eye_center_y 7032

        left_eye_inner_corner_x 2266

        left_eye_inner_corner_y 2266

        left_eye_outer_corner_x 2263

        left_eye_outer_corner_y 2263

        right_eye_inner_corner_x 2264

        right_eye_inner_corner_y 2264

        mouth_right_corner_x 2267

        mouth_right_corner_y 2267

        mouth_center_top_lip_x 2272

        mouth_center_top_lip_y 2272

        mouth_center_bottom_lip_x 7014

        mouth_center_bottom_lip_y 7014

        Image 7044

        dtype: int64

        X.shape == (2140, 9216); X.min == 0.000; X.max == 1.000

        y.shape == (2140, 30); y.min == -0.920; y.max == 0.996

        首先,它打印出了CSV文件中所有列的列表以及每個列的可用值的數量。 因此,雖然我們有一個圖像的訓練數據中的所有行,我們對于mouth_right_corner_x只有個2,267的值等等。

        load()返回一個元組(X,y),其中y是目標矩陣。 y的形狀是n×m的,其中n是具有所有m個關鍵點的數據集中的樣本數。 刪除具有缺失值的所有行是這行代碼的功能:

        df = df.dropna() # drop all rows that have missing values in them

        這個腳本輸出的y.shape == (2140, 30)告訴我們,在數據集中只有2140個圖像有著所有30個目標值。

        一開始,我們將僅訓練這2140個樣本。 這使得我們比樣本具有更多的輸入大小(9,216); 過度擬合可能成為一個問題。當然,拋棄70%的訓練數據也是一個壞主意。但是目前就這樣,我們將在后面談論。

        第一個模型:一個單隱層

        現在我們已經完成了加載數據的工作,讓我們使用Lasagne并創建一個帶有一個隱藏層的神經。 我們將從代碼開始:

        # add to kfkd.py

        from lasagne import layers

        from lasagne.updates import nesterov_momentum

        from nolearn.lasagne import NeuralNet

        net1 = NeuralNet(

        layers=[ # three layers: one hidden layer

        ('input', layers.InputLayer),

        ('hidden', layers.DenseLayer),

        ('output', layers.DenseLayer),

        ],

        # layer parameters:

        input_shape=(None, 9216), # 96x96 input pixels per batch

        hidden_num_units=100, # number of units in hidden layer

        output_nonlinearity=None, # output layer uses identity function

        output_num_units=30, # 30 target values

        # optimization method:

        update=nesterov_momentum,

        update_learning_rate=0.01,

        update_momentum=0.9,

        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)

        我們使用相當多的參數來初始化NeuralNet。讓我們看看他們。首先是三層及其參數:

        layers=[ # 三層神經:一個隱層

        ('input', layers.InputLayer),

        ('hidden', layers.DenseLayer),

        ('output', layers.DenseLayer),

        ],

        # 層的參數:

        input_shape=(None, 9216), # 每個批次96x96個輸入樣例

        hidden_num_units=100, # 隱層中的單元數

        output_nonlinearity=None, # 輸出用的激活函數

        output_num_units=30, # 30個目標值

        這里我們定義輸入層,隱藏層和輸出層。在層參數中,我們命名并指定每個層的類型及其順序。參數input_shape,hidden_??num_units,output_nonlinearity和output_num_units是特定層的參數。它們通過它們的前綴引用層,使得input_shape定義輸入層的shape參數,hidden_??num_units定義隱藏層的num_units等等。(看起來有點奇怪,我們必須指定像這樣的參數,但結果是它讓我們對于受使用scikit-learn的管道和參數搜索功能擁有更好的兼容性。)

        我們將input_shape的第一個維度設置為None。這轉換為可變批量大小。如果你知道批量大小的話,也可以設置成固定值,如果為None,則是可變值。

        我們將output_nonlinearity設置為None。因此,輸出單元的激活僅僅是隱藏層中的激活的線性組合。

        DenseLayer使用的默認非線性是rectifier,它其實就是返回max(0, x)。它是當今最受歡迎的激活功能選擇。通過不明確設置hidden_??nonlinearity,我們選擇rectifier作為我們隱藏層的激活函數。

        神經的權重用具有巧妙選擇的間隔的均勻分布來初始化。也就是說,Lasagne使用“Glorot-style”初始化來計算出這個間隔。

        還有幾個參數。 所有以update開頭的參數用來表示更新方程(或最優化方法)的參數。 更新方程將在每個批次后更新我們網絡的權重。 我們將使用涅斯捷羅夫動量梯度下降優化方法(nesterov_momentum gradient descent optimization method)來完成這項工作。Lasagne實現的其他方法有很多,如adagrad和rmsprop。我們選擇nesterov_momentum,因為它已經證明對于大量的問題很好地工作。



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

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 舒城县| 竹山县| 礼泉县| 青海省| 驻马店市| 临漳县| 界首市| 南城县| 上饶县| 柯坪县| 同仁县| 海阳市| 土默特左旗| 呼和浩特市| 获嘉县| 霍林郭勒市| 永胜县| 丹巴县| 巴林右旗| 南漳县| 临洮县| 河西区| 茂名市| 隆子县| 盖州市| 江西省| 高陵县| 白沙| 左权县| 兰溪市| 渑池县| 安阳市| 景德镇市| 郎溪县| 柘荣县| 木里| 巫山县| 阳新县| 榆树市| 会东县| 鹤岗市|