欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

吴恩达作业10:用卷积神经网络识别人脸happy(基于Keras)

程序员文章站 2022-07-14 09:18:41
...

数据集提供的代码放在kt_utils.py:

import keras.backend as K
import math
import numpy as np
import h5py
import matplotlib.pyplot as plt

def mean_pred(y_true, y_pred):
    return K.mean(y_pred)

def load_dataset():
    train_dataset = h5py.File('datasets/train_happy.h5', "r")
    train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set features
    train_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labels
    #print(train_set_x_orig.shape) ##(600, 64, 64, 3)
    #print(train_set_y_orig)##(600,)
    test_dataset = h5py.File('datasets/test_happy.h5', "r")
    test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set features
    test_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labels
    #print(test_set_x_orig.shape)#(150, 64, 64, 3)
    #print(test_set_y_orig.shape)#(150,)
    classes = np.array(test_dataset["list_classes"][:]) # the list of classes
    #print(classes) #[0,1]
    train_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0]))
    test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0]))
    #print(train_set_y_orig.shape)  (1, 600)
    #print(test_set_y_orig.shape)   (1, 150)
    return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes
#load_dataset()

查看数据集:

import kt_utils
import cv2
import matplotlib.pyplot as plt
train_set_x_orig, train_set_Y, test_set_x_orig, test_set_Y, classes = kt_utils.load_dataset()
print('训练样本={}'.format(train_set_x_orig.shape))
print('训练样本标签={}'.format(train_set_Y.shape))
print('测试样本={}'.format(test_set_x_orig.shape))
print('测试样本标签={}'.format(test_set_Y.shape))
print('第五个样本={}'.format(train_set_Y[0,5]))
cv2.imshow('1.jpg',train_set_x_orig[5,:,:,:])
cv2.waitKey()
print('第六个样本={}'.format(train_set_Y[0,6]))
cv2.imshow('1.jpg',train_set_x_orig[6,:,:,:])
cv2.waitKey()
# plt.imshow(train_set_x_orig[5,:,:,:])
# plt.show()

打印结果:可看出600个训练样本,150个测试样本,size=(64,64,3),其中happy的标签为1,not happy的标签为0,故标签也要经过one-hot。

吴恩达作业10:用卷积神经网络识别人脸happy(基于Keras)

吴恩达作业10:用卷积神经网络识别人脸happy(基于Keras)

开始训练模型代码如下:

import numpy as np
import matplotlib.pyplot as plt
from keras.models import Model
from keras.layers import Input,ZeroPadding2D,Conv2D,BatchNormalization,Activation,MaxPooling2D
from keras.layers import Flatten,Dense
import kt_utils
from keras.preprocessing import image
from keras.applications.imagenet_utils import preprocess_input
from keras.utils import plot_model
from IPython.display import SVG
from keras.utils.vis_utils import model_to_dot
import time
import cv2
"""
转换成one-hot
"""
def convert_to_one_hot(Y, C):
    Y = np.eye(C)[Y.reshape(-1)].T
    return Y
"""
获取数据  并将标签转换成one-hot
"""
def convert_data():
    train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes=kt_utils.load_dataset()
    train_x=train_set_x_orig/255
    test_x = test_set_x_orig / 255
    train_y=convert_to_one_hot(train_set_y_orig,2).T
    test_y = convert_to_one_hot(test_set_y_orig, 2).T
    #print(train_y.shape)
    return train_x,train_y,test_x,test_y
"""
查看样本
"""
def test():
    train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes=kt_utils.load_dataset()
    X_train=train_set_x_orig/255
    X_test = test_set_x_orig / 255
    Y_train=train_set_y_orig.T
    Y_test = test_set_y_orig.T
    plt.imshow(train_set_x_orig[63,:,:,:])
    plt.show()
