使用VGG16网络 完成迁移学习案例

from keras.applications.vgg16 import VGG16
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Activation, Dropout, Flatten, Dense
from keras.optimizers import SGD
from keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img
import numpy as np
from keras.utils import  np_utils
import cv2
import pickle
import matplotlib.pyplot as plt
from keras.datasets import mnist

# 得到适合网络的数据
(X_train_data, Y_train), (X_test_data, Y_test) = mnist.load_data()  # 下载数据
X_train_data = X_train_data.astype('float32')  # uint8-->float32
X_test_data = X_test_data.astype('float32')
X_train_data /= 255  # 归一化到0~1区间
X_test_data /= 255
# (60000, 48, 48, 3)
X_train = []
# (10000, 48, 48, 3)
X_test = []
# 把(27, 27, 1)维的数据转化成(48, 48, 3)维的数据
for i in range(X_train_data.shape[0]):
    X_train.append(cv2.cvtColor(cv2.resize(X_train_data[i], (48, 48)), cv2.COLOR_GRAY2RGB))
for i in range(X_test_data.shape[0]):
    X_test.append(cv2.cvtColor(cv2.resize(X_test_data[i], (48, 48)), cv2.COLOR_GRAY2RGB))

X_train = np.array(X_train)
X_test = np.array(X_test)
# 独热编码
y_train = np_utils.to_categorical(Y_train, num_classes=10)
y_test = np_utils.to_categorical(Y_test, num_classes=10)

# 构建网络
vgg16_model = VGG16(weights='imagenet', include_top=False, input_shape=(48, 48, 3))
for layer in vgg16_model.layers:
    layer.trainable = False # 别去调整之前的卷积层的参数

top_model = Sequential()
top_model.add(Flatten(input_shape=vgg16_model.output_shape[1:]))
top_model.add(Dense(512, activation='relu'))
top_model.add(Dropout(0.4))
top_model.add(Dense(10, activation='softmax'))

model = Sequential()
model.add(vgg16_model)
model.add(top_model)
sgd = SGD(learning_rate=0.05, decay=1e-5)
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
model.fit(X_train, y_train, batch_size=128, epochs=15)
model.evaluate(X_test, y_test)

我跑了30轮数据,测试集上准确率在0.9833左右