使用VGG16深度为D的列训练猫狗数据集。convx-y中x表示卷积核尺寸,y表示特征通道数。比如conv3-256表示3x3的卷积核并且通道数为256。
from keras.models import Sequential
from keras.layers import Convolution2D,MaxPooling2D,Flatten,Dense,Dropout
from keras.optimizers import SGD
import cv2
import numpy as np
import glob
from sklearn.model_selection import train_test_split
#猫狗数据集
image_size = 64
X = []
y = []
# 导入猫数据
files = glob.glob("MAO/*g")
for file in files:
try:
image = cv2.imread(file) # 读取图片数据
image = cv2.resize(image, (image_size, image_size),interpolation=cv2.INTER_CUBIC) # 压缩图片,一定要等比例缩放
X.append(image)
y.append([0, 1])
except Exception as e:
print(file,e)
# 导入狗数据
files = glob.glob("GOU/*g")
for file in files:
try:
image = cv2.imread(file) # 读取图片数据
image = cv2.resize(image, (image_size, image_size),interpolation=cv2.INTER_CUBIC) # 压缩图片
X.append(image)
y.append([1, 0])
except Exception as e:
print(file,e)
X = np.array(X)
y = np.array(y)
X_train,X_test,y_train,y_test = train_test_split(X,y)
def vgg16():
model = Sequential()
#conv3-64
model.add(Convolution2D(input_shape=(image_size, image_size, 3), filters=64, kernel_size=3, strides=2, padding='same', activation='relu'))
model.add(Convolution2D(filters=64, kernel_size=3, strides=2, padding='same', activation='relu'))
#池化
model.add(MaxPooling2D(pool_size=(3, 3), strides=2, padding='same'))
# conv3-128
model.add(Convolution2D(filters=128, kernel_size=3, strides=2, padding='same', activation='relu'))
model.add(Convolution2D(filters=128, kernel_size=3, strides=2, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=2, padding='same'))
# conv3-256
model.add(Convolution2D(filters=256, kernel_size=3, strides=2, padding='same', activation='relu'))
model.add(Convolution2D(filters=256, kernel_size=3, strides=2, padding='same', activation='relu'))
model.add(Convolution2D(filters=256, kernel_size=3, strides=2, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=2, padding='same'))
# conv3-512
model.add(Convolution2D(filters=512, kernel_size=3, strides=2, padding='same', activation='relu'))
model.add(Convolution2D(filters=512, kernel_size=3, strides=2, padding='same', activation='relu'))
model.add(Convolution2D(filters=512, kernel_size=3, strides=2, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=2, padding='same'))
# conv3-512
model.add(Convolution2D(filters=512, kernel_size=3, strides=2, padding='same', activation='relu'))
model.add(Convolution2D(filters=512, kernel_size=3, strides=2, padding='same', activation='relu'))
model.add(Convolution2D(filters=512, kernel_size=3, strides=2, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=2, padding='same'))
#转向一维向量
model.add(Flatten())
# 全连接层
model.add(Dense(4096, activation='relu'))
model.add(Dense(4096, activation='relu'))
model.add(Dense(2, activation='softmax'))
return model
model = vgg16()
#优化器
sgd = SGD(lr=0.05, decay=1e-5)
#编译
model.compile(sgd,loss="categorical_crossentropy",metrics=['accuracy'])
#训练
model.fit(X_train,y_train,validation_data=(X_test,y_test),epochs=20,batch_size=50)
# model.save('dog_cat.h5')
print(model.evaluate(X_test,y_test,batch_size=50))
cpu跑不动就跑个开头了