版权声明:欢迎转载。转载请注明地址: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.py
的 Model()
类:
其定义了内置函数 __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。