目的:识别图片中是否有猫
训练集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.886 | 0.7399 |
| L2正则项 | 0.890 | 0.8600 |
使用Keras设计的神经网络进行猫的图像识别,模型包含卷积层、池化层和全连接层。由于训练数据量小,导致模型在测试集上出现严重过拟合,准确率为74%。通过添加L2正则项来缓解过拟合,测试集准确率提升至86%。

414

被折叠的 条评论
为什么被折叠?



