1、創建模型
- 引入包
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Dropout,Conv2D,MaxPooling2D,Flatten
from keras.optimizers import SGD,Adam
from keras.regularizers import l2
import _pickle as p
from keras import optimizers
import itertools
import cv2
import os
import random
from keras.regularizers import l2
print(1)
from sklearn.model_selection import train_test_split
- 獲取圖片
圖片是每個人臉有500張,為了增加魯棒性,然后通過引入os,實作檔案讀取,分別將圖片和標簽加入到image、label中,但是其是一一對應的關系,然后將其歸一化,然后再將其順序打亂, 但是打亂的時候也是一一對應的關系,如果出現錯誤,那么將會全部錯誤,然后為了測驗其功能,可以將其劃分為測驗資料和訓練資料,
# 讀取訓練資料到記憶體,這里資料結構是串列
# path_name是當前作業目錄,后面會由os.getcwd()獲得
def read_path(path_name):
images = []
labels = []
for dir_item in os.listdir(path_name): # os.listdir() 方法用于回傳指定的檔案夾包含的檔案或檔案夾的名字的串列
# 從當前作業目錄尋找訓練集圖片的檔案夾
full_path = os.listdir(path_name+dir_item)
print(dir_item)
for file in full_path:
path = path_name+dir_item+'/'+file
img = cv2.imread(path)
images.append(img)
labels.append(path_name+dir_item)
return images,labels
images,labels = read_path('./pic/')
# 將lsit轉換為numpy array
images = np.asarray(images, dtype='float64')/256
labels = np.asarray([0 if label.endswith('1') else 1 if label.endswith('2') else 2 for label in labels])
print(labels)
index = [i for i in range(len(images))]
random.shuffle(index)
data = images[index]
label = labels[index]
label= np_utils.to_categorical(label, num_classes=3)
#標簽打亂
X_train, X_test, Y_train, Y_test = train_test_split(data, label, test_size=0.30, random_state=42)
2.3、創建模型
這是用的最經典的五層模型,其中的引數我貼在下面
# 構建一個空的網路模型,它是一個線性堆疊模型,各神經網路層會被順序添加,專業名稱為序貫模型或線性堆疊模型
# model = Sequential()
# # 以下代碼將順序添加CNN網路需要的各層,一個add就是一個網路層
# model.add(Conv2D(
# input_shape= (47,57,3),
# filters = 32,
# kernel_size = 5,
# strides = 1,
# padding = 'same',
# activation = 'relu'
# ))
model=Sequential()
model.add(Conv2D(filters=36, kernel_size=5, padding='valid',kernel_regularizer=l2(0.003), input_shape=(100,100,3), activation='relu'))
model.add(Dropout(0.2))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=16, kernel_size=(5,5), padding='valid', activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
#下面就是全連接層了
model.add(Dense(520, activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(128, activation='relu'))
model.add(Dense(3, activation='softmax'))
#compile model
#事實證明,對于分類問題,使用交叉熵(cross entropy)作為損失函式更好些
model.compile(
loss='categorical_crossentropy',
optimizer=optimizers.Adadelta(lr=0.01, rho=0.95, epsilon=1e-06),
metrics=['accuracy']
)
# 輸出模型概況
model.summary()

2.4、配置模型
模型中用到的是交叉熵損失函式,前面的全連接層激活函式用的‘reul’,最后一層用的‘softmax’函式,
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) # 采用SGD+momentum的優化器進行訓練,首先生成一個優化器物件
model.compile(loss='categorical_crossentropy',
optimizer=optimizers.Adadelta(lr=0.01, rho=0.95, epsilon=1e-06),
metrics=['accuracy']) # 完成實際的模型配置作業
2.5、訓練模型
然后模型就生成了‘my_model.h5’
model.fit(X_train, Y_train, epochs = 10,batch_size=128)
loss_, accuracy_ = model.evaluate(X_test,Y_test)
loss, accuracy = model.evaluate(X_train,Y_train)
result = model.predict(X_test)
print(loss_)
print(accuracy_)
print(loss)
print(accuracy)
model.save('my_model.h5')
#model.load_weights('my_model.h5')
但是光有模型想要自己實作人臉識別還有一段路,需要自己在后面寫一些東西來識別,辨別影像,然后才能真正實作人臉識別功能,暫時先寫模型創建,后續更新模型使用,實作人臉識別,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/219002.html
標籤:其他
上一篇:第二章 tensor和梯度計算
