日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

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

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

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

          本文引用地址:http://yuyingmama.com.cn/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()))

          你沒(méi)有必要看懂這個(gè)函數(shù)的每一個(gè)細(xì)節(jié)。 但讓我們看看上面的腳本輸出:

          $ 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文件中所有列的列表以及每個(gè)列的可用值的數(shù)量。 因此,雖然我們有一個(gè)圖像的訓(xùn)練數(shù)據(jù)中的所有行,我們對(duì)于mouth_right_corner_x只有個(gè)2,267的值等等。

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

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

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

          一開(kāi)始,我們將僅訓(xùn)練這2140個(gè)樣本。 這使得我們比樣本具有更多的輸入大小(9,216); 過(guò)度擬合可能成為一個(gè)問(wèn)題。當(dāng)然,拋棄70%的訓(xùn)練數(shù)據(jù)也是一個(gè)壞主意。但是目前就這樣,我們將在后面談?wù)摗?/p>

          第一個(gè)模型:一個(gè)單隱層

          現(xiàn)在我們已經(jīng)完成了加載數(shù)據(jù)的工作,讓我們使用Lasagne并創(chuàng)建一個(gè)帶有一個(gè)隱藏層的神經(jīng)。 我們將從代碼開(kāi)始:

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

          我們使用相當(dāng)多的參數(shù)來(lái)初始化NeuralNet。讓我們看看他們。首先是三層及其參數(shù):

          layers=[ # 三層神經(jīng):一個(gè)隱層

          ('input', layers.InputLayer),

          ('hidden', layers.DenseLayer),

          ('output', layers.DenseLayer),

          ],

          # 層的參數(shù):

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

          hidden_num_units=100, # 隱層中的單元數(shù)

          output_nonlinearity=None, # 輸出用的激活函數(shù)

          output_num_units=30, # 30個(gè)目標(biāo)值

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

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

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

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

          神經(jīng)的權(quán)重用具有巧妙選擇的間隔的均勻分布來(lái)初始化。也就是說(shuō),Lasagne使用“Glorot-style”初始化來(lái)計(jì)算出這個(gè)間隔。

          還有幾個(gè)參數(shù)。 所有以u(píng)pdate開(kāi)頭的參數(shù)用來(lái)表示更新方程(或最優(yōu)化方法)的參數(shù)。 更新方程將在每個(gè)批次后更新我們網(wǎng)絡(luò)的權(quán)重。 我們將使用涅斯捷羅夫動(dòng)量梯度下降優(yōu)化方法(nesterov_momentum gradient descent optimization method)來(lái)完成這項(xiàng)工作。Lasagne實(shí)現(xiàn)的其他方法有很多,如adagrad和rmsprop。我們選擇nesterov_momentum,因?yàn)樗呀?jīng)證明對(duì)于大量的問(wèn)題很好地工作。



          評(píng)論


          相關(guān)推薦

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

          關(guān)閉