Tensorflow 2 Keras嵌套模型子类化-总参数为零

诺法·苏里扬托(Naufal Suryanto)

我正在尝试实现一个受VGG网络启发的简单模型子类化。

所以这是代码:

class ConvMax(tf.keras.Model):
    def __init__(self, filters=4, kernel_size=3, pool_size=2, activation='relu'):
        super(ConvMax, self).__init__()

        self.conv = tf.keras.layers.Conv2D(filters, kernel_size, padding='same', activation=activation)
        self.maxpool = tf.keras.layers.MaxPool2D((pool_size, pool_size))

    def call(self, input_tensor):
        x = self.conv(input_tensor)
        x = self.maxpool(x)
        return x

class RepeatedConvMax(tf.keras.Model):
    def __init__(self, repetitions=4, filters=4, kernel_size=3, pool_size=2, activation='relu', **kwargs):
        super(RepeatedConvMax, self).__init__(**kwargs)
    
        self.repetitions = repetitions
        self.filters = filters
        self.kernel_size = kernel_size
        self.pool_size = pool_size
        self.activation = activation
    
        # Define a repeated ConvMax
        for i in range(self.repetitions):
            # Define a ConvMax layer, specifying filters, kernel_size, pool_size.
            vars(self)[f'convMax_{i}'] = ConvMax(self.filters, self.kernel_size, self.pool_size, self.activation)

    def call(self, input_tensor):
        # Connect the first layer
        x = vars(self)['convMax_0'](input_tensor)
   
        # Connect the existing layers
        for i in range(1, self.repetitions):
            x = vars(self)[f'convMax_{i}'](x)
    
        # return the last layer
        return x

但是,当我尝试构建网络以查看摘要时,这是我发现的内容:

model_input = tf.keras.layers.Input(shape=(64,64,3,), name="input_layer")
x = RepeatedConvMax()(model_input)
model = tf.keras.Model(inputs=model_input, outputs=x)

