成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

CNN卷積神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)-人臉性別識(shí)別模型-可視化各層卷積特征

BWrong / 3243人閱讀

摘要:為了讓卷積核覆蓋到所有的像素,可以對(duì)邊緣位置進(jìn)行像素填充,然后在進(jìn)行卷積。如果步長(zhǎng)很大,超過了卷積核長(zhǎng)度,那么,得到的特征圖也會(huì)小于原來(lái)的圖像。

本文主要是實(shí)現(xiàn)了根據(jù)人臉識(shí)別性別的卷積神經(jīng)網(wǎng)絡(luò),并對(duì)卷積過程中的提取特征進(jìn)行了可視化.

Github地址:https://github.com/chenlinzho...

卷積神經(jīng)網(wǎng)絡(luò)

卷積神經(jīng)網(wǎng)絡(luò)最早是為了解決圖像識(shí)別的問題,現(xiàn)在也用在時(shí)間序列數(shù)據(jù)和文本數(shù)據(jù)處理當(dāng)中,卷積神經(jīng)網(wǎng)絡(luò)對(duì)于數(shù)據(jù)特征的提取不用額外進(jìn)行,在對(duì)網(wǎng)絡(luò)的訓(xùn)練的過程當(dāng)中,網(wǎng)絡(luò)會(huì)自動(dòng)提取主要的特征.

卷積神經(jīng)網(wǎng)絡(luò)直接用原始圖像的全部像素作為輸入,但是內(nèi)部為非全連接結(jié)構(gòu).因?yàn)閳D像數(shù)據(jù)在空間上是有組織結(jié)構(gòu)的,每一個(gè)像素在空間上和周圍的像素是有關(guān)系的,和相距很遠(yuǎn)的像素基本上是沒什么聯(lián)系的,每個(gè)神經(jīng)元只需要接受局部的像素作為輸入,再將局部信息匯總就能得到全局信息. 權(quán)值共享和池化兩個(gè)操作使網(wǎng)絡(luò)模型的參數(shù)大幅的減少,提高了模型的訓(xùn)練效率.

卷積神經(jīng)網(wǎng)絡(luò)主要特點(diǎn)

權(quán)值共享: 在卷積層中可以有多個(gè)卷積核,每個(gè)卷積核與原始圖像進(jìn)行卷積運(yùn)算后會(huì)映射出一個(gè)新的2D圖像,新圖像的每個(gè)像素都來(lái)自同一個(gè)卷積核.這就是權(quán)值共享.

池化: 降采樣,對(duì)卷積(濾波)后,經(jīng)過激活函數(shù)處理后的圖像,保留像素塊中灰度值最高的像素點(diǎn)(保留最主要的特征),比如進(jìn)行 2X2的最大池化,把一個(gè)2x2的像素塊降為1x1的像素塊.

卷積網(wǎng)絡(luò)的訓(xùn)練數(shù)據(jù)(112*92*3圖形)

從data目錄讀取數(shù)據(jù),famale存放女性圖片,male存放男性圖片

def read_img(list,flag=0):
    for i in range(len(list)-1):
         if os.path.isfile(list[i]):
             images.append(cv2.imread(list[i]).flatten())
             labels.append(flag)

read_img(get_img_list("male"),[0,1])
read_img(get_img_list("female"),[1,0])

images = np.array(images)
labels = np.array(labels)

重新打亂

permutation = np.random.permutation(labels.shape[0])
all_images = images[permutation,:]
all_labels = labels[permutation,:]

訓(xùn)練集與測(cè)試集比例 8:2

train_total = all_images.shape[0]
train_nums= int(all_images.shape[0]*0.8)
test_nums = all_images.shape[0]-train_nums

#訓(xùn)練集
images = all_images[0:train_nums,:]
labels = all_labels[0:train_nums,:]

#測(cè)試集
test_images = all_images[train_nums:train_total,:]
test_labels = all_labels[train_nums:train_total,:]
訓(xùn)練參數(shù)
train_epochs=3000                # 訓(xùn)練輪數(shù)
batch_size= random.randint(6,18) # 每次訓(xùn)練數(shù)據(jù),隨機(jī)
drop_prob = 0.4                  # 正則化,丟棄比例
learning_rate=0.00001            # 學(xué)習(xí)效率
網(wǎng)絡(luò)結(jié)構(gòu)

