理論參考:https://blog.csdn.net/weixin_43624538/article/details/85049699
代碼:https://blog.csdn.net/u013093426/article/details/81166751
整體架構圖:
其中ID block x3表示該模塊是由3個Identity塊堆疊構成,該模型各層參數設置如下:
Zero-Padding: P = (3, 3)
Stage 1:
Conv2D:64個fileter, f = (7,7),strides = (2,2),name=conv1
BatchNorm:對channel標準化
MaxPooling: f = (3, 3), strides = (2, 2)
Stage 2:
Convolution block:filter = 3,size = [64,64,256], f = 3, s = 1, block = a
ID block 2x:filter = 3, size = [64,64,256], f = 3, block = b, c
Stage 3:
Convolution block:filter = 3,size = [128, 128, 512], f = 3, s = 2, block = a
ID block 3x:filter = 3, size = [128, 128, 512], f = 3, block = b, c,d
Stage 4:
Convolution block:filter = 3,size = [256, 256, 1024], f = 3, s = 2, block = a
ID block 5x:filter = 3, size = [256, 256, 1024], f = 3, block = b, c,d,e,f
Stage 5:
Convolution block:filter = 3,size = [512, 512, 2048], f = 3, s = 2, block = a
ID block 2x:filter = 3, size = [512, 512, 2048], f = 3, block = b, c
AveragePooling: f = (2, 2), name = "avg_pool"
Flatten:None
FC: softmax, name = 'fc' + str(classes)
————————————————
原文鏈接:https://blog.csdn.net/u013093426/article/details/81166751
import numpy as np
from keras.layers import Input, Add, Dense, Activation, ZeroPadding2D, BatchNormalization, Flatten, Conv2D, AveragePooling2D, MaxPooling2D, GlobalMaxPooling2D
from keras.models import Model, load_model
import tensorflow as tf
from keras.initializers import glorot_uniform
import keras.backend as K
K.set_image_data_format('channels_last')
K.set_learning_phase(1)
def identity_block(X, f, filters, stage, block):
conv_name_base = 'res' + str(stage) + block + '_branch'
bn_name_base = 'bn' + str(stage) + block + '_branch'
F1, F2, F3 = filters
X_shortcut = X
X = Conv2D(filters=F1, kernel_size=(1, 1), strides=(1, 1), padding='valid', name=conv_name_base + '2a',
kernel_initializer=glorot_uniform(seed=0))(X)
X = BatchNormalization(axis=3, name=bn_name_base + '2a')(X)
X = Activation('relu')(X)
X = Conv2D(filters=F2, kernel_size=(f, f), strides=(1, 1), padding='same', name=conv_name_base + '2b',
kernel_initializer=glorot_uniform(seed=0))(X)
X = BatchNormalization(axis=3, name=bn_name_base + '2b')(X)
X = Activation('relu')(X)
X = Conv2D(filters=F3, kernel_size=(1, 1), strides=(1, 1), padding='valid', name=conv_name_base + '2c',
kernel_initializer=glorot_uniform(seed=0))(X)
X = BatchNormalization(axis=3, name=bn_name_base + '2c')(X)
X = Add()([X, X_shortcut])
X = Activation('relu')(X)
return X
def convolutional_block(X, f, filters, stage, block, s=2):
conv_name_base = 'res' + str(stage) + block + '_branch'
bn_name_base = 'bn' + str(stage) + block + '_branch'
F1, F2, F3 = filters
X_shortcut = X
X = Conv2D(filters=F1, kernel_size=(1, 1), strides=(s, s), name=conv_name_base + '2a',
kernel_initializer=glorot_uniform(seed=0))(X)
X = BatchNormalization(axis=3, name=bn_name_base + '2a')(X)
X = Activation('relu')(X)
X = Conv2D(filters=F2, kernel_size=(f, f), strides=(1, 1), padding='same', name=conv_name_base + '2b',
kernel_initializer=glorot_uniform(seed=0))(X)
X = BatchNormalization(axis=3, name=bn_name_base + '2b')(X)
X = Activation('relu')(X)
X = Conv2D(filters=F3, kernel_size=(1, 1), strides=(1, 1), name=conv_name_base + '2c',
kernel_initializer=glorot_uniform(seed=0))(X)
X = BatchNormalization(axis=3, name=bn_name_base + '2c')(X)
X_shortcut = Conv2D(F3, (1, 1), strides=(s, s), name=conv_name_base + '1',
kernel_initializer=glorot_uniform(seed=0))(X_shortcut)
X_shortcut = BatchNormalization(axis=3, name=bn_name_base + '1')(X_shortcut)
X = Add()([X, X_shortcut])
X = Activation('relu')(X)
return X
tf.reset_default_graph()
def ResNet50(input_shape=(64, 64, 3), classes=10):
X_input = Input(input_shape)
X = ZeroPadding2D((3, 3))(X_input)
X = Conv2D(64, (7, 7), strides=(2, 2), name='conv1', kernel_initializer=glorot_uniform(seed=0))(X)
X = BatchNormalization(axis=3, name='bn_conv1')(X)
X = Activation('relu')(X)
X = MaxPooling2D((3, 3), strides=(2, 2))(X)
X = convolutional_block(X, f=3, filters=[64, 64, 256], stage=2, block='a', s=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 = convolutional_block(X, f=3, filters=[128, 128, 512], stage=3, block='a', s=2)
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 = convolutional_block(X, f=3, filters=[256, 256, 1024], stage=4, block='a', s=2)
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 = convolutional_block(X, f=3, filters=[512, 512, 2048], stage=5, block='a', s=2)
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((2, 2), name='avg_pool')(X)
X = Flatten()(X)
X = Dense(classes, activation='softmax', name='fc' + str(classes), kernel_initializer=glorot_uniform(seed=0))(X)
model = Model(inputs=X_input, outputs=X, name='ResNet50')
return model
import pickle
import PIL
from PIL import Image
from sklearn.model_selection import train_test_split
def load_file(filename):
with open(filename, 'rb') as fo:
data = pickle.load(fo, encoding='latin1')
return data
n_size = 3000
def get_data():
data = load_file('test_batch')
img = data['data']
img = np.reshape(img, (-1, 3, 32, 32 )) # 只是測試,沒有采用循環導出全部圖像,這裏導出第10幅圖
imgs = np.zeros((n_size,64,64,3))
for i in range(n_size):
r = img[i][0]
g = img[i][1]
b = img[i][2]
ir = Image.fromarray(r)
ig = Image.fromarray(g)
ib = Image.fromarray(b)
temp = Image.merge("RGB", (ir, ig, ib))
temp = temp.resize((64,64))
imgs[i] = temp
imgs = imgs.astype(np.int)
labels = np.zeros((n_size,10))
for i, lb in enumerate(data['labels'][:n_size]):
labels[i][lb] = 1
return imgs,labels