Model: "model_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_layer (InputLayer)     [(None, 64, 64, 3)]       0         
_________________________________________________________________
repeated_conv_max (RepeatedC (None, 4, 4, 4)           0         
=================================================================
Total params: 0
Trainable params: 0
Non-trainable params: 0
_________________________________________________________________

总参数为零

但是,当我尝试:

model_input = tf.keras.layers.Input(shape=(64,64,3,), name="input_layer")
x = ConvMax()(model_input)
x = ConvMax()(x)
x = ConvMax()(x)
x = ConvMax()(x)
model = tf.keras.Model(inputs=model_input, outputs=x)
model.summary()

Model: "model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_layer (InputLayer)     [(None, 64, 64, 3)]       0         
_________________________________________________________________
conv_max (ConvMax)           (None, 32, 32, 4)         112       
_________________________________________________________________
conv_max_1 (ConvMax)         (None, 16, 16, 4)         148       
_________________________________________________________________
conv_max_2 (ConvMax)         (None, 8, 8, 4)           148       
_________________________________________________________________
conv_max_3 (ConvMax)         (None, 4, 4, 4)           148       
=================================================================
Total params: 556
Trainable params: 556
Non-trainable params: 0
_________________________________________________________________

它显示正确的总参数。

你知道是什么问题吗?为什么在两层子类上,参数为0?会影响培训吗?

谢谢...

问题不在于keras,而在于您初始化层的方式RepeatedConvMax

TLDR:请勿使用vars动态实例化和检索属性,而应使用setattrgetattr

要解决该问题,只需vars[]setattr替换即可getattr从我的理解(非常有限,我实际上是在寻找解决方案时立即发现了这一点)的理解,当您打电话给vars时,您正在研究代表您的对象的字典的副本。当您以这种方式动态创建属性时,Keras无法将权重添加到模型中(为什么还不知道,但是我会找出并更新答案)。

如果您这样定义您的课程,那么一切都会按预期进行:

class RepeatedConvMax(tf.keras.Model):
    def __init__(self, repetitions=4, filters=4, kernel_size=3, pool_size=2, activation='relu', **kwargs):
        super(RepeatedConvMax, self).__init__(**kwargs)

        self.repetitions = repetitions
        self.filters = filters
        self.kernel_size = kernel_size
        self.pool_size = pool_size
        self.activation = activation

        # Define a repeated ConvMax
        for i in range(self.repetitions):
            # Define a ConvMax layer, specifying filters, kernel_size, pool_size.
            setattr(self, f'convMax_{i}', ConvMax(self.filters, self.kernel_size, self.pool_size, self.activation))

    def call(self, input_tensor, training=None, mask=None):
        # Connect the first layer
        x = getattr(self, 'convMax_0')(input_tensor)

        # Connect the existing layers
        for i in range(1, self.repetitions):
            print(f"Layer {i}")
            x = getattr(self, f'convMax_{i}')(x)
            print(x)

        # return the last layer
        return x

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

TensorFlow2-模型子类化ValueError

来自分类Dev

Tensorflow 2“ InaccessibleTensorError”中的错误子类化模型

来自分类Dev

Tensorflow模型子类化多输入

来自分类Dev

编译后将keras层设置为不可训练会更改摘要中的总参数数

来自分类Dev

在tensorflow 2中从零开始训练keras应用

来自分类Dev

Tensorflow 2:嵌套TensorArray

来自分类Dev

尝试使用 tensorflow 数据集为 keras 模型准备 CSV

来自分类Dev

使用 Keras Functional API 为 Tensorflow LITE 构建模型

来自分类Dev

错误的参数#2为“可设置”(预期为零或表)?

来自分类Dev

嵌套模型时没有提供Keras Tensorflow的渐变

来自分类Dev

Tensorflow梯度始终为零

来自分类Dev

在tensorflow 2中将keras功能模型转换为keras类

来自分类Dev

如何在tensorflow中为word2vec模型提供特定的单词

来自分类Dev

如何避免在Tensorflow 2中为CTC损失模型定义目标张量?

来自分类Dev

无法保存子类的TensorFlow 2.1模型-__call __()缺少1个必需的位置参数:'x'

来自分类Dev

为QAudioDecoder子类化QIODevice

来自分类Dev

为QAudioDecoder子类化QIODevice

来自分类Dev

“编译”时如何在急切模式下执行TensorFlow 2 Keras顺序模型?

来自分类Dev

如何在具有tensorflow2和keras的多GPU上训练模型?

来自分类Dev

如何将使用Keras模型训练的Tensorflow 2. *转换为.onnx格式?

来自分类Dev

Keras功能模型产生子类化错误

来自分类Dev

tensorflow/keras 训练模型 keyerror

来自分类Dev

如何在具有tensorflow v2.x后端的keras中加载具有tensorflow v1.x后端的keras模型?

来自分类Dev

TensorFlow keras模型fit()参数steps_per_epoch和纪元在火车上的行为

来自分类Dev

为什么我的Keras / TensorFlow模型拒绝拟合(即使参数似乎正确)?

来自分类Dev

为什么在 tensorflow 会话中访问 keras 模型参数值会发生变化?

来自分类Dev

使用CPU的“ Keras后端+ Tensorflow”和“来自Tensorflow的Keras”之间有什么区别(在Tensorflow 2.x中)

来自分类Dev

将tensorflow 1.xx模型加载到tensorflow 2.xx中

来自分类Dev

如何在TensorFlow 2.x中加载Tensorflow 1.x保存的模型?

Related 相关文章

  1. 1

    TensorFlow2-模型子类化ValueError

  2. 2

    Tensorflow 2“ InaccessibleTensorError”中的错误子类化模型

  3. 3

    Tensorflow模型子类化多输入

  4. 4

    编译后将keras层设置为不可训练会更改摘要中的总参数数

  5. 5

    在tensorflow 2中从零开始训练keras应用

  6. 6

    Tensorflow 2:嵌套TensorArray

  7. 7

    尝试使用 tensorflow 数据集为 keras 模型准备 CSV

  8. 8

    使用 Keras Functional API 为 Tensorflow LITE 构建模型

  9. 9

    错误的参数#2为“可设置”(预期为零或表)?

  10. 10

    嵌套模型时没有提供Keras Tensorflow的渐变

  11. 11

    Tensorflow梯度始终为零

  12. 12

    在tensorflow 2中将keras功能模型转换为keras类

  13. 13

    如何在tensorflow中为word2vec模型提供特定的单词

  14. 14

    如何避免在Tensorflow 2中为CTC损失模型定义目标张量?

  15. 15

    无法保存子类的TensorFlow 2.1模型-__call __()缺少1个必需的位置参数:'x'

  16. 16

    为QAudioDecoder子类化QIODevice

  17. 17

    为QAudioDecoder子类化QIODevice

  18. 18

    “编译”时如何在急切模式下执行TensorFlow 2 Keras顺序模型?

  19. 19

    如何在具有tensorflow2和keras的多GPU上训练模型?

  20. 20

    如何将使用Keras模型训练的Tensorflow 2. *转换为.onnx格式?

  21. 21

    Keras功能模型产生子类化错误

  22. 22

    tensorflow/keras 训练模型 keyerror

  23. 23

    如何在具有tensorflow v2.x后端的keras中加载具有tensorflow v1.x后端的keras模型?

  24. 24

    TensorFlow keras模型fit()参数steps_per_epoch和纪元在火车上的行为

  25. 25

    为什么我的Keras / TensorFlow模型拒绝拟合(即使参数似乎正确)?

  26. 26

    为什么在 tensorflow 会话中访问 keras 模型参数值会发生变化?

  27. 27

    使用CPU的“ Keras后端+ Tensorflow”和“来自Tensorflow的Keras”之间有什么区别(在Tensorflow 2.x中)

  28. 28

    将tensorflow 1.xx模型加载到tensorflow 2.xx中

  29. 29

    如何在TensorFlow 2.x中加载Tensorflow 1.x保存的模型?

热门标签

归档