輸入層為輸入的灰度圖像尺寸:  -1 x 112 x 92 x 3 
第一個(gè)卷積層,卷積核的大小,深度和數(shù)量 (3, 3, 3, 16)
池化后的特征張量尺寸:       -1 x 56 x 46 x 16
第二個(gè)卷積層,卷積核的大小,深度和數(shù)量 (3, 3, 16, 32)
池化后的特征張量尺寸:       -1 x 28 x 23 x 32
第三個(gè)卷積層,卷積核的大小,深度和數(shù)量 (3, 3, 32, 64)
池化后的特征張量尺寸:       -1 x 14 x 12 x 64
全連接第一層權(quán)重矩陣:         10752 x 512
全連接第二層權(quán)重矩陣:         512 x 128
輸出層與全連接隱藏層之間:     128 x 2
輔助函數(shù)
# 權(quán)重初始化(卷積核初始化)
# tf.truncated_normal()不同于tf.random_normal(),返回的值中不會(huì)偏離均值兩倍的標(biāo)準(zhǔn)差
# 參數(shù)shpae為一個(gè)列表對(duì)象,例如[5, 5, 1, 32]對(duì)應(yīng)
# 5,5 表示卷積核的大小, 1代表通道channel,對(duì)彩色圖片做卷積是3,單色灰度為1
# 最后一個(gè)數(shù)字32,卷積核的個(gè)數(shù),(也就是卷基層提取的特征數(shù)量)

def weight_init(shape):
    weight = tf.truncated_normal(shape,stddev=0.1,dtype=tf.float32)
    return tf.Variable(weight)

#偏執(zhí)初始化
def bias_init(shape):
    bias = tf.random_normal(shape,dtype=tf.float32)
    return tf.Variable(bias)

#全連接矩陣初始化
def fch_init(layer1,layer2,const=1):
    min = -const * (6.0 / (layer1 + layer2));
    max = -min;
    weight = tf.random_uniform([layer1, layer2], minval=min, maxval=max, dtype=tf.float32)
    return tf.Variable(weight)
    
# 源碼的位置在tensorflow/python/ops下nn_impl.py和nn_ops.py
# 這個(gè)函數(shù)接收兩個(gè)參數(shù),x 是圖像的像素, w 是卷積核
# x 張量的維度[batch, height, width, channels]
# w 卷積核的維度[height, width, channels, channels_multiplier]
# tf.nn.conv2d()是一個(gè)二維卷積函數(shù),
# stirdes 是卷積核移動(dòng)的步長(zhǎng),4個(gè)1表示,在x張量維度的四個(gè)參數(shù)上移動(dòng)步長(zhǎng)
# padding 參數(shù)"SAME",表示對(duì)原始輸入像素進(jìn)行填充,卷積后映射的2D圖像與原圖大小相等
# 填充,是指在原圖像素值矩陣周圍填充0像素點(diǎn)
# 如果不進(jìn)行填充,假設(shè) 原圖為 32x32 的圖像,卷積和大小為 5x5 ,卷積后映射圖像大小 為 28x28
def conv2d(images,weight):
    return tf.nn.conv2d(images,weight,strides=[1,1,1,1],padding="SAME")


    

Padding

#池化
卷積核在提取特征時(shí)的動(dòng)作成為padding,它有兩種方式:SAME和VALID。卷積核的移動(dòng)步長(zhǎng)不一定能夠整除圖片像素的寬度,所以在有些圖片的邊框位置有些像素不能被卷積。這種不越過邊緣的取樣就叫做 valid padding,卷積后的圖像面積小于原圖像。為了讓卷積核覆蓋到所有的像素,可以對(duì)邊緣位置進(jìn)行0像素填充,然后在進(jìn)行卷積。這種越過邊緣的取樣是 same padding。如過移動(dòng)步長(zhǎng)為1,那么得到和原圖一樣大小的圖像。如果步長(zhǎng)很大,超過了卷積核長(zhǎng)度,那么same padding,得到的特征圖也會(huì)小于原來(lái)的圖像。
def max_pool2x2(images,tname):
    return tf.nn.max_pool(images,ksize=[1,2,2,1],strides=[1,2,2,1],padding="SAME",name=tname)

#images_input 為輸入的圖片,labels_input為輸入的標(biāo)簽
images_input = tf.placeholder(tf.float32,[None,112*92*3],name="input_images")
labels_input = tf.placeholder(tf.float32,[None,2],name="input_labels")
#把圖像轉(zhuǎn)換為112*92*3的形狀
x_input = tf.reshape(images_input,[-1,112,92,3])
訓(xùn)練

第一層卷積+池化

# 卷積核3*3*3 16個(gè)     第一層卷積
w1 = weight_init([3,3,3,16])
b1 = bias_init([16])
conv_1 = conv2d(x_input,w1)+b1
relu_1 = tf.nn.relu(conv_1,name="relu_1")
max_pool_1 = max_pool2x2(relu_1,"max_pool_1")