"""
构建CNN模型
"""
def model(input_shape):
    X_input=Input(input_shape)
    print('输入尺寸={}'.format(X_input.shape))
    #Zero padding
    X=ZeroPadding2D((3,3))(X_input)
    print('输补完零尺寸={}'.format(X.shape))
    #CONV->BN->RELU
    X=Conv2D(32,(7,7),strides=(1,1),name='conv0')(X)
    print('第一次卷积尺寸={}'.format(X.shape))
    X=BatchNormalization(axis=-1,name='bn0')(X)
    X=Activation('relu')(X)
    #MAXPOOL
    X=MaxPooling2D((2,2),name='max_pool')(X)
    print('第一池化尺寸={}'.format(X.shape))
    #FLATTEN+FULLYCONNECTED
    X=Flatten()(X)
    X=Dense(2,activation='sigmoid',name='fc')(X)
    model=Model(inputs=X_input,outputs=X,name='HappyModel')
    return model
"""
测试模型
"""
def testModel():
    train_x, train_y, test_x, test_y=convert_data()
    #定义好模型结构
    happyModel=model(input_shape=[64,64,3])
    #模型编译
    happyModel.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
    #模型训练
    start_time=time.time()
    print('============模型开始训练=====================')
    happyModel.fit(x=train_x,y=train_y,epochs=1,batch_size=32)
    end_time=time.time()
    print('train_time={}'.format(end_time-start_time))
    # save the model
    #happyModel.save('my_model_v1.h5')
    print('============模型开始测试=====================')
    preds=happyModel.evaluate(x=test_x,y=test_y,batch_size=32)
    print()
    print('loss={}'.format(preds[0]))
    print('Test accuarcy={}'.format(preds[1]))
    #打印参数
    happyModel.summary()
    #可视化模型
    plot_model(happyModel,to_file='HappyModel.png')
    SVG(model_to_dot(happyModel).create(prog='dot',format='svg'))
    #test my_image
    print('============测试自己的照片===================')
    path = 'images/my_image.jpg'
    img = image.load_img(path, target_size=(64, 64))
    plt.imshow(img)
    plt.show()
    x = image.img_to_array(img)  # (64,64,3)
    x = x.reshape(1, 64, 64, 3)
    x=preprocess_input(x)
    y=happyModel.predict(x)
    print('预测值={}'.format(y))
def testPicture():
    # img=cv2.imread('my_image.jpg')
    # cv2.imshow('img',img)
    path='images/my_image.jpg'
    img=image.load_img(path,target_size=(64,64))
    plt.imshow(img)
    plt.show()
    print('img=',img)

    x=image.img_to_array(img)#(64,64,3)
    print('x=',x)
    print(x.shape)
    #x = np.expand_dims(x, axis=0)#(1,64,64,3)
    x=x.reshape(64,64,3)
    print('x=',x)
    print(x.shape)
    plt.imshow(x)
    plt.show()
if __name__=='__main__':
    #test()
    testModel()
    #testPicture()

打印结果:?号代表样本数,可知池化过后尺寸为(32,32,32)

吴恩达作业10:用卷积神经网络识别人脸happy(基于Keras)

训练次数是一次,结果如下:可知每张图片训练时间为17ms,600张时间为10s,跟自己记录的train_time差一点点,因为还有别的开支。

吴恩达作业10:用卷积神经网络识别人脸happy(基于Keras)

测试结果:测试精度一般

吴恩达作业10:用卷积神经网络识别人脸happy(基于Keras)

打印出模型参数,并且可视化:可看成conv0参数=7×7×3×32(W的参数)+32(b的参数)=4736

吴恩达作业10:用卷积神经网络识别人脸happy(基于Keras)

吴恩达作业10:用卷积神经网络识别人脸happy(基于Keras)

测试自己的照片:

吴恩达作业10:用卷积神经网络识别人脸happy(基于Keras)

打印结果:貌似是happy 貌似又不是 样本量少 加上训练次数少 肯定是不准的。

吴恩达作业10:用卷积神经网络识别人脸happy(基于Keras)