python实现卷积神经网络vgg16_keras实现VGG16方式(预测一张图片)

我就废话不多说了,大家还是直接看代码吧~

from keras.applications.vgg16 import VGG16#直接导入已经训练好的VGG16网络

from keras.preprocessing.image import load_img#load_image作用是载入图片

from keras.preprocessing.image import img_to_array

from keras.applications.vgg16 import preprocess_input

from keras.applications.vgg16 import decode_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, and channels。由于我们仅有一个 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())

from keras.models import Sequential

from keras.layers.core import Flatten,Dense,Dropout

from keras.layers.convolutional import Convolution2D,MaxPooling2D,ZeroPadding2D

from keras.optimizers import SGD

import numpy as np

from keras.preprocessing import image

from keras.applications.imagenet_utils import preprocess_input, decode_predictions

import time

from keras import backend as K

K.set_image_dim_ordering('th')

def VGG_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'))

if weights_path:

model.load_weights(weights_path,by_name=True)

return model

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模型

from keras.applications.vgg16 import VGG16

print('Start build VGG16 -------')

# 获取vgg16的卷积部分,如果要获取整个vgg16网络需要设置:include_top=True

model_vgg16_conv = VGG16(weights='imagenet', include_top=False)

model_vgg16_conv.summary()

# 创建自己的输入格式

# if K.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('\nThis is my vgg16 model for the task')

my_model.summary()

以上这篇keras实现VGG16方式(预测一张图片)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持python博客。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值