keras实现VGG16方式(预测一张图片)
我就废话不多说了,大家还是直接看代码吧~
fromkeras.applications.vgg16importVGG16#直接导入已经训练好的VGG16网络
fromkeras.preprocessing.imageimportload_img#load_image作用是载入图片
fromkeras.preprocessing.imageimportimg_to_array
fromkeras.applications.vgg16importpreprocess_input
fromkeras.applications.vgg16importdecode_predictions
model=VGG16()
image=load_img('D:\\photo\\dog.jpg',target_size=(224,224))#参数target_size用于设置目标的大小,如此一来无论载入的原图像大小如何,都会被标准化成统一的大小,这样做是为了向神经网络中方便地输入数据所需的。
image=img_to_array(image)#函数img_to_array会把图像中的像素数据转化成NumPy中的array,这样数据才可以被Keras所使用。
#神经网络接收一张或多张图像作为输入,也就是说,输入的array需要有4个维度:samples,rows,columns,andchannels。由于我们仅有一个sample(即一张image),我们需要对这个array进行reshape操作。
image=image.reshape((1,image.shape[0],image.shape[1],image.shape[2]))
image=preprocess_input(image)#对图像进行预处理
y=model.predict(image)#预测图像的类别
label=decode_predictions(y)#Keras提供了一个函数decode_predictions(),用以对已经得到的预测向量进行解读。该函数返回一个类别列表,以及类别中每个类别的预测概率,
label=label[0][0]
print('%s(%.2f%%)'%(label[1],label[2]*100))
#print(model.summary())
fromkeras.modelsimportSequential
fromkeras.layers.coreimportFlatten,Dense,Dropout
fromkeras.layers.convolutionalimportConvolution2D,MaxPooling2D,ZeroPadding2D
fromkeras.optimizersimportSGD
importnumpyasnp
fromkeras.preprocessingimportimage
fromkeras.applications.imagenet_utilsimportpreprocess_input,decode_predictions
importtime
fromkerasimportbackendasK
K.set_image_dim_ordering('th')
defVGG_16(weights_path=None):
model=Sequential()
model.add(ZeroPadding2D((1,1),input_shape=(3,224,224)))
model.add(Convolution2D(64,(3,3),activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(64,(3,3),activation='relu'))
model.add(MaxPooling2D((2,2),strides=(2,2)))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(128,(3,3),activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(128,(3,3),activation='relu'))
model.add(MaxPooling2D((2,2),strides=(2,2)))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(256,(3,3),activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(256,(3,3),activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(256,(3,3),activation='relu'))
model.add(MaxPooling2D((2,2),strides=(2,2)))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512,(3,3),activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512,(3,3),activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512,(3,3),activation='relu'))
model.add(MaxPooling2D((2,2),strides=(2,2)))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512,(3,3),activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512,(3,3),activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512,(3,3),activation='relu'))
model.add(MaxPooling2D((2,2),strides=(2,2)))
model.add(Flatten())
model.add(Dense(4096,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1000,activation='softmax'))
ifweights_path:
model.load_weights(weights_path,by_name=True)
returnmodel
model=VGG_16(weights_path='F:\\Kaggle\\vgg16_weights.h5')
sgd=SGD(lr=0.1,decay=1e-6,momentum=0.9,nesterov=True)
model.compile(optimizer=sgd,loss='categorical_crossentropy')
t0=time.time()
img=image.load_img('D:\\photo\\dog.jpg',target_size=(224,224))
x=image.img_to_array(img)#三维(224,224,3)
x=np.expand_dims(x,axis=0)#四维(1,224,224,3)#因为keras要求的维度是这样的,所以要增加一个维度
x=preprocess_input(x)#预处理
print(x.shape)
y_pred=model.predict(x)#预测概率
t1=time.time()
print("测试图:",decode_predictions(y_pred))#输出五个最高概率(类名,语义概念,预测概率)
print("耗时:",str((t1-t0)*1000),"ms")
这是两种不同的方式,第一种是直接使用vgg16的参数,需要在运行时下载,第二种是我们已经下载好的权重,直接在参数中输入我们的路径即可。
补充知识:keras加经典网络的预训练模型(以VGG16为例)
我就废话不多说了,大家还是直接看代码吧~
#使用VGG16模型
fromkeras.applications.vgg16importVGG16
print('StartbuildVGG16-------')
#获取vgg16的卷积部分,如果要获取整个vgg16网络需要设置:include_top=True
model_vgg16_conv=VGG16(weights='imagenet',include_top=False)
model_vgg16_conv.summary()
#创建自己的输入格式
#ifK.image_data_format()=='channels_first':
#input_shape=(3,img_width,img_height)
#else:
#input_shape=(img_width,img_height,3)
input=Input(input_shape,name='image_input')#注意,Keras有个层就是Input层
#将vgg16模型原始输入转换成自己的输入
output_vgg16_conv=model_vgg16_conv(input)
#output_vgg16_conv是包含了vgg16的卷积层,下面我需要做二分类任务,所以需要添加自己的全连接层
x=Flatten(name='flatten')(output_vgg16_conv)
x=Dense(4096,activation='relu',name='fc1')(x)
x=Dense(512,activation='relu',name='fc2')(x)
x=Dense(128,activation='relu',name='fc3')(x)
x=Dense(1,activation='softmax',name='predictions')(x)
#最终创建出自己的vgg16模型
my_model=Model(input=input,output=x)
#下面的模型输出中,vgg16的层和参数不会显示出,但是这些参数在训练的时候会更改
print('\nThisismyvgg16modelforthetask')
my_model.summary()
以上这篇keras实现VGG16方式(预测一张图片)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。