脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - python神经网络Inception ResnetV2模型复现详解

python神经网络Inception ResnetV2模型复现详解

2022-12-20 12:42Bubbliiiing Python

这篇文章主要为大家介绍了python神经网络Inception ResnetV2模型复现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

什么是Inception ResnetV2

Inception ResnetV2是Inception ResnetV1的一个加强版,两者的结构差距不大,如果大家想了解Inception ResnetV1可以看一下我的另一个blog。facenet的神经网络结构就是Inception ResnetV1。

神经网络学习小记录32——facenet详解及其keras实现

源码下载

 

Inception-ResNetV2的网络结构

Inception-ResNetV2和Inception-ResNetV1采用同一个主干网络。

它的结构很有意思!

如图所示为整个网络的主干结构:

python神经网络Inception ResnetV2模型复现详解


可以看到里面的结构分为几个重要的部分

1、stem

2、Inception-resnet-A

3、Inception-resnet-B

4、Inception-resnet-C

1、Stem的结构:

python神经网络Inception ResnetV2模型复现详解

在Inception-ResNetV2里,它的Input为299x299x3大小,输入后进行:
三次卷积 -> 最大池化 -> 两次卷积 -> 最大池化 -> 四个分支 -> 堆叠
python实现代码如下:

input_shape = [299,299,3]

img_input = Input(shape=input_shape)

# Stem block: 299,299,3 -> 35 x 35 x 192
x = conv2d_bn(img_input, 32, 3, strides=2, padding='valid')
x = conv2d_bn(x, 32, 3, padding='valid')
x = conv2d_bn(x, 64, 3)
x = MaxPooling2D(3, strides=2)(x)
x = conv2d_bn(x, 80, 1, padding='valid')
x = conv2d_bn(x, 192, 3, padding='valid')
x = MaxPooling2D(3, strides=2)(x)

# Mixed 5b (Inception-A block):35 x 35 x 192 -> 35 x 35 x 320
branch_0 = conv2d_bn(x, 96, 1)
branch_1 = conv2d_bn(x, 48, 1)
branch_1 = conv2d_bn(branch_1, 64, 5)
branch_2 = conv2d_bn(x, 64, 1)
branch_2 = conv2d_bn(branch_2, 96, 3)
branch_2 = conv2d_bn(branch_2, 96, 3)
branch_pool = AveragePooling2D(3, strides=1, padding='same')(x)
branch_pool = conv2d_bn(branch_pool, 64, 1)
branches = [branch_0, branch_1, branch_2, branch_pool]

x = Concatenate(name='mixed_5b')(branches)

2、Inception-resnet-A的结构:

python神经网络Inception ResnetV2模型复现详解


Inception-resnet-A的结构分为四个分支

1、未经处理直接输出

2、经过一次1x1的32通道的卷积处理

3、经过一次1x1的32通道的卷积处理和一次3x3的32通道的卷积处理

4、经过一次1x1的32通道的卷积处理、一次3x3的48通道和一次3x3的64通道卷积处理

234步的结果堆叠后进行一次卷积,并与第一步的结果相加,实质上这是一个残差网络结构。

实现代码如下:

branch_0 = conv2d_bn(x, 32, 1)
branch_1 = conv2d_bn(x, 32, 1)
branch_1 = conv2d_bn(branch_1, 32, 3)
branch_2 = conv2d_bn(x, 32, 1)
branch_2 = conv2d_bn(branch_2, 48, 3)
branch_2 = conv2d_bn(branch_2, 64, 3)
branches = [branch_0, branch_1, branch_2]

block_name = block_type + '_' + str(block_idx)
mixed = Concatenate(name=block_name + '_mixed')(branches)
up = conv2d_bn(mixed,K.int_shape(x)[3],1,activation=None,se_bias=True,name=block_name + '_conv')

x = Lambda(lambda inputs, scale: inputs[0] + inputs[1] * scale,
          output_shape=K.int_shape(x)[1:],
          arguments={'scale': scale},
          name=block_name)([x, up])
if activation is not None:
  x = Activation(activation, name=block_name + '_ac')(x)

3、Inception-resnet-B的结构:

python神经网络Inception ResnetV2模型复现详解


