keras搬砖系列-vgg16进行分类
2018-01-11 23:04
323 查看
keras搬砖系列-vgg16进行分类
表头:import time from keras.applications.imagenet_utils import preprocess_input, decode_predictions from keras.layers import Dropout, Flatten, Dense from keras.layers.convolutional import Convolution2D,MaxPooling2D from keras.models import Sequential from keras.preprocessing import image from keras import backend as K K.set_image_data_format('channels_first') import numpy as np导入数据:
t0 = time.time() height,width = 224,224 img_path = 'cat.jpg' img = image.load_img(img_path,target_size=(224,224)) x = image.img_to_array(img) x = np.expand_dims(x,axis=0) x = preprocess_input(x)将导入的图片变为224,224大小,然后将三维的图片变为四维的图片。
print("开始建模CNN ...") model = Sequential() # Block 1, 2层 model.add(Convolution2D(64, 3, 3, activation='relu', border_mode='same', input_shape=(3,height, width))) model.add(Convolution2D(64, 3, 3, activation='relu',border_mode='same')) model.add(MaxPooling2D((2, 2), strides=(2, 2))) # Block 2, 2层 model.add(Convolution2D(128, 3, 3, activation='relu',border_mode='same')) model.add(Convolution2D(128, 3, 3, activation='relu',border_mode='same')) model.add(MaxPooling2D((2, 2), strides=(2, 2))) # Block 3, 3层 model.add(Convolution2D(256, 3, 3, activation='relu',border_mode='same')) model.add(Convolution2D(256, 3, 3, activation='relu',border_mode='same')) model.add(Convolution2D(256, 3, 3, activation='relu',border_mode='same')) model.add(MaxPooling2D((2, 2), strides=(2, 2))) # Block 4, 3层 model.add(Convolution2D(512, 3, 3, activation='relu',border_mode='same')) model.add(Convolution2D(512, 3, 3, activation='relu',border_mode='same')) model.add(Convolution2D(512, 3, 3, activation='relu',border_mode='same')) model.add(MaxPooling2D((2, 2), strides=(2, 2))) # Block 5, 3层 model.add(Convolution2D(512, 3, 3, activation='relu',border_mode='same')) model.add(Convolution2D(512, 3, 3, activation='relu',border_mode='same')) model.add(Convolution2D(512, 3, 3, activation='relu',border_mode='same')) model.add(MaxPooling2D((2, 2), strides=(2, 2))) # Classification block, 全连接3层 model.add(Flatten()) model.add(Dense(2000, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(2000, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(1000, activation='softmax')) model.load_weights('vgg16_weights_th_dim_ordering_th_kernels.h5') print("建模CNN完成 ...")构建VGG-16模型,并且导入权重,记住,如果你是theano就导入theano的权重,否则就导入tensorflow的权重。
然后进行预测:
y_pred = model.predict(x) print(img_path,decode_predictions(y_pred)) print(decode_predictions(y_pred)[0][0][1])其中
print(img_path,decode_predictions(y_pred))表示预测出其中的前5类概率。
print(decode_predictions(y_pred)[0][0][1])表示预测的最大概率,中间还会自动下载一个json文件。
完整代码:
import time from keras.applications.imagenet_utils import preprocess_input, decode_predictions from keras.layers import Dropout, Flatten, Dense from keras.layers.convolutional import Convolution2D,MaxPooling2D from keras.models import Sequential from keras.preprocessing import image from keras import backend as K K.set_image_data_format('channels_first') import numpy as np
t0 = time.time()
height, width = 224, 224
img_path = 'cat.jpg'
img = image.load_img(img_path, target_size=(224, 224)) # 224×224
x = image.img_to_array(img) # 三维(3, 224,224)
x = np.expand_dims(x, axis=0) # 四维(1, 3,224, 224)
x = preprocess_input(x) # 预处理
print("训练样例:", x.shape)
print("取数据耗时: %.2f seconds ..." % (time.time() -t0))
print("开始建模CNN ...") model = Sequential() # Block 1, 2层 model.add(Convolution2D(64, 3, 3, activation='relu', border_mode='same', input_shape=(3,height, width))) model.add(Convolution2D(64, 3, 3, activation='relu',border_mode='same')) model.add(MaxPooling2D((2, 2), strides=(2, 2))) # Block 2, 2层 model.add(Convolution2D(128, 3, 3, activation='relu',border_mode='same')) model.add(Convolution2D(128, 3, 3, activation='relu',border_mode='same')) model.add(MaxPooling2D((2, 2), strides=(2, 2))) # Block 3, 3层 model.add(Convolution2D(256, 3, 3, activation='relu',border_mode='same')) model.add(Convolution2D(256, 3, 3, activation='relu',border_mode='same')) model.add(Convolution2D(256, 3, 3, activation='relu',border_mode='same')) model.add(MaxPooling2D((2, 2), strides=(2, 2))) # Block 4, 3层 model.add(Convolution2D(512, 3, 3, activation='relu',border_mode='same')) model.add(Convolution2D(512, 3, 3, activation='relu',border_mode='same')) model.add(Convolution2D(512, 3, 3, activation='relu',border_mode='same')) model.add(MaxPooling2D((2, 2), strides=(2, 2))) # Block 5, 3层 model.add(Convolution2D(512, 3, 3, activation='relu',border_mode='same')) model.add(Convolution2D(512, 3, 3, activation='relu',border_mode='same')) model.add(Convolution2D(512, 3, 3, activation='relu',border_mode='same')) model.add(MaxPooling2D((2, 2), strides=(2, 2))) # Classification block, 全连接3层 model.add(Flatten()) model.add(Dense(2000, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(2000, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(1000, activation='softmax')) model.load_weights('vgg16_weights_th_dim_ordering_th_kernels.h5') print("建模CNN完成 ...")
y_pred = model.predict(x)
print('预测%s (类名, 语义概念, 预测概率) = %s' % (img_path,decode_predictions(y_pred))) #前五个
print('类预测:', decode_predictions(y_pred)[0][0][1])#概率最大类
print("耗时: %.2f seconds【徐海蛟博士】 ..." % (time.time() -t0))
相关文章推荐
- keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
- keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
- keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
- keras搬砖系列-细读GoogleNet
- keras搬砖系列-keras多输入多输出模型
- keras搬砖系列-BN层
- keras搬砖系列-正则化
- caffe+python 使用训练好的VGG16模型 对 单张图片进行分类,输出置信度
- keras搬砖系列-inception-resnet-v2实现
- Keras(2):使用Keras构建神经网络进行Mnist手写字体分类,并定性分析各种超参数的影响
- keras搬砖系列-正则项
- keras系列︱迁移学习:利用InceptionV3进行fine-tuning及预测、完美案例(五)
- keras搬砖系列-VGG19
- keras 搬砖系列-自编码器
- keras搬砖系列-Flatten ValueError
- keras用vgg16做图像分类
- keras实现Unet进行字符定位与识别分类
- Caffe学习系列(20):用训练好的caffemodel来进行分类
- keras搬砖系列-迁移学习与微调
- keras搬砖系列-inception v2与v3