#-------------------------------------------------------------# # resnet50的网络部分 #-------------------------------------------------------------# from __future__ import print_function import numpy as np from keras import layers from keras.layers import input from keras.layers import dense,conv2d,maxpooling2d,zeropadding2d,averagepooling2d from keras.layers import activation,batchnormalization,flatten from keras.models import model from keras.preprocessing import image import keras.backend as k from keras.utils.data_utils import get_file from keras.applications.imagenet_utils import decode_predictions from keras.applications.imagenet_utils import preprocess_input def identity_block(input_tensor, kernel_size, filters, stage, block): filters1, filters2, filters3 = filters conv_name_base = 'res' + str(stage) + block + '_branch' bn_name_base = 'bn' + str(stage) + block + '_branch' x = conv2d(filters1, (1, 1), name=conv_name_base + '2a')(input_tensor) x = batchnormalization(name=bn_name_base + '2a')(x) x = activation('relu')(x) x = conv2d(filters2, kernel_size,padding='same', name=conv_name_base + '2b')(x) x = batchnormalization(name=bn_name_base + '2b')(x) x = activation('relu')(x) x = conv2d(filters3, (1, 1), name=conv_name_base + '2c')(x) x = batchnormalization(name=bn_name_base + '2c')(x) x = layers.add([x, input_tensor]) x = activation('relu')(x) return x def conv_block(input_tensor, kernel_size, filters, stage, block, strides=(2, 2)): filters1, filters2, filters3 = filters conv_name_base = 'res' + str(stage) + block + '_branch' bn_name_base = 'bn' + str(stage) + block + '_branch' x = conv2d(filters1, (1, 1), strides=strides, name=conv_name_base + '2a')(input_tensor) x = batchnormalization(name=bn_name_base + '2a')(x) x = activation('relu')(x) x = conv2d(filters2, kernel_size, padding='same', name=conv_name_base + '2b')(x) x = batchnormalization(name=bn_name_base + '2b')(x) x = activation('relu')(x) x = conv2d(filters3, (1, 1), name=conv_name_base + '2c')(x) x = batchnormalization(name=bn_name_base + '2c')(x) shortcut = conv2d(filters3, (1, 1), strides=strides, name=conv_name_base + '1')(input_tensor) shortcut = batchnormalization(name=bn_name_base + '1')(shortcut) x = layers.add([x, shortcut]) x = activation('relu')(x) return x def resnet50(input_shape=[224,224,3],classes=1000): img_input = input(shape=input_shape) x = zeropadding2d((3, 3))(img_input) x = conv2d(64, (7, 7), strides=(2, 2), name='conv1')(x) x = batchnormalization(name='bn_conv1')(x) x = activation('relu')(x) x = maxpooling2d((3, 3), strides=(2, 2))(x) x = conv_block(x, 3, [64, 64, 256], stage=2, block='a', strides=(1, 1)) x = identity_block(x, 3, [64, 64, 256], stage=2, block='b') x = identity_block(x, 3, [64, 64, 256], stage=2, block='c') x = conv_block(x, 3, [128, 128, 512], stage=3, block='a') x = identity_block(x, 3, [128, 128, 512], stage=3, block='b') x = identity_block(x, 3, [128, 128, 512], stage=3, block='c') x = identity_block(x, 3, [128, 128, 512], stage=3, block='d') x = conv_block(x, 3, [256, 256, 1024], stage=4, block='a') x = identity_block(x, 3, [256, 256, 1024], stage=4, block='b') x = identity_block(x, 3, [256, 256, 1024], stage=4, block='c') x = identity_block(x, 3, [256, 256, 1024], stage=4, block='d') x = identity_block(x, 3, [256, 256, 1024], stage=4, block='e') x = identity_block(x, 3, [256, 256, 1024], stage=4, block='f') x = conv_block(x, 3, [512, 512, 2048], stage=5, block='a') x = identity_block(x, 3, [512, 512, 2048], stage=5, block='b') x = identity_block(x, 3, [512, 512, 2048], stage=5, block='c') x = averagepooling2d((7, 7), name='avg_pool')(x) x = flatten()(x) x = dense(classes, activation='softmax', name='fc1000')(x) model = model(img_input, x, name='resnet50') model.load_weights("resnet50_weights_tf_dim_ordering_tf_kernels.h5") return model
预测所需的已经训练好的resnet50模型可以在https://github.com/fchollet/deep-learning-models/releases下载。非常方便。
预测结果为: