使用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左右
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:keras 极简搭建VGG16 手写数字识别 - Python技术站