时间:2021-05-22
我就废话不多说了,大家还是直接看代码吧!
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数据的目录
这里面要注意的是,两种接口拿到的数据形式是不一样的。 从网上直接下载下来的数据 其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上预训练的模型方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
对于使用已经训练好的模型,比如VGG,RESNET等,keras都自带了一个keras.applications.imagenet_utils.decode_p
keras模块里面为我们提供了一个预训练好的模型,也就是开箱即可使用的图像识别模型趁着国庆假期有时间我们就来看看这个预训练模型如何使用吧可用的模型有哪些?根据官
本文主要介绍通过预训练的ImageNet模型实现图像分类,主要使用到的网络结构有:VGG16、InceptionV3、ResNet50、MobileNet。代码
问题keras使用预训练模型vgg16分类,损失和准确度不变。细节:使用keras训练一个两类数据,正负比例1:3,在vgg16后添加了几个全链接并初始化了。并
模型经过训练测试之后,我们往往用一两张图对模型预测结果进行分析讨论,那么下面介绍在keras中用已训练的模型经过测试的方法。下面是以利用预训练的ResNet来展