神经网络实现猫狗识别实践(初始训练 or 使用VGG预训练模型)

在学习神经网络过程中,进行了猫狗识别实践,该篇博客用于记录实践过程,便于后期记忆。

1. 神经网络实现猫狗识别实践(初始训练神经网络)

# from diy import *
from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Activation, Dropout, Flatten, Dense
from keras.optimizers import Adam
from keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img
from keras.models import load_model
import numpy as np

# 载入图片
# img = cv2.imread('imag.jpg')
# img = imagread('imag.jpg')
# imagshow(img)

# 定义模型
model = Sequential()
model.add(Conv2D(input_shape=(150, 150, 3), filters=32, kernel_size=3, padding='same', activation='relu'))
model.add(Conv2D(filters=32, kernel_size=3, padding='same', activation='relu'))
model.add(MaxPool2D(pool_size=2, strides=2))

model.add(Conv2D(filters=64, kernel_size=3, padding='same', activation='relu'))
model.add(Conv2D(filters=64, kernel_size=3, padding='same', activation='relu'))
model.add(MaxPool2D(pool_size=2, strides=2))

model.add(Conv2D(filters=128, kernel_size=3, padding='same', activation='relu'))
model.add(Conv2D(filters=128, kernel_size=3, padding='same', activation='relu'))
model.add(MaxPool2D(pool_size=2, strides=2))

model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0, 5))
model.add(Dense(2, activation='softmax'))

# 定义优化器
adam = Adam(lr=1e-4)

# 定义优化器,代价函数,训练过程中计算准确率
model.compile(optimizer=adam, loss='categorical_crossentropy', metrics=['accuracy'])

train_datagen = ImageDataGenerator(
    rotation_range=40,  # 随机旋转度数
    width_shift_range=0.2,
    height_shift_range=0.2,
    rescale=1 / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest',
)

test_datagen = ImageDataGenerator(
    rescale=1 / 255,
)

batch_size = 32

# 生成训练数据
train_generator = train_datagen.flow_from_directory(
    'image/train',
    target_size=(150, 150),
    batch_size=batch_size,
)

# 生成测试数据
test_generator = train_datagen.flow_from_directory(
    'image/test',
    target_size=(150, 150),
    batch_size=batch_size,
)

model.fit_generator(train_generator, steps_per_epoch=2, epochs=30, validation_data=test_generator, validation_steps=2)

model.save('model_cnn.h5')

# 测试
label = np.array(['cat', 'dog'])
# 载入模型
model = load_model('model_cnn.h5')

# 导入图片
image = load_img('image/test/88.jpg')
image
image = image.resize((150, 150))
image = img_to_array(image)
image = image / 255
image = np.expand_dims(image, 0)

# 预测
print(label[model.predict_classes(image)])

2. 神经网络实现猫狗识别实践(使用VGG预训练模型)

from keras.applications.vgg16 import VGG16
from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Activation, Dropout, Flatten, Dense
from keras.optimizers import SGD
from keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img
from keras.models import load_model
import numpy as np

vgg16_model = VGG16(weights='imagenet', include_top=False, input_shape=(150, 150, 3))

# 搭建全连接层
top_model = Sequential()
top_model.add(Flatten(input_shape=vgg16_model.output_shape[1:]))
top_model.add(Dense(256, activation='relu'))
top_model.add(Dropout(0, 5))
top_model.add(Dense(2, activation='softmax'))

model = Sequential()
model.add(vgg16_model)
model.add(top_model)

# 定义优化器,代价函数,训练过程中计算准确率
model.compile(optimizer=SGD(lr=1e-4, momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy'])

train_datagen = ImageDataGenerator(
    rotation_range=40,  # 随机旋转度数
    width_shift_range=0.2,
    height_shift_range=0.2,
    rescale=1 / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest',
)

test_datagen = ImageDataGenerator(
    rescale=1 / 255,
)

batch_size = 32

# 生成训练数据
train_generator = train_datagen.flow_from_directory(
    'image/train',
    target_size=(150, 150),
    batch_size=batch_size,
)

# 生成测试数据
test_generator = train_datagen.flow_from_directory(
    'image/test',
    target_size=(150, 150),
    batch_size=batch_size,
)

model.fit_generator(train_generator, steps_per_epoch=2, epochs=30, validation_data=test_generator, validation_steps=2)

model.save('model_vgg16.h5')

# 测试
label = np.array(['cat', 'dog'])
# 载入模型
model = load_model('model_vgg16.h5')

# 导入图片
image = load_img('image/test/88.jpg')
# image
image = image.resize((150, 150))
image = img_to_array(image)
image = image / 255
image = np.expand_dims(image, 0)

# 预测
print(label[model.predict_classes(image)])

你可能感兴趣的:(Machine,Learning)