Ai_bone_age_prediction / inception_v3_cbam_arch.py
Nabeen's picture
file updated
2f8b452 verified
raw
history blame contribute delete
No virus
6.32 kB
#importing libraries
from keras.models import Model
from keras.layers import Input
from keras.layers import MaxPooling2D
from keras.utils import plot_model
from keras.layers import BatchNormalization
from keras.layers import AveragePooling2D
import tensorflow as tf
from keras.layers import GlobalAveragePooling2D, GlobalMaxPooling2D, Reshape, Dense, Input
from keras.layers import Activation, Concatenate, Conv2D, Multiply
Img_input = Input(shape= (299,299,3))
channel_axis = 3
# In inception v3 architecture, Every convolutin layer had batch normalization and relu activation function
def conv2d_bn(x, filters, num_row, num_col, padding='same', strides=(1,1)):
x=Conv2D(filters, (num_row, num_col), strides=strides, padding=padding)(x)
x=BatchNormalization(axis=3, scale=False)(x)
x=Activation('relu')(x)
return x
#Inception Block-A
def inc_block_a(x):
branch1x1 = conv2d_bn(x,64,1,1)
branch3x3 = conv2d_bn(x,48,1,1)
branch3x3 = conv2d_bn(branch3x3,64,3,3)
branch3x3db1 = conv2d_bn(x,64,1,1)
branch3x3db1 = conv2d_bn(branch3x3db1,96,3,3)
branch3x3db1 = conv2d_bn(branch3x3db1,96,3,3)
branch_pool = AveragePooling2D((3,3), strides=(1,1), padding='same')(x)
branch_pool = conv2d_bn(branch_pool,32,1,1)
x = Concatenate(axis= channel_axis)([branch1x1,branch3x3,branch3x3db1,branch_pool])
return x
#Reduction Block-A
def reduction_block_a(x):
branch3x3 = conv2d_bn(x,384,3,3,strides=(2,2),padding='valid')
branch3x3db1 = conv2d_bn(x,64,1,1)
branch3x3db1 = conv2d_bn(branch3x3db1,96,3,3)
branch3x3db1 = conv2d_bn(branch3x3db1, 96,3,3,strides=(2,2),padding='valid')
branch_pool = MaxPooling2D((3,3),strides=(2,2))(x)
x=Concatenate(axis=channel_axis)([branch3x3,branch3x3db1,branch_pool])
return x
#Inception Block-B
def inc_block_b(x):
branch1x1 = conv2d_bn(x,192,1,1)
branch7x7 = conv2d_bn(x,128,1,1)
branch7x7 = conv2d_bn(branch7x7,128,1,7)
branch7x7 = conv2d_bn(branch7x7,192,7,1)
branch7x7db1 = conv2d_bn(x,128,1,1)
branch7x7db1 = conv2d_bn(branch7x7db1,128,7,1)
branch7x7db1 = conv2d_bn(branch7x7db1,128,1,7)
branch7x7db1 = conv2d_bn(branch7x7db1,128,7,1)
branch7x7db1 = conv2d_bn(branch7x7db1,192,1,7)
branch_pool = AveragePooling2D((3,3),strides=(1,1),padding='same')(x)
branch_pool = conv2d_bn(branch_pool,192,1,1)
x = Concatenate(axis = channel_axis)([branch1x1,branch7x7,branch7x7db1,branch_pool])
return x
#Reduction Block-B
def reduction_block_b(x):
branch3x3 = conv2d_bn(x,192,1,1)
branch3x3 = conv2d_bn(branch3x3, 320,3,3,strides=(2,2),padding='valid')
branch7x7x3 = conv2d_bn(x,192,1,1)
branch7x7x3 = conv2d_bn(branch7x7x3,192,1,7)
branch7x7x3 = conv2d_bn(branch7x7x3,192,7,1)
branch7x7x3 = conv2d_bn(branch7x7x3,192,3,3,strides=(2,2),padding='valid')
branch_pool = MaxPooling2D((3,3),strides=(2,2))(x)
x = Concatenate( axis=channel_axis)([branch3x3,branch7x7x3,branch_pool])
return x
#Inception Block-C
def inc_block_c(x):
branch1x1 = conv2d_bn(x,320,1,1)
branch3x3 = conv2d_bn(x,384,1,1)
branch3x3_1 = conv2d_bn(branch3x3,384,1,3)
branch3x3_2 = conv2d_bn(branch3x3,384,3,1)
branch3x3 = Concatenate(axis=channel_axis)([branch3x3_1,branch3x3_2])
branch3x3db1 = conv2d_bn(x,448,1,1)
branch3x3db1 = conv2d_bn(branch3x3db1,384,3,3)
branch3x3db1_1 = conv2d_bn(branch3x3db1,384,1,3)
branch3x3db1_2 = conv2d_bn(branch3x3db1,384,3,1)
branch3x3db1 = Concatenate(axis= channel_axis)([branch3x3db1_1,branch3x3db1_2])
branch_pool = AveragePooling2D((3,3),strides=(1,1),padding='same')(x)
branch_pool = conv2d_bn(branch_pool,192,1,1)
x= Concatenate(axis=channel_axis)([branch1x1, branch3x3, branch3x3db1,branch_pool])
return x
# Channel Attention Module
# Channel Attention Module
def channel_attention_module(x, ratio=8):
batch,_,_,channel=x.shape
# shared layers
l1 = Dense(channel//ratio, activation="relu", use_bias=False)
l2 = Dense(channel, use_bias= False)
x1 = GlobalAveragePooling2D()(x)
x1 = l1(x1)
x1 = l2(x1)
x2 = GlobalMaxPooling2D()(x)
x2 = l1(x2)
x2 = l2(x2)
feats = x1 + x2
feats = Activation("sigmoid")(feats)
feats = Multiply()([x,feats])
return feats
# Spatial Attention Module
# spatical attention module
def spatial_attention_module(x):
# Average Pooling
x1 = tf.reduce_mean(x,axis = -1)
x1 = tf.expand_dims(x1,axis = -1)
# max pooling
x2 = tf.reduce_max(x, axis = -1)
x2 = tf.expand_dims(x2,axis=-1)
feats = Concatenate()([x1,x2])
feats = Conv2D(1,kernel_size=7, padding="same",activation="sigmoid")(feats)
feats = Multiply()([x,feats])
return feats
# CBAM (Convolutional Block Attention Mechanism) Modules
def cbam(x):
x = channel_attention_module(x)
x = spatial_attention_module(x)
return x
# Building model layer by layer integrating CBAM
def inception_cbam_model(Img_input):
x = conv2d_bn(Img_input, 32,3,3,strides=(2,2),padding='valid')
x = conv2d_bn(x,32,3,3,padding='valid')
x = conv2d_bn(x,64,3,3)
x = MaxPooling2D((3,3), strides=(2,2))(x)
x = conv2d_bn(x,80,1,1,padding='valid')
x = conv2d_bn(x,192,3,3,padding='valid')
x=MaxPooling2D((3,3),strides=(2,2))(x)
x = inc_block_a(x)
x = inc_block_a(x)
x = inc_block_a(x)
x = reduction_block_a(x)
x = inc_block_b(x)
x = inc_block_b(x)
x = inc_block_b(x)
x = inc_block_b(x)
x = reduction_block_b(x)
x = inc_block_c(x)
x = inc_block_c(x)
x = AveragePooling2D()(x)
base_model = x
model = cbam(base_model)
# Add additional layers
# model.add(layers.Flatten())
# model.add(layers.Dense(256, activation='relu'))
# model.add(layers.Dropout(0.5))
# model.add(layers.Dense(1, activation='linear')) # regression task for bone age
# create model
inputs = Img_input
model = Model(inputs,model,name='inception_v3')
return model
image_model = inception_cbam_model(Img_input)
print(image_model.summary())
# Compile the model
image_model.compile(optimizer='adam', loss='mean_squared_error', metrics=['mae'])