keras实现图像识别—cat

使用Keras设计的神经网络进行猫的图像识别,模型包含卷积层、池化层和全连接层。由于训练数据量小,导致模型在测试集上出现严重过拟合,准确率为74%。通过添加L2正则项来缓解过拟合,测试集准确率提升至86%。

目的:识别图片中是否有猫
训练集x_train(209,64,64,3),y_train(209,)
测试集x_test(50,64,64,3),y_test(50,)

设计的神经网络结构图如下:
卷积层——池化层——卷积层——池化层——卷积层——池化层——平铺展开——全连接层——全连接层——全连接层
在这里插入图片描述

获取数据

# coding: utf-8
# 2019/7/28 19:23
import h5py
import numpy as np
def get_train():
    f = h5py.File('dataset/train_catvnoncat.h5','r')
    x_train = np.array(f['train_set_x'])#训练集数据  将数据转化为np.array
    y_train = np.array(f['train_set_y'])#训练集标签
    return x_train,y_train
def get_test():
    f = h5py.File('dataset/test_catvnoncat.h5', 'r')
    x_test = np.array(f['test_set_x'])#测试集数据  将数据转化为np.array
    y_test = np.array(f['test_set_y'])#测试集标签
    return x_test,y_test

def preprocess(X):
    #将X标准化,从0-255变成0-1
    X =X / 255
    return X


if __name__ == '__main__':
    x1,y1 = get_train()
    x2,y2 = get_test()
    print(x1.shape,y1.shape)
    print(x2.shape,y2.shape)
    print(np.max(x1))
    print(np.max(y2))

    from matplotlib import  pyplot as plt
    plt.figure()
    for i in range(1,16):
        plt.subplot(3,5,i)
        plt.imshow(x1[i])
        print(y1[i])
    plt.show()

训练测试

# coding: utf-8
# 2019/7/28 19:17
import data
from keras.models import Sequential
from keras.layers import Conv2D,MaxPool2D,Dense,Flatten
if __name__ == '__main__':
    model = Sequential()
    model.add(Conv2D(filters=16,kernel_size=(9,9),strides=1,padding='valid'))
    model.add(MaxPool2D(pool_size=(2,2),strides=2))
    model.add(Conv2D(filters=32,kernel_size=(5,5),strides=1,padding='valid'))
    model.add(MaxPool2D(pool_size=(2,2),strides=2))
    model.add(Conv2D(filters=64,kernel_size=(3,3),strides=1,padding='same'))
    model.add(MaxPool2D(pool_size=(2,2),strides=2))
    model.add(Flatten())
    model.add(Dense(units=256,activation='relu'))
    model.add(Dense(units=128,activation='relu'))
    model.add(Dense(units=1,activation='sigmoid'))

    model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])

    x_train,y_train = data.get_train()
    x_test,y_test = data.get_test()
    x_train = data.preprocess(x_train)
    x_test = data.preprocess(x_test)
    
    model.fit(x_train,y_train,epochs=100)

    result = model.evaluate(x_test,y_test)
    print('测试结果:',result)

结果:可以看到,在训练集上损失值已经极小了,准确率已经达到了1,但是在测试集上准确率只有74%,说明由于训练数据太少,模型存在严重过拟合现象,等我下次再优化一下,添加正则化来解决过拟合问题,比如:L2正则项,Dropout随机失活,Data Augmentation或者Early Stopping等
在这里插入图片描述
~~未完待续 o.o

------------------------------------------------------分割线------------------------------------------------------------
第二天,为了解决过拟合问题,我在卷积层和全连接层加入了L2正则项如下:

model = Sequential()
    model.add(Conv2D(filters=16,kernel_size=(9,9),strides=1,padding='valid',kernel_regularizer=regularizers.l2(0.01)))
    model.add(MaxPool2D(pool_size=(2,2),strides=2))
    model.add(Conv2D(filters=32,kernel_size=(5,5),strides=1,padding='valid',kernel_regularizer=regularizers.l2(0.01)))
    model.add(MaxPool2D(pool_size=(2,2),strides=2))
    model.add(Conv2D(filters=64,kernel_size=(3,3),strides=1,padding='same',kernel_regularizer=regularizers.l2(0.01)))
    model.add(MaxPool2D(pool_size=(2,2),strides=2))
    model.add(Flatten())
    model.add(Dense(units=256,activation='relu',kernel_regularizer=regularizers.l2(0.01)))
    model.add(Dense(units=128,activation='relu',kernel_regularizer=regularizers.l2(0.01)))
    model.add(Dense(units=1,activation='sigmoid',kernel_regularizer=regularizers.l2(0.01)))

结果:
在这里插入图片描述
相比之前,在测试集上的损失值从1.886下降到了0.890,准确率从0.7399上升到了0.8600,效果确实有所提升。

损失值准确率
原始1.8860.7399
L2正则项0.8900.8600
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值