TensorFlow BasicLSTMCell实现中的'call'和'__call__'有什么区别?

时间:2018-06-22 14:13:34

标签: tensorflow lstm rnn

我正在研究Tensorflow BasicLSTMCell,但发现该类中有两种类似的方法:__call__call。两种方法具有相同的参数,文档中没有说明不同之处。引用source code并没有给我任何线索。但是我猜想__call__方法是从某个地方继承的,而call会覆盖__call__。如果是这种情况,为什么不直接在源代码中使用__call__而不是call

2 个答案:

答案 0 :(得分:1)

研究 RNNCell 时,我遇到了类似的问题。

__ call __ 包装在 base_layer.py 的类 Layer 中,“

 call 和后处理步骤”。

答案 1 :(得分:1)

方法__call__()不会建立模型。它只是在模型中执行前向传递。当您使用call()时,它将构建模型。致电model.summary()可以看到区别。第一个方法将给出ValueError,而第二个方法将正常工作。

还有另一种称为build()的方法。最佳实践是在此方法内部(当您知道输入形状时)声明tf.Variables()而不是__init__()方法。此方法稍后会构建模型。

结论:如果使用call(),它将与__call__相同,此外,它还将建立模型。但是,如果您真的想使用稍后的版本,请同时声明build()