TypeError:子类化Model类时,__init __()至少接受3个参数(给定2个)

时间:2019-02-03 17:47:25

标签: python tensorflow keras

我想使用Tensorflow和Keras创建一个简单的神经网络。 当我尝试通过继承Model类来实例化模型时

class TwoLayerFC(tf.keras.Model):
    def __init__(self, hidden_size, num_classes):
        super(TwoLayerFC, self).__init__()
        self.fc1 = keras.layers.Dense(hidden_size,activation=tf.nn.relu)
        self.fc2 = keras.layers.Dense(num_classes)


    def call(self, x, training=None):
        x = tf.layers.flatten(x)
        x = self.fc1(x)
        x = self.fc2(x)

        return x

这就是我测试网络的方式

def test_TwoLayerFC():
    tf.reset_default_graph()
    input_size, hidden_size, num_classes = 50, 42, 10
    model = TwoLayerFC(hidden_size, num_classes)
    with tf.device(device):
        x = tf.zeros((64, input_size))
        scores = model(x)

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        scores_np = sess.run(scores)
        print(scores_np.shape)

我得到一个错误:

  

TypeError: init ()至少接受3个参数(给定2个参数)

我遵循了this教程,似乎应该有两个参数。

1 个答案:

答案 0 :(得分:1)

我阅读了您的代码,看到正在创建一个PyTorch模型,其中包括第二个Dense层中的错误以及两个传递的数字。

Keras模型不应遵循与PyTorch模型相同的逻辑。

此模型应按以下方式创建:

input_tensor = Input(input_shape)
output_tensor = Flatten()(input_tensor)
output_tensor = Dense(hidden_size, activation='relu')(output_tensor)
output_tensor = Dense(num_classes)

model = keras.models.Model(input_tensor, output_tensor)

model实例已准备好进行编译和训练:

 model.compile(optimizer=..., loss = ..., metrics=[...])
 model.fit(x_train, y_train, epochs=..., batch_size=..., ...)

在Keras中没有理由将Model子类化,除非您是真正的高级用户,并且尝试一些非常常规的事情。

顺便说一句,请注意不要将tf.keras.anythingkeras.anything混合使用。第一个是通过张量流直接获得的Keras版本,第二个是原始的Keras。它们并不完全相同,tensorflow的版本似乎更易出错,将两者混合在同一代码中听起来是个坏主意。