Keras如何使用ImageNet上预训练的模型
这篇文章主要讲解了Keras如何使用ImageNet上预训练的模型,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
我就废话不多说了,大家还是直接看代码吧!
import kerasimport numpy as npfrom keras.applications import vgg16, inception_v3, resnet50, mobilenet #Load the VGG modelvgg_model = vgg16.VGG16(weights='imagenet') #Load the Inception_V3 modelinception_model = inception_v3.InceptionV3(weights='imagenet') #Load the ResNet50 modelresnet_model = resnet50.ResNet50(weights='imagenet') #Load the MobileNet modelmobilenet_model = mobilenet.MobileNet(weights='imagenet')
在以上代码中,我们首先import各种模型对应的module,然后load模型,并用ImageNet的参数初始化模型的参数。
如果不想使用ImageNet上预训练到的权重初始话模型,可以将各语句的中'imagenet'替换为'None'。
补充知识:keras上使用alexnet模型来高准确度对mnist数据进行分类
纲要
本文有两个特点:一是直接对本地mnist数据进行读取(假设事先已经下载或从别处拷来)二是基于keras框架(网上多是基于tf)使用alexnet对mnist数据进行分类,并获得较高准确度(约为98%)
本地数据读取和分析
很多代码都是一开始简单调用一行代码来从网站上下载mnist数据,虽然只有10来MB,但是现在下载速度非常慢,而且经常中途出错,要费很大的劲才能拿到数据。
(X_train, y_train), (X_test, y_test) = mnist.load_data()
其实可以单独来获得这些数据(一共4个gz包,如下所示),然后调用别的接口来分析它们。
mnist = input_data.read_data_sets("./MNIST_data", one_hot = True) #导入已经下载好的数据集,"./MNIST_data"为存放mnist数据的目录
x_train = mnist.train.imagesy_train = mnist.train.labelsx_test = mnist.test.imagesy_test = mnist.test.labels
这里面要注意的是,两种接口拿到的数据形式是不一样的。 从网上直接下载下来的数据 其image data值的范围是0~255,且label值为0,1,2,3...9。 而第二种接口获取的数据 image值已经除以255(归一化)变成0~1范围,且label值已经是one-hot形式(one_hot=True时),比如label值2的one-hot code为(0 0 1 0 0 0 0 0 0 0)
所以,以第一种方式获取的数据需要做一些预处理(归一和one-hot)才能输入网络模型进行训练 而第二种接口拿到的数据则可以直接进行训练。
Alexnet模型的微调
按照公开的模型框架,Alexnet只有第1、2个卷积层才跟着BatchNormalization,后面三个CNN都没有(如有说错,请指正)。如果按照这个来搭建网络模型,很容易导致梯度消失,现象就是 accuracy值一直处在很低的值。 如下所示。
在每个卷积层后面都加上BN后,准确度才迭代提高。如下所示
完整代码
import kerasfrom keras.datasets import mnistfrom keras.models import Sequentialfrom keras.layers.core import Dense, Dropout, Activation, Flattenfrom keras.layers.convolutional import Conv2D, MaxPooling2D, ZeroPadding2Dfrom keras.layers.normalization import BatchNormalizationfrom keras.callbacks import ModelCheckpointimport numpy as npimport tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data #tensorflow已经包含了mnist案例的数据 batch_size = 64num_classes = 10epochs = 10img_shape = (28,28,1) # input dimensionsimg_rows, img_cols = 28,28 # dataset input#(x_train, y_train), (x_test, y_test) = mnist.load_data()mnist = input_data.read_data_sets("./MNIST_data", one_hot = True) #导入已经下载好的数据集,"./MNIST_data"为存放mnist数据的目录print(mnist.train.images.shape, mnist.train.labels.shape)print(mnist.test.images.shape, mnist.test.labels.shape)print(mnist.validation.images.shape, mnist.validation.labels.shape) x_train = mnist.train.imagesy_train = mnist.train.labelsx_test = mnist.test.imagesy_test = mnist.test.labels # data initializationx_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)input_shape = (img_rows, img_cols, 1) # Define the input layerinputs = keras.Input(shape = [img_rows, img_cols, 1]) #Define the converlutional layer 1conv1 = keras.layers.Conv2D(filters= 64, kernel_size= [11, 11], strides= [1, 1], activation= keras.activations.relu, use_bias= True, padding= 'same')(inputs)# Define the pooling layer 1pooling1 = keras.layers.AveragePooling2D(pool_size= [2, 2], strides= [2, 2], padding= 'valid')(conv1)# Define the standardization layer 1stand1 = keras.layers.BatchNormalization(axis= 1)(pooling1) # Define the converlutional layer 2conv2 = keras.layers.Conv2D(filters= 192, kernel_size= [5, 5], strides= [1, 1], activation= keras.activations.relu, use_bias= True, padding= 'same')(stand1)# Defien the pooling layer 2pooling2 = keras.layers.AveragePooling2D(pool_size= [2, 2], strides= [2, 2], padding= 'valid')(conv2)# Define the standardization layer 2stand2 = keras.layers.BatchNormalization(axis= 1)(pooling2) # Define the converlutional layer 3conv3 = keras.layers.Conv2D(filters= 384, kernel_size= [3, 3], strides= [1, 1], activation= keras.activations.relu, use_bias= True, padding= 'same')(stand2)stand3 = keras.layers.BatchNormalization(axis=1)(conv3) # Define the converlutional layer 4conv4 = keras.layers.Conv2D(filters= 384, kernel_size= [3, 3], strides= [1, 1], activation= keras.activations.relu, use_bias= True, padding= 'same')(stand3)stand4 = keras.layers.BatchNormalization(axis=1)(conv4) # Define the converlutional layer 5conv5 = keras.layers.Conv2D(filters= 256, kernel_size= [3, 3], strides= [1, 1], activation= keras.activations.relu, use_bias= True, padding= 'same')(stand4)pooling5 = keras.layers.AveragePooling2D(pool_size= [2, 2], strides= [2, 2], padding= 'valid')(conv5)stand5 = keras.layers.BatchNormalization(axis=1)(pooling5) # Define the fully connected layerflatten = keras.layers.Flatten()(stand5)fc1 = keras.layers.Dense(4096, activation= keras.activations.relu, use_bias= True)(flatten)drop1 = keras.layers.Dropout(0.5)(fc1) fc2 = keras.layers.Dense(4096, activation= keras.activations.relu, use_bias= True)(drop1)drop2 = keras.layers.Dropout(0.5)(fc2) fc3 = keras.layers.Dense(10, activation= keras.activations.softmax, use_bias= True)(drop2) # 基于Model方法构建模型model = keras.Model(inputs= inputs, outputs = fc3)# 编译模型model.compile(optimizer= tf.train.AdamOptimizer(0.001), loss= keras.losses.categorical_crossentropy, metrics= ['accuracy'])# 训练配置,仅供参考model.fit(x_train, y_train, batch_size= batch_size, epochs= epochs, validation_data=(x_test,y_test))
看完上述内容,是不是对Keras如何使用ImageNet上预训练的模型有进一步的了解,如果还想学习更多内容,欢迎关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。