Inception-resnet-B的结构分为四个分支

1、未经处理直接输出

2、经过一次1x1的192通道的卷积处理

3、经过一次1x1的128通道的卷积处理、一次1x7的160通道的卷积处理和一次7x1的192通道的卷积处理

23步的结果堆叠后进行一次卷积,并与第一步的结果相加,实质上这是一个残差网络结构。

实现代码如下:

branch_0 = conv2d_bn(x, 192, 1)
branch_1 = conv2d_bn(x, 128, 1)
branch_1 = conv2d_bn(branch_1, 160, [1, 7])
branch_1 = conv2d_bn(branch_1, 192, [7, 1])
branches = [branch_0, branch_1]

block_name = block_type + '_' + str(block_idx)
mixed = Concatenate(name=block_name + '_mixed')(branches)
up = conv2d_bn(mixed,K.int_shape(x)[3],1,activation=None,se_bias=True,name=block_name + '_conv')

x = Lambda(lambda inputs, scale: inputs[0] + inputs[1] * scale,
          output_shape=K.int_shape(x)[1:],
          arguments={'scale': scale},
          name=block_name)([x, up])
if activation is not None:
  x = Activation(activation, name=block_name + '_ac')(x)

4、Inception-resnet-C的结构:

python神经网络Inception ResnetV2模型复现详解


Inception-resnet-B的结构分为四个分支

1、未经处理直接输出

2、经过一次1x1的192通道的卷积处理

3、经过一次1x1的192通道的卷积处理、一次1x3的224通道的卷积处理和一次3x1的256通道的卷积处理

23步的结果堆叠后进行一次卷积,并与第一步的结果相加,实质上这是一个残差网络结构。

实现代码如下:

branch_0 = conv2d_bn(x, 192, 1)
branch_1 = conv2d_bn(x, 192, 1)
branch_1 = conv2d_bn(branch_1, 224, [1, 3])
branch_1 = conv2d_bn(branch_1, 256, [3, 1])
branches = [branch_0, branch_1]

block_name = block_type + '_' + str(block_idx)
mixed = Concatenate(name=block_name + '_mixed')(branches)
up = conv2d_bn(mixed,K.int_shape(x)[3],1,activation=None,se_bias=True,name=block_name + '_conv')

x = Lambda(lambda inputs, scale: inputs[0] + inputs[1] * scale,
          output_shape=K.int_shape(x)[1:],
          arguments={'scale': scale},
          name=block_name)([x, up])
if activation is not None:
  x = Activation(activation, name=block_name + '_ac')(x)

全部代码

import warnings
import numpy as np

from keras.preprocessing import image
from keras.models import Model
from keras.layers import Activation,AveragePooling2D,BatchNormalization,Concatenate
from keras.layers import Conv2D,Dense,GlobalAveragePooling2D,GlobalMaxPooling2D,Input,Lambda,MaxPooling2D
from keras.applications.imagenet_utils import decode_predictions
from keras.utils.data_utils import get_file
from keras import backend as K
BASE_WEIGHT_URL = 'https://github.com/fchollet/deep-learning-models/releases/download/v0.7/'

def conv2d_bn(x,filters,kernel_size,strides=1,padding='same',activation='relu',use_bias=False,name=None):
  x = Conv2D(filters,
             kernel_size,
             strides=strides,
             padding=padding,
             use_bias=use_bias,
             name=name)(x)
  if not use_bias:
      bn_axis = 1 if K.image_data_format() == 'channels_first' else 3
      bn_name = None if name is None else name + '_bn'
      x = BatchNormalization(axis=bn_axis, scale=False, name=bn_name)(x)
  if activation is not None:
      ac_name = None if name is None else name + '_ac'
      x = Activation(activation, name=ac_name)(x)
  return x

