写在前面:第一次自己看着网络图用代码搭建(记录我的进步哈哈,大佬勿嘲)
----------------------------------------分割线---------------------------------------
一、Google InceptionNet V3结构图
二、利用TensorFlow2.x中集成的Keras搭建InceptionNet V3的源代码
import tensorflow as tf
import numpy as np
import cv2 as cv
from PIL import Image
import matplotlib.pyplot as plt
import os
import random as rd
from tensorflow.keras.layers import Input,Conv2D,BatchNormalization,\
MaxPooling2D,AveragePooling2D,Concatenate,Dense,Flatten,Activation
def build_inception_v3(input_shape=[299,299,3],):
def my_conv2D(last_layer,my_filters=32,my_kernel_size=(3,3),my_stried=2,my_padding='valid'):
x = Conv2D(filters=my_filters,kernel_size=my_kernel_size,strides=my_stried,padding=my_padding)(last_layer)
x = BatchNormalization(scale=False)(x)
x = Activation('relu')(x)
return x
def block1_1(last_layer):
x1_1 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=64,my_stried=1,my_padding='same')
x1_2 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=48,my_stried=1,my_padding='same')
x1_3 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=64,my_stried=1,my_padding='same')
x1_4 = AveragePooling2D(pool_size=(3,3),strides=1,padding='same')(last_layer)
x2_2 = my_conv2D(x1_2,my_kernel_size=(5,5),my_filters=64,my_stried=1,my_padding='same')
x2_3 = my_conv2D(x1_3, my_kernel_size=(3,3), my_filters=96, my_stried=1,my_padding='same')
x2_4 = my_conv2D(x1_4, my_kernel_size=(1,1), my_filters=32, my_stried=1,my_padding='same')
x3_3 = my_conv2D(x2_3, my_kernel_size=(3, 3), my_filters=96, my_stried=1,my_padding='same')
next_layer = Concatenate()([x1_1,x2_2,x3_3,x2_4])
return next_layer
def block1_2(last_layer):
x1_1 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=64,my_stried=1,my_padding='same')
x1_2 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=48,my_stried=1,my_padding='same')
x1_3 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=64,my_stried=1,my_padding='same')
x1_4 = AveragePooling2D(pool_size=(3,3),strides=1,padding='same')(last_layer)
x2_2 = my_conv2D(x1_2,my_kernel_size=(5,5),my_filters=64,my_stried=1,my_padding='same')
x2_3 = my_conv2D(x1_3, my_kernel_size=(3,3), my_filters=96, my_stried=1,my_padding='same')
x2_4 = my_conv2D(x1_4, my_kernel_size=(1,1), my_filters=64, my_stried=1,my_padding='same')
x3_3 = my_conv2D(x2_3, my_kernel_size=(3, 3), my_filters=96, my_stried=1,my_padding='same')
next_layer = Concatenate()([x1_1,x2_2,x3_3,x2_4])
return next_layer
def block1_3(last_layer):
x1_1 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=64,my_stried=1,my_padding='same')
x1_2 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=48,my_stried=1,my_padding='same')
x1_3 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=64,my_stried=1,my_padding='same')
x1_4 = AveragePooling2D(pool_size=(3,3),strides=1,padding='same')(last_layer)
x2_2 = my_conv2D(x1_2,my_kernel_size=(5,5),my_filters=64,my_stried=1,my_padding='same')
x2_3 = my_conv2D(x1_3, my_kernel_size=(3,3), my_filters=96, my_stried=1,my_padding='same')
x2_4 = my_conv2D(x1_4, my_kernel_size=(1,1), my_filters=64, my_stried=1,my_padding='same')
x3_3 = my_conv2D(x2_3, my_kernel_size=(3, 3), my_filters=96, my_stried=1,my_padding='same')
next_layer = Concatenate()([x1_1,x2_2,x3_3,x2_4])
return next_layer
def block2_1(last_layer):
x1_1 = my_conv2D(last_layer,my_kernel_size=(3,3),my_filters=384,my_stried=2)
x1_2 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=48,my_stried=1,my_padding='same')
x1_3 = MaxPooling2D(pool_size=(3,3),strides=2)(last_layer)
x2_2 = my_conv2D(x1_2,my_kernel_size=(3,3),my_filters=64,my_stried=1,my_padding='same')
x3_2 = my_conv2D(x2_2, my_kernel_size=(3, 3), my_filters=96, my_stried=2)
next_layer = Concatenate()([x1_1,x3_2,x1_3])
return next_layer
def block2_2(last_layer):
x1_1 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=192,my_stried=1,my_padding='same')
x1_2 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=128,my_stried=1,my_padding='same')
x1_3 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=128,my_stried=1,my_padding='same')
x1_4 = AveragePooling2D(pool_size=(3,3),strides=1,padding='same')(last_layer)
x2_2 = my_conv2D(x1_2,my_kernel_size=(1,7),my_filters=128,my_stried=1,my_padding='same')
x2_3 = my_conv2D(x1_3, my_kernel_size=(7, 1), my_filters=128, my_stried=1,my_padding='same')
x2_4 = my_conv2D(x1_4, my_kernel_size=(1, 1), my_filters=192, my_stried=1, my_padding='same')
x3_2 = my_conv2D(x2_2, my_kernel_size=(7, 1), my_filters=192, my_stried=1, my_padding='same')
x3_3 = my_conv2D(x2_3, my_kernel_size=(1, 7), my_filters=128, my_stried=1, my_padding='same')
x4_3 = my_conv2D(x3_3, my_kernel_size=(7, 1), my_filters=128, my_stried=1, my_padding='same')
x5_3 = my_conv2D(x4_3, my_kernel_size=(1, 7), my_filters=192, my_stried=1, my_padding='same')
next_layer = Concatenate()([x1_1,x3_2,x5_3,x2_4])
return next_layer
def block2_3_4(last_layer):
x1_1 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=192,my_stried=1,my_padding='same')
x1_2 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=160,my_stried=1,my_padding='same')
x1_3 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=160,my_stried=1,my_padding='same')
x1_4 = AveragePooling2D(pool_size=(3,3),strides=1,padding='same')(last_layer)
x2_2 = my_conv2D(x1_2,my_kernel_size=(1,7),my_filters=160,my_stried=1,my_padding='same')
x2_3 = my_conv2D(x1_3, my_kernel_size=(7, 1), my_filters=160, my_stried=1,my_padding='same')
x2_4 = my_conv2D(x1_4, my_kernel_size=(1, 1), my_filters=192, my_stried=1, my_padding='same')
x3_2 = my_conv2D(x2_2, my_kernel_size=(7, 1), my_filters=192, my_stried=1, my_padding='same')
x3_3 = my_conv2D(x2_3, my_kernel_size=(1, 7), my_filters=160, my_stried=1, my_padding='same')
x4_3 = my_conv2D(x3_3, my_kernel_size=(7, 1), my_filters=160, my_stried=1, my_padding='same')
x5_3 = my_conv2D(x4_3, my_kernel_size=(1, 7), my_filters=192, my_stried=1, my_padding='same')
next_layer = Concatenate()([x1_1,x3_2,x5_3,x2_4])
return next_layer
def block2_5(last_layer):
x1_1 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=192,my_stried=1,my_padding='same')
x1_2 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=192,my_stried=1,my_padding='same')
x1_3 = my_conv2D(last_layer,my_kernel_size=(1,1),my_filters=192,my_stried=1,my_padding='same')
x1_4 = AveragePooling2D(pool_size=(3,3),strides=1,padding='same')(last_layer)
x2_2 = my_conv2D(x1_2,my_kernel_size=(1,7),my_filters=192,my_stried=1,my_padding='same')
x2_3 = my_conv2D(x1_3, my_kernel_size=(7, 1), my_filters=192, my_stried=1,my_padding='same')
x2_4 = my_conv2D(x1_4, my_kernel_size=(1, 1), my_filters=192, my_stried=1, my_padding='same')
x3_2 = my_conv2D(x2_2, my_kernel_size=(7, 1), my_filters=192, my_stried=1, my_padding='same')
x3_3 = my_conv2D(x2_3, my_kernel_size=(1, 7), my_filters=192, my_stried=1, my_padding='same')
x4_3 = my_conv2D(x3_3, my_kernel_size=(7, 1), my_filters=192, my_stried=1, my_padding='same')
x5_3 = my_conv2D(x4_3, my_kernel_size=(1, 7), my_filters=192, my_stried=1, my_padding='same')
next_layer = Concatenate()([x1_1,x3_2,x5_3,x2_4])
return next_layer
def block3_1(last_layer):
x1_1 = my_conv2D(last_layer, my_kernel_size=(1, 1), my_filters=192, my_stried=1, my_padding='same')
x1_2 = my_conv2D(last_layer, my_kernel_size=(1, 1), my_filters=192, my_stried=1, my_padding='same')
x1_3 = MaxPooling2D(pool_size=(3,3),strides=2)(last_layer)
x2_1 = my_conv2D(x1_1, my_kernel_size=(3, 3), my_filters=320, my_stried=2)
x2_2 = my_conv2D(x1_2, my_kernel_size=(1, 7), my_filters=192, my_stried=1, my_padding='same')
x3_2 = my_conv2D(x2_2, my_kernel_size=(7, 1), my_filters=192, my_stried=1, my_padding='same')
x4_2 = my_conv2D(x3_2, my_kernel_size=(3, 3), my_filters=192, my_stried=2)
next_layer = Concatenate()([x2_1, x4_2, x1_3])
return next_layer
def block3_2(last_layer):
x1_1 = my_conv2D(last_layer, my_kernel_size=(1, 1), my_filters=320, my_stried=1, my_padding='same')
x1_2 = my_conv2D(last_layer, my_kernel_size=(1, 1), my_filters=320, my_stried=1, my_padding='same')
x1_3 = my_conv2D(last_layer, my_kernel_size=(1, 1), my_filters=320, my_stried=1, my_padding='same')
x1_4 = AveragePooling2D(pool_size=(3, 3), strides=1, padding='same')(last_layer)
x2_2_1 = my_conv2D(x1_2, my_kernel_size=(1, 3), my_filters=384, my_stried=1, my_padding='same')
x2_2_2 = my_conv2D(x1_2, my_kernel_size=(3, 1), my_filters=384, my_stried=1, my_padding='same')
x2_3 = my_conv2D(x1_3, my_kernel_size=(3, 3), my_filters=384, my_stried=1, my_padding='same')
x2_4 = my_conv2D(x1_4, my_kernel_size=(1, 1), my_filters=192, my_stried=1, my_padding='same')
x3_2 = Concatenate()([x2_2_1, x2_2_2])
x3_3_1 = my_conv2D(x2_3, my_kernel_size=(1, 3), my_filters=384, my_stried=1, my_padding='same')
x3_3_2 = my_conv2D(x2_3, my_kernel_size=(3, 1), my_filters=384, my_stried=1, my_padding='same')
x4_3 = Concatenate()([x3_3_1, x3_3_2])
next_layer = Concatenate()([x1_1,x3_2, x4_3, x2_4])
return next_layer
def block3_3(last_layer):
x1_1 = my_conv2D(last_layer, my_kernel_size=(1, 1), my_filters=320, my_stried=1, my_padding='same')
x1_2 = my_conv2D(last_layer, my_kernel_size=(1, 1), my_filters=384, my_stried=1, my_padding='same')
x1_3 = my_conv2D(last_layer, my_kernel_size=(1, 1), my_filters=448, my_stried=1, my_padding='same')
x1_4 = AveragePooling2D(pool_size=(3, 3), strides=1, padding='same')(last_layer)
x2_2_1 = my_conv2D(x1_2, my_kernel_size=(1, 3), my_filters=384, my_stried=1, my_padding='same')
x2_2_2 = my_conv2D(x1_2, my_kernel_size=(3, 1), my_filters=384, my_stried=1, my_padding='same')
x2_3 = my_conv2D(x1_3, my_kernel_size=(3, 3), my_filters=384, my_stried=1, my_padding='same')
x2_4 = my_conv2D(x1_4, my_kernel_size=(1, 1), my_filters=192, my_stried=1, my_padding='same')
x3_2 = Concatenate()([x2_2_1, x2_2_2])
x3_3_1 = my_conv2D(x2_3, my_kernel_size=(1, 3), my_filters=384, my_stried=1, my_padding='same')
x3_3_2 = my_conv2D(x2_3, my_kernel_size=(3, 1), my_filters=384, my_stried=1, my_padding='same')
x4_3 = Concatenate()([x3_3_1, x3_3_2])
next_layer = Concatenate()([x1_1,x3_2, x4_3, x2_4])
return next_layer
input = Input(shape=input_shape,)
layer1 = my_conv2D(input)
layer2 = my_conv2D(layer1,my_stried=1)
layer3 = my_conv2D(layer2,my_filters=64,my_stried=1)
layer4 = MaxPooling2D((3,3),strides=2,padding='same')(layer3)
layer5 = my_conv2D(layer4,my_filters=80,my_stried=1)
layer6 = my_conv2D(layer5, my_filters=192, my_stried=1)
layer7 = MaxPooling2D((3, 3), strides=2,padding='same')(layer6)
layer1_1 = block1_1(layer7)
layer1_2 = block1_2(layer1_1)
layer1_3 = block1_3(layer1_2)
layer2_1 = block2_1(layer1_3)
layer2_2 = block2_2(layer2_1)
layer2_3 = block2_3_4(layer2_2)
layer2_4 = block2_3_4(layer2_3)
layer2_5 = block2_5(layer2_4)
layer3_1 = block3_1(layer2_5)
layer3_2 = block3_2(layer3_1)
layer3_3 = block3_3(layer3_2)
inception_v3_model = tf.keras.Model(inputs=input,outputs=layer3_3)
inception_v3_model.summary()
return inception_v3_model
if __name__=='__main__':
inception_v3_model = build_inception_v3()
三、待改进之处
- 有些代码重复度高,可增加函数参数将一类结构网络用一个函数实现
- 希望以后能熟练用类来搭建神经网络,这样显得专业<_<
四、学习心得
之前一直觉得自己搭建网络太难啦,想直接跑其他人的网络又看不懂代码,总觉得是自己不适合这个方向。之前看原理的时候感觉懂了,就是实现不来,便开始怀疑自己,后来发现还是框架不会用。于是花了点时间学习一些Keras函数详解,在慢慢跟着结构图上手感觉feel 倍儿棒!!加油,追梦人