您的位置:首页 > 其它

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))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: