Tensorflow 子类化序贯模型

Tensorflow 子类化序贯模型,tensorflow,keras,Tensorflow,Keras,为了能够编写自定义的call()并处理命名的输入,我想对序列模型进行子类化。然而,对于我来说,\uuuu init\uuu函数的微小更改已经导致了一些意想不到的行为。如果我尝试在调用super()后向子类添加新成员并初始化它。\uuu init\uuuu()模型将无法自动生成 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, Activation, MaxPooli

为了能够编写自定义的
call()
并处理命名的输入,我想对序列模型进行子类化。然而,对于我来说,
\uuuu init\uuu
函数的微小更改已经导致了一些意想不到的行为。如果我尝试在调用
super()后向子类添加新成员并初始化它。\uuu init\uuuu()
模型将无法自动生成

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, Activation, MaxPooling2D, Dense, Flatten
import tensorflow as tf
class Sequential2(Sequential):

    def __init__(self):
        super(Sequential2, self).__init__()
        self.custom_member = []

    def get_my_custom_member(self):
        return self.custom_member

model = Sequential2()

if tf.keras.backend.image_data_format() == 'channels_first':
    input_shape = (1, 28, 28)
else:
    assert tf.keras.backend.image_data_format() == 'channels_last'
    input_shape = (28, 28, 1)

layers = [Conv2D(32, (3, 3), input_shape=input_shape)]

for layer in layers:
    model.add(layer)

model.add(Dense(10))
model.add(Activation('relu'))

model.summary()
输出失败:
ValueError:此模型尚未生成。首先通过调用`Build()`或调用`fit()`和一些数据来构建模型,或者在第一层中指定一个`input_shape`参数进行自动构建。

但是,如果省略了
self.custom_member=[]
,它将按预期工作


我错过了什么?(使用Tensorflow 1.14进行测试)

此问题已在TF 2.2中修复。您可以参考如下所示的工作代码

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, Activation, MaxPooling2D, Dense, Flatten

import tensorflow as tf
print(tf.__version__)

class Sequential2(Sequential):

    def __init__(self):
        super(Sequential2, self).__init__()
        self.custom_member = []

    def get_my_custom_member(self):
        return self.custom_member

model = Sequential2()

if tf.keras.backend.image_data_format() == 'channels_first':
    input_shape = (1, 28, 28)
else:
    assert tf.keras.backend.image_data_format() == 'channels_last'
    input_shape = (28, 28, 1)

layers = [Conv2D(32, (3, 3), input_shape=input_shape)]

for layer in layers:
    model.add(layer)

model.add(Dense(10))
model.add(Activation('relu'))

model.summary()
输出:

2.2.0
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 26, 26, 32)        320       
_________________________________________________________________
dense (Dense)                (None, 26, 26, 10)        330       
_________________________________________________________________
activation (Activation)      (None, 26, 26, 10)        0         
=================================================================
Total params: 650
Trainable params: 650
Non-trainable params: 0
_________________________________________________________________
甚至不要使用TF2.2(我也遇到了类似的问题)。[背景]