第二層卷積+池化

# 卷積核3*3*16  32個(gè)  第二層卷積
w2 = weight_init([3,3,16,32])
b2 = bias_init([32])
conv_2 = conv2d(max_pool_1,w2) + b2
relu_2 = tf.nn.relu(conv_2,name="relu_2")
max_pool_2 = max_pool2x2(relu_2,"max_pool_2")

第三層卷積+池化

w3 = weight_init([3,3,32,64])
b3 = bias_init([64])
conv_3 = conv2d(max_pool_2,w3)+b3
relu_3 = tf.nn.relu(conv_3,name="relu_3")
max_pool_3 = max_pool2x2(relu_3,"max_pool_3")

全連接第一層

#把第三層的卷積結(jié)果平鋪成一維向量
f_input = tf.reshape(max_pool_3,[-1,14*12*64])

#全連接第一層 31*31*32,512
f_w1= fch_init(14*12*64,512)
f_b1 = bias_init([512])
f_r1 = tf.matmul(f_input,f_w1) + f_b1

#激活函數(shù),relu隨機(jī)丟掉一些權(quán)重提供泛華能力
f_relu_r1 = tf.nn.relu(f_r1)

# 為了防止網(wǎng)絡(luò)出現(xiàn)過擬合的情況,對(duì)全連接隱藏層進(jìn)行 Dropout(正則化)處理,在訓(xùn)練過程中隨機(jī)的丟棄部分
# 節(jié)點(diǎn)的數(shù)據(jù)來(lái)防止過擬合.Dropout同把節(jié)點(diǎn)數(shù)據(jù)設(shè)置為0來(lái)丟棄一些特征值,僅在訓(xùn)練過程中,
# 預(yù)測(cè)的時(shí)候,仍使用全數(shù)據(jù)特征
# 傳入丟棄節(jié)點(diǎn)數(shù)據(jù)的比例
f_dropout_r1 = tf.nn.dropout(f_relu_r1,drop_prob)

全連接第二層

f_w2 = fch_init(512,128)
f_b2 = bias_init([128])
f_r2 = tf.matmul(f_dropout_r1,f_w2) + f_b2
f_relu_r2 = tf.nn.relu(f_r2)
f_dropout_r2 = tf.nn.dropout(f_relu_r2,drop_prob)

全連接輸出層

