首页 > 解决方案 > 将模型内的张量流操作列表自动转换为 ListWrapper

问题描述

我正在检查 tf.keras 代码,我发现当在自定义 model.Model 实例中时,tf分配给self变量的每个操作列表都会自动转换为ListWrapper对象。此功能的示例显示在代码中:

from tensorflow.keras import models
from tensorflow.keras import layers
from tensorflow.keras import initializers


class CustomModel(models.Model):
    def __init__(self, width, depth, **kwargs):
        super(CustomModel, self).__init__(**kwargs)
        self.width = width
        options = {
            'kernel_size': 3,
            'strides': 1,
            'padding': 'same',
            'kernel_initializer': initializers.RandomNormal(mean=0.0, stddev=0.01, seed=None)
        }
        self.convs = [layers.Conv2D(filters=width, bias_initializer='zeros', name='convs_{}'.format(i), **options)
                      for i in range(depth)]
        self.conv = layers.Conv2D(filters=width, bias_initializer='zeros', name='conv_{}'.format(0), **options)
        self.conv2 = [layers.Conv2D(filters=width, bias_initializer='zeros', name='conv_{}'.format(0), **options)]

        self.depth = depth

如果选中(例如在调试器中):

type(self.convs)

tensorflow.python.training.tracking.data_structures.ListWrapper

type(self.conv)

tensorflow.python.keras.layers.convolutional.Conv2D

type(self.conv2)

tensorflow.python.training.tracking.data_structures.ListWrapper

在哪里可以看到,self.convsself.conv2不是ListWrapper列表。相反,如果该类不继承自Model

class CustomModel2(object):
    def __init__(self, width, depth, **kwargs):
        # super(CustomModel, self).__init__(**kwargs)
        self.width = width
        options = {
            'kernel_size': 3,
            'strides': 1,
            'padding': 'same',
            'kernel_initializer': initializers.RandomNormal(mean=0.0, stddev=0.01, seed=None)
        }
        self.convs = [layers.Conv2D(filters=width, bias_initializer='zeros', name='convs_{}'.format(i), **options)
                      for i in range(depth)]
        self.conv = layers.Conv2D(filters=width, bias_initializer='zeros', name='conv_{}'.format(0), **options)
        self.conv2 = [layers.Conv2D(filters=width, bias_initializer='zeros', name='conv_{}'.format(0), **options)]

        self.depth = depth

创建通常的列表:

type(self.convs)

列表

type(self.conv)

tensorflow.python.keras.layers.convolutional.Conv2D

type(self.conv2)

列表

所以,我的问题是为什么会这样?使用ListWrapperover list有什么好处?另外,我该如何使用这种类型?例如,我知道我可以通过for循环访问其成员。还有其他我应该知道的属性吗?

这里有一个类似的问题,但问题和答案都不让我满意。

标签: pythontensorflowkeras

解决方案


推荐阅读