【tensorflow 解析】-【4】

版权声明:欢迎转载。转载请注明地址:https://blog.csdn.net/weixin_32820767 https://blog.csdn.net/weixin_32820767/article/details/86064671

解析一个 tensorflow 项目:

imagenet 调用关系:

1. official/resnet/imagenet_main.py :

 ImagenetModel() 类是继承 official/resnet/resnet_model.py 的 Model() 类,并初始化 __init__ 构造函数

设置的参数:

    super(ImagenetModel, self).__init__(                                           
        resnet_size=resnet_size,                                                   
        bottleneck=bottleneck,                                                     
        num_classes=num_classes,                                                   
        num_filters=64,                                                            
        kernel_size=7,                                                             
        conv_stride=2,                                                             
        first_pool_size=3,                                                         
        first_pool_stride=2,                                                       
        second_pool_size=7,                                                        
        second_pool_stride=1,                                                      
        block_sizes=_get_block_sizes(resnet_size),                                 
        block_strides=[1, 2, 2, 2],                                                
        final_size=final_size,                                                     
        version=version,                                                           
        data_format=data_format,                                                   
        dtype=dtype                                                                
    )

2. official/resnet/resnet_model.pyModel() 类:

其定义了内置函数 __call__(self, inputs, training)。使得可直接用类实例化。

3. Model() 类的内置函数 __call__()

  • 3.1 with 包含 variable_scope('resnet_model', ):
with self._model_variable_scope():
  • 3.2 第一个7x7的卷积层与池化层。根据 residual network 论文所述,先进行第一个7x7的卷积层与池化层。以下代码implement 第一个卷积层:
inputs = conv2d_fixed_padding(
      inputs=inputs, filters=self.num_filters, kernel_size=self.kernel_size,
      strides=self.conv_stride, data_format=self.data_format)
  inputs = tf.identity(inputs, 'initial_conv')

__init__ 的参数对应着论文里的参数:

self.num_filters = 64,
self.kernel_size = 7,
self.conv_stride = 2,

这里需要加 tf.identity() 方法的原因是将 input 转换为一个 op, 使得后续layer 可对 input 执行操作
接着是池化层:

        inputs = tf.layers.max_pooling2d(
            inputs=inputs, pool_size=self.first_pool_size,
            strides=self.first_pool_stride, padding='SAME',
            data_format=self.data_format)
        inputs = tf.identity(inputs, 'initial_max_pool')

同样, __init__ 的参数对应着论文里的参数:

first_pool_size = 3,
first_pool_stride = 2,
  • 3.3 构建一串 block。

猜你喜欢

转载自blog.csdn.net/weixin_32820767/article/details/86064671