def inception_resnet_block(x, scale, block_type, block_idx, activation='relu'):
  if block_type == 'block35':
      branch_0 = conv2d_bn(x, 32, 1)
      branch_1 = conv2d_bn(x, 32, 1)
      branch_1 = conv2d_bn(branch_1, 32, 3)
      branch_2 = conv2d_bn(x, 32, 1)
      branch_2 = conv2d_bn(branch_2, 48, 3)
      branch_2 = conv2d_bn(branch_2, 64, 3)
      branches = [branch_0, branch_1, branch_2]
  elif block_type == 'block17':
      branch_0 = conv2d_bn(x, 192, 1)
      branch_1 = conv2d_bn(x, 128, 1)
      branch_1 = conv2d_bn(branch_1, 160, [1, 7])
      branch_1 = conv2d_bn(branch_1, 192, [7, 1])
      branches = [branch_0, branch_1]
  elif block_type == 'block8':
      branch_0 = conv2d_bn(x, 192, 1)
      branch_1 = conv2d_bn(x, 192, 1)
      branch_1 = conv2d_bn(branch_1, 224, [1, 3])
      branch_1 = conv2d_bn(branch_1, 256, [3, 1])
      branches = [branch_0, branch_1]
  else:
      raise ValueError('Unknown Inception-ResNet block type. '
                       'Expects "block35", "block17" or "block8", '
                       'but got: ' + str(block_type))

  block_name = block_type + '_' + str(block_idx)
  mixed = Concatenate(name=block_name + '_mixed')(branches)
  up = conv2d_bn(mixed,K.int_shape(x)[3],1,activation=None,use_bias=True,name=block_name + '_conv')

  x = Lambda(lambda inputs, scale: inputs[0] + inputs[1] * scale,
             output_shape=K.int_shape(x)[1:],
             arguments={'scale': scale},
             name=block_name)([x, up])
  if activation is not None:
      x = Activation(activation, name=block_name + '_ac')(x)
  return x


def InceptionResNetV2(input_shape=[299,299,3],
                    classes=1000):

  input_shape = [299,299,3]

  img_input = Input(shape=input_shape)

  # Stem block: 299,299,3 -> 35 x 35 x 192
  x = conv2d_bn(img_input, 32, 3, strides=2, padding='valid')
  x = conv2d_bn(x, 32, 3, padding='valid')
  x = conv2d_bn(x, 64, 3)
  x = MaxPooling2D(3, strides=2)(x)
  x = conv2d_bn(x, 80, 1, padding='valid')
  x = conv2d_bn(x, 192, 3, padding='valid')
  x = MaxPooling2D(3, strides=2)(x)

  # Mixed 5b (Inception-A block):35 x 35 x 192 -> 35 x 35 x 320
  branch_0 = conv2d_bn(x, 96, 1)
  branch_1 = conv2d_bn(x, 48, 1)
  branch_1 = conv2d_bn(branch_1, 64, 5)
  branch_2 = conv2d_bn(x, 64, 1)
  branch_2 = conv2d_bn(branch_2, 96, 3)
  branch_2 = conv2d_bn(branch_2, 96, 3)
  branch_pool = AveragePooling2D(3, strides=1, padding='same')(x)
  branch_pool = conv2d_bn(branch_pool, 64, 1)
  branches = [branch_0, branch_1, branch_2, branch_pool]

  x = Concatenate(name='mixed_5b')(branches)

  # 10次Inception-ResNet-A block:35 x 35 x 320 -> 35 x 35 x 320
  for block_idx in range(1, 11):
      x = inception_resnet_block(x,
                                 scale=0.17,
                                 block_type='block35',
                                 block_idx=block_idx)

  # Reduction-A block:35 x 35 x 320 -> 17 x 17 x 1088
  branch_0 = conv2d_bn(x, 384, 3, strides=2, padding='valid')
  branch_1 = conv2d_bn(x, 256, 1)
  branch_1 = conv2d_bn(branch_1, 256, 3)
  branch_1 = conv2d_bn(branch_1, 384, 3, strides=2, padding='valid')
  branch_pool = MaxPooling2D(3, strides=2, padding='valid')(x)
  branches = [branch_0, branch_1, branch_pool]
  x = Concatenate(name='mixed_6a')(branches)

  # 20次Inception-ResNet-B block: 17 x 17 x 1088 -> 17 x 17 x 1088 
  for block_idx in range(1, 21):
      x = inception_resnet_block(x,
                                 scale=0.1,
                                 block_type='block17',
                                 block_idx=block_idx)


  # Reduction-B block: 17 x 17 x 1088 -> 8 x 8 x 2080
  branch_0 = conv2d_bn(x, 256, 1)
  branch_0 = conv2d_bn(branch_0, 384, 3, strides=2, padding='valid')
  branch_1 = conv2d_bn(x, 256, 1)
  branch_1 = conv2d_bn(branch_1, 288, 3, strides=2, padding='valid')
  branch_2 = conv2d_bn(x, 256, 1)
  branch_2 = conv2d_bn(branch_2, 288, 3)
  branch_2 = conv2d_bn(branch_2, 320, 3, strides=2, padding='valid')
  branch_pool = MaxPooling2D(3, strides=2, padding='valid')(x)
  branches = [branch_0, branch_1, branch_2, branch_pool]
  x = Concatenate(name='mixed_7a')(branches)

  # 10次Inception-ResNet-C block: 8 x 8 x 2080 -> 8 x 8 x 2080
  for block_idx in range(1, 10):
      x = inception_resnet_block(x,
                                 scale=0.2,
                                 block_type='block8',
                                 block_idx=block_idx)
  x = inception_resnet_block(x,
                             scale=1.,
                             activation=None,
                             block_type='block8',
                             block_idx=10)

  # 8 x 8 x 2080 -> 8 x 8 x 1536
  x = conv2d_bn(x, 1536, 1, name='conv_7b')

  x = GlobalAveragePooling2D(name='avg_pool')(x)
  x = Dense(classes, activation='softmax', name='predictions')(x)

  inputs = img_input

  # 创建模型
  model = Model(inputs, x, name='inception_resnet_v2')

  return model

