【问题标题】:Do we need to declare control_dependencies in tf.keras我们是否需要在 tf.keras 中声明 control_dependencies
【发布时间】:2020-01-02 09:32:58
【问题描述】:

我在 tensorflow 中注意到,control_dependencies 很重要,我们需要注意它。
尽管如此,当我用 tensorflow keras 实现模型时,我注意到如果我不添加control_dependencies,似乎还是可以的。

例如,假设我有一个具有 4 层 LSTM 的模型,如下所示:

import numpy as np

sequence_input = tf.keras.layers.Input(dtype='int32', shape=(3,))
embedding_output = tf.keras.layers.Embedding(input_dim=100, output_dim=5, input_length=10)(sequence_input)
lstm_output = tf.keras.layers.LSTM(10, return_sequences=True)(embedding_output)
lstm_output = tf.keras.layers.LSTM(10, return_sequences=True)(lstm_output)
lstm_output = tf.keras.layers.LSTM(10, return_sequences=True)(lstm_output)
lstm_output = tf.keras.layers.LSTM(10, return_sequences=False)(lstm_output)
output = tf.keras.layers.Activation('sigmoid')(lstm_output)
model = tf.keras.models.Model(inputs=[sequence_input], outputs=output)
print(model.summary())
sequence_input = np.random.randint(100, size=(5, 3))
print(model.predict([sequence_input]))

在这里,我在嵌入层之上有 4-lstm 层。输出是正常的 sigmoid 激活。有了这个我认为模型的实现是正确的。

但是,我认为我应该使用 control_dependencies 来实现这一点,如下所示:

import numpy as np

sequence_input = tf.keras.layers.Input(dtype='int32', shape=(3,))
embedding_output = tf.keras.layers.Embedding(input_dim=100, output_dim=5, input_length=10)(sequence_input)
lstm_output = tf.keras.layers.LSTM(10, return_sequences=True)(embedding_output)
with tf.control_dependencies([lstm_output]):
    lstm_output = tf.keras.layers.LSTM(10, return_sequences=True)(lstm_output)
    with tf.control_dependencies([lstm_output]):
        lstm_output = tf.keras.layers.LSTM(10, return_sequences=True)(lstm_output)
        with tf.control_dependencies([lstm_output]):
            lstm_output = tf.keras.layers.LSTM(10, return_sequences=False)(lstm_output)
            with tf.control_dependencies([lstm_output]):
                output = tf.keras.layers.Activation('sigmoid')(lstm_output)

model = tf.keras.models.Model(inputs=[sequence_input], outputs=output)
print(model.summary())
sequence_input = np.random.randint(100, size=(5, 3))
print(model.predict([sequence_input]))

尽管如此,代码在两种情况下运行良好,我认为在两种情况下实现也是正确的。
因此,我的问题是:我们是否需要在 tf keras 中声明 control_dependencies。另外,如果不是 - 为什么我们不需要在 tf.keras 中使用 control_dependencies

谢谢

【问题讨论】:

    标签: tensorflow keras deep-learning


    【解决方案1】:

    具体来说 - 您在 control_dependencies 的参数中指定的内容确保在您在 with 块中定义的任何内容之前评估

    请参考This了解更多。

    【讨论】:

    • 感谢您的回答。我想你误解了我的问题——我的意思是即使我在代码中没有 control_dependencies——它似乎也很有效。事实上,我从未见过在创建模型时涉及到 control_dependencies 的 keras 教程。
    • 因为此函数不是运行代码的强制要求,而是它的附加功能 - 当启用急切执行时,将调用 control_inputs(control_dependencies 的输入) 列表中的任何可调用对象。因此,拥有是好的,但不是必需的。希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 2019-08-22
    相关资源
    最近更新 更多