f_w3 = fch_init(128,2)
f_b3 = bias_init([2])
f_r3 = tf.matmul(f_dropout_r2,f_w3) + f_b3
最后輸出結(jié)果,可能是這樣的[[0.0001,0.99999] ,那個(gè)位置的結(jié)果大就屬于哪個(gè)分類
f_softmax = tf.nn.softmax(f_r3,name="f_softmax")

損失函數(shù)

#交叉熵代價(jià)函數(shù)
cross_entry =  tf.reduce_mean(tf.reduce_sum(-labels_input*tf.log(f_softmax)))
#優(yōu)化器,自動(dòng)執(zhí)行梯度下降算法
optimizer  = tf.train.AdamOptimizer(learning_rate).minimize(cross_entry)

計(jì)算準(zhǔn)確率&損失

arg1 = tf.argmax(labels_input,1)
arg2 = tf.argmax(f_softmax,1)
#每個(gè)樣本的預(yù)測(cè)結(jié)果是一個(gè)(1,2)的vector
cos = tf.equal(arg1,arg2)
# tf.cast把bool值轉(zhuǎn)換為浮點(diǎn)數(shù)
acc = tf.reduce_mean(tf.cast(cos,dtype=tf.float32))

啟動(dòng)會(huì)話開始訓(xùn)練

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
Cost = []
Accuracy=[]
for i in range(train_epochs):
    idx=random.randint(0,len(train_data.images)-20)
    batch= random.randint(6,18)
    train_input = train_data.images[idx:(idx+batch)]
    train_labels = train_data.labels[idx:(idx+batch)]
    result,acc1,cross_entry_r,cos1,f_softmax1,relu_1_r= sess.run([optimizer,acc,cross_entry,cos,f_softmax,relu_1],feed_dict={images_input:train_input,labels_input:train_labels})
    print acc1
    Cost.append(cross_entry_r)
    Accuracy.append(acc1)

# 代價(jià)函數(shù)曲線
fig1,ax1 = plt.subplots(figsize=(10,7))
plt.plot(Cost)
ax1.set_xlabel("Epochs")
ax1.set_ylabel("Cost")
plt.title("Cross Loss")
plt.grid()
plt.show()

# 準(zhǔn)確率曲線
fig7,ax7 = plt.subplots(figsize=(10,7))
plt.plot(Accuracy)
ax7.set_xlabel("Epochs")
ax7.set_ylabel("Accuracy Rate")
plt.title("Train Accuracy Rate")
plt.grid()
plt.show()

測(cè)試集驗(yàn)證

#測(cè)試
arg2_r = sess.run(arg2,feed_dict={images_input:train_data.test_images,labels_input:train_data.test_labels})
arg1_r = sess.run(arg1,feed_dict={images_input:train_data.test_images,labels_input:train_data.test_labels})
#使用混淆矩陣,打印報(bào)告
print (classification_report(arg1_r, arg2_r))

驗(yàn)證通過,保存模型

#保存模型
saver = tf.train.Saver()
saver.save(sess, "./model/my-gender-v1.0")

使用已訓(xùn)練好的模型參考:gender_model_use.py

結(jié)果: 迭代3000次,模型的準(zhǔn)確率達(dá)到93%

訓(xùn)練交叉熵代價(jià)

訓(xùn)練的準(zhǔn)確率

訓(xùn)練數(shù)據(jù)中的一個(gè)樣本

第一層卷積提取的特征

2x2池化后特征

第二層卷積提取的特征

2x2池化后特征

第三層卷積提取的特征

2x2池化后特征

參考

https://blog.csdn.net/u014281...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42891.html

相關(guān)文章

  • 計(jì)算機(jī)視覺和 CNN 發(fā)展十一座里程碑

    摘要:從到,計(jì)算機(jī)視覺領(lǐng)域和卷積神經(jīng)網(wǎng)絡(luò)每一次發(fā)展,都伴隨著代表性架構(gòu)取得歷史性的成績(jī)。在這篇文章中,我們將總結(jié)計(jì)算機(jī)視覺和卷積神經(jīng)網(wǎng)絡(luò)領(lǐng)域的重要進(jìn)展,重點(diǎn)介紹過去年發(fā)表的重要論文并討論它們?yōu)槭裁粗匾_@個(gè)表現(xiàn)不用說(shuō)震驚了整個(gè)計(jì)算機(jī)視覺界。 從AlexNet到ResNet,計(jì)算機(jī)視覺領(lǐng)域和卷積神經(jīng)網(wǎng)絡(luò)(CNN)每一次發(fā)展,都伴隨著代表性架構(gòu)取得歷史性的成績(jī)。作者回顧計(jì)算機(jī)視覺和CNN過去5年,總結(jié)...

    劉厚水 評(píng)論0 收藏0
  • 深度卷積神經(jīng)網(wǎng)絡(luò)演化歷史及結(jié)構(gòu)改進(jìn)脈絡(luò)-40頁(yè)長(zhǎng)文全面解讀

    早期成果卷積神經(jīng)網(wǎng)絡(luò)是各種深度神經(jīng)網(wǎng)絡(luò)中應(yīng)用最廣泛的一種,在機(jī)器視覺的很多問題上都取得了當(dāng)前較好的效果,另外它在自然語(yǔ)言處理,計(jì)算機(jī)圖形學(xué)等領(lǐng)域也有成功的應(yīng)用。第一個(gè)真正意義上的卷積神經(jīng)網(wǎng)絡(luò)由LeCun在1989年提出[1],后來(lái)進(jìn)行了改進(jìn),它被用于手寫字符的識(shí)別,是當(dāng)前各種深度卷積神經(jīng)網(wǎng)絡(luò)的鼻祖。接下來(lái)我們介紹LeCun在早期提出的3種卷積網(wǎng)絡(luò)結(jié)構(gòu)。?文獻(xiàn)[1]的網(wǎng)絡(luò)由卷積層和全連接層構(gòu)成,網(wǎng)絡(luò)...

    xiaodao 評(píng)論0 收藏0
  • 用Python及深度學(xué)習(xí)實(shí)現(xiàn)iPhone X的FaceID功能

    摘要:然而令人驚訝的是,蘋果公司宣傳比方法更加安全,而且其錯(cuò)誤率僅為。我相信是基于類似于孿生卷積神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)的,并且通過離線訓(xùn)練。結(jié)論本文主要是展示解鎖機(jī)器的基本工作機(jī)制,采用的方法是基于人臉映射和孿生卷積神經(jīng)網(wǎng)絡(luò)。 摘要: 本文主要是展示FaceID解鎖機(jī)器的基本工作機(jī)制,采用的方法是基于人臉映射和孿生卷積神經(jīng)網(wǎng)絡(luò),Github上附詳細(xì)代碼。 showImg(https://segment...

    sixgo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<