def preprocess_input(x):
  x /= 255.
  x -= 0.5
  x *= 2.
  return x

if __name__ == '__main__':
  model = InceptionResNetV2()
  fname = 'inception_resnet_v2_weights_tf_dim_ordering_tf_kernels.h5'
  weights_path = get_file(fname,BASE_WEIGHT_URL + fname,cache_subdir='models',file_hash='e693bd0210a403b3192acc6073ad2e96')
  model.load_weights(fname)
  img_path = 'elephant.jpg'
  img = image.load_img(img_path, target_size=(299, 299))
  x = image.img_to_array(img)
  x = np.expand_dims(x, axis=0)

  x = preprocess_input(x)

  preds = model.predict(x)
  print('Predicted:', decode_predictions(preds))

以上就是python神经网络Inception ResnetV2模型复现详解的详细内容,更多关于Inception ResnetV2模型复现的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/weixin_44791964/article/details/103732720

延伸 · 阅读

精彩推荐
  • PythonPython Pillow Image Invert

    Python Pillow Image Invert

    今天小编就为大家分享一篇关于Python Pillow Image Invert,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    _John_Tian_6332021-05-20
  • Python用Python登录好友QQ空间点赞的示例代码

    用Python登录好友QQ空间点赞的示例代码

    这篇文章主要介绍了用Python登录好友QQ空间点赞的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    来喽来喽2372020-12-15
  • PythonPython内建模块struct实例详解

    Python内建模块struct实例详解

    这篇文章主要介绍了Python内建模块struct实例详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下...

    锦小年10772021-01-11
  • PythonPython子进程subpocess原理及用法解析

    Python子进程subpocess原理及用法解析

    这篇文章主要介绍了Python子进程subpocess原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可...

    陈严肃5892020-07-16
  • PythonDjango框架中间件(Middleware)用法实例分析

    Django框架中间件(Middleware)用法实例分析

    这篇文章主要介绍了Django框架中间件(Middleware)用法,结合实例形式分析了Django框架中间件(Middleware)的功能、用法及相关操作技巧,需要的朋友可以参考下...

    12573090545382021-06-29
  • Pythonpytorch 如何使用float64训练

    pytorch 如何使用float64训练

    这篇文章主要介绍了pytorch 使用float64训练的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    gltangwq11542021-11-11
  • PythonDjango自定义manage命令实例代码

    Django自定义manage命令实例代码

    这篇文章主要介绍了Django自定义manage命令实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下...

    lynne2333882021-01-14
  • PythonPython的基本语法详解

    Python的基本语法详解

    本文详细讲解了Python的基本语法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    springsnow11632022-11-08