keras卷积神经网络入门-笑脸检测

Keras简介

Keras以其强大的封装结构,让我们不必过多的考虑神经网络间的计算,极大简化了tensorflow中的图计算,我们可以利用函数式编程来快速制定想要的神经网络结构。本案例基于卷积神经网络,向大家给出Keras入门案例。

1.库函数导入

import numpy as np
from keras.layers import Input, Dense, Activation, ZeroPadding2D, BatchNormalization, Flatten, Conv2D
from keras.layers import AveragePooling2D, MaxPooling2D, Dropout, GlobalMaxPooling2D, GlobalAveragePooling2D
from keras.models import Model
from keras.preprocessing import image
from keras.applications.imagenet_utils import preprocess_input
import kt_utils 
import keras.backend as K
K.set_image_data_format('channels_last')
import matplotlib.pyplot as plt
from matplotlib.pyplot import imshow

2.查看数据集

#加载数据
#图像维度:(64,64,3)训练集数量:600  测试集数量:150
X_train, Y_train, X_test, Y_test, classes = kt_utils.load_dataset()
#挑选一张图片查看
plt.imshow(X_train[1])
#查看标签
print(Y_train[:,1])

标签为1是笑脸

3.构建模型

在这里插入图片描述


##模型各层矩阵维度

input_2 (InputLayer) (None, 64, 64, 3) 0


zero_padding2d_2 (ZeroPaddin (None, 70, 70, 3) 0


conv0 (Conv2D) (None, 64, 64, 32) 4736


bn0 (BatchNormalization) (None, 64, 64, 32) 128


activation_2 (Activation) (None, 64, 64, 32) 0


max_pool (MaxPooling2D) (None, 32, 32, 32) 0


flatten_2 (Flatten) (None, 32768) 0


fc (Dense) (None, 1) 32769

=================================================================
Total params: 37,633
Trainable params: 37,569
Non-trainable params: 64



    #定义输入层
    X_input = Input(input_shape)

    #使用0填充,filter大小为3*3
    X = ZeroPadding2D((3, 3))(X_input)

    #卷积filter大小为7*7通道数为32,步长为1
    X = Conv2D(32, (7, 7), strides=(1, 1), name='conv0')(X)
    #采用BN,减少层与层的联系,增加模型健壮性
    X = BatchNormalization(axis=3, name='bn0')(X)
    #选取relu作为激活函数
    X = Activation('relu')(X)
    #最大值池化层,filter尺寸为2*2
    X = MaxPooling2D((2, 2), name='max_pool')(X)
    #降维,矩阵转化为向量 
    X = Flatten()(X)
    #+ 全连接层
    X = Dense(1, activation='sigmoid', name='fc')(X)

4.训练模型


#编译模型采用Adam优化器
happy_model.compile("adam","binary_crossentropy", metrics=['accuracy'])
#训练模型
happy_model.fit(X_train, Y_train, epochs=40, batch_size=50)
#评估模型
preds = happy_model.evaluate(X_test, Y_test, batch_size=32, verbose=1, sample_weight=None)
print ("误差值 = " + str(preds[0]))
print ("准确度 = " + str(preds[1]))

5.预测自己的图片

#测试自己的图片
img_path = './smile.jpg'

img = image.load_img(img_path, target_size=(64, 64))
imshow(img)
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

if happy_model.predict(x)==1:
    print("笑脸")
else:
    print("哭脸")
    
happy_model.summary()

代码附上
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

    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

    classes = np.array(test_dataset["list_classes"][:]) # the list of classes
    
    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]))
    
    return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes
# -*- coding: utf-8 -*-
"""
Created on Thu Jul 18 22:06:57 2019

@author: 17319
"""

import numpy as np
from keras.layers import Input, Dense, Activation, ZeroPadding2D, BatchNormalization, Flatten, Conv2D
from keras.layers import AveragePooling2D, MaxPooling2D, Dropout, GlobalMaxPooling2D, GlobalAveragePooling2D
from keras.models import Model
from keras.preprocessing import image
from keras.applications.imagenet_utils import preprocess_input
import kt_utils 
import keras.backend as K
K.set_image_data_format('channels_last')
import matplotlib.pyplot as plt
from matplotlib.pyplot import imshow

#加载数据
#图像维度:(64,64,3)训练集数量:600  测试集数量:150
X_train, Y_train, X_test, Y_test, classes = kt_utils.load_dataset()
#挑选一张图片查看
plt.imshow(X_train[1])
print(Y_train[:,1])
# Normalize image vectors
X_train = X_train/255.
X_test = X_test/255.

# Reshape
Y_train = Y_train.T
Y_test = Y_test.T

#print ("number of training examples = " + str(X_train.shape[0]))
#print ("number of test examples = " + str(X_test.shape[0]))
#print ("X_train shape: " + str(X_train.shape))
#print ("Y_train shape: " + str(Y_train.shape))
#print ("X_test shape: " + str(X_test.shape))
#print ("Y_test shape: " + str(Y_test.shape))


def HappyModel(input_shape):


    X_input = Input(input_shape)
    X = ZeroPadding2D((3, 3))(X_input)
    X = Conv2D(32, (7, 7), strides=(1, 1), name='conv0')(X)
    X = BatchNormalization(axis=3, name='bn0')(X)
    X = Activation('relu')(X)
    X = MaxPooling2D((2, 2), name='max_pool')(X)
    #降维,矩阵转化为向量 + 全连接层
    X = Flatten()(X)
    X = Dense(1, activation='sigmoid', name='fc')(X)

    model = Model(inputs=X_input, outputs=X, name='HappyModel')

    return model

#创建一个模型实体
happy_model = HappyModel(X_train.shape[1:])
#编译模型
happy_model.compile("adam","binary_crossentropy", metrics=['accuracy'])
#训练
#初始化优化器和模型
history = happy_model.fit(X_train,Y_train,batch_size=64,epochs=20,
                    validation_split=0.2)
score = happy_model.evaluate(X_test,Y_test)
print("test score:",score[0])
print("test accuracy",score[1])

#列出所有历史数据
print(history.history.keys())

#汇总损失函数历史数据
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model_loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train','test'],loc='upper left')
plt.show()


#测试自己的图片
img_path = './smile.jpg'

img = image.load_img(img_path, target_size=(64, 64))
imshow(img)

x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

if happy_model.predict(x)==1:
    print("笑脸")
else:
    print("哭脸")
    
happy_model.summary()
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值