【问题标题】:Modify Tensorflow model at runtime在运行时修改 TensorFlow 模型
【发布时间】:2020-12-18 02:30:45
【问题描述】:

我正在尝试在运行时修改 tensorflow 模型的数据流。考虑一个 3 层 FC 神经网络。假设我想为中间位置定义 2 个不同的层。

让我们说, 第一个选项:64 个神经元层 第二个选项:128 神经元层。

然后在预测功能期间,我想在输入数据旁边提供一个输入,例如:

model.predict([x_test, decider])

如果决策者为 0,我希望我的模型执行 64 个神经元层作为中间层。否则,我希望我的模型执行 128 个神经元层作为中间层。

如果我选择其中一个,出于性能原因,我不希望执行另一个选项。

注意:我不关心培训。

有没有办法做到这一点?到目前为止,我一直在尝试使用 tf.cond() 但无法使其工作。

【问题讨论】:

    标签: tensorflow keras


    【解决方案1】:

    我认为您可以通过重新组合独立模型来实现相同的目标:

    import tensorflow as tf
    from tensorflow.keras import layers, models
    import numpy as np
    
    # First model
    input_shape = (16, )
    inputs_0 = layers.Input(shape=input_shape)
    outputs_0 = layers.Dense(256, 'relu')(inputs_0)
    fc_0 = models.Model(inputs_0, outputs_0)
    # Middel model 0
    inputs_1_0 = layers.Input(shape=(256, ))
    outputs_1_0 = layers.Dense(64, 'relu')(inputs_1_0)
    outputs_1_0 = layers.Dense(128, 'relu')(outputs_1_0)
    fc_1_0 = models.Model(inputs_1_0, outputs_1_0)
    # Middel model 1
    inputs_1_1 = layers.Input(shape=(256, ))
    outputs_1_1 = layers.Dense(128, 'relu')(inputs_1_1)
    outputs_1_1 = layers.Dense(128, 'relu')(outputs_1_1)
    fc_1_1 = models.Model(inputs_1_1, outputs_1_1)
    # Last model
    inputs_2 = layers.Input(shape=(128, ))
    outputs_2 = layers.Dense(1, 'sigmoid')(inputs_2)
    fc_2 = models.Model(inputs_2, outputs_2)
    
    def custom_model(x, d):
        h = fc_0(x)
        if d == 1:
            h = fc_1_0(h)
        else:
            h = fc_1_1(h)
        return fc_2(h)
    
    x = np.random.rand(1, input_shape[0])
    decider = 0 # Middel model 0 or 1
    y = custom_model(x, decider)
    

    【讨论】:

    • 感谢您的回答。是的,我当然可以做到。但是,这将需要大量内存,而组合数量会增加。我的项目需要 100 种组合。因此,我想修改现有模型,以免超出 RAM 的容量。
    • 很高兴为您提供帮助,我认为内存需求主要取决于您定义的层数(参数数量)和您输入的数据批次,而不是您拥有的组合数量或方式你把它结合起来,如果你刚才声称的内存使用确实有问题,那么请再做一个问题,我去看看。
    • 但是如果你愿意,你总是可以在运行时动态定义模型,当你需要它时,应该会增加模型的内存使用率
    • 我的目的是更新 tensorflow 图,这样我就不需要保存所有组合的层权重。但事实证明,tf 图在构建后无法修改。在这种情况下,我想采用您的解决方案。但是您的解决方案性能下降。换句话说,如果我定义了两个不同的完整模型(一个使用您的中间模型 0,另一个使用中间模型 1),它们在这里的性能优于您的自定义模型。我认为原因是当每个迷你模型完成时,它们会将结果复制回 CPU。然后将其复制回 GPU 用于下一个迷你模型。有什么想法吗?
    • 另外,我无法在运行中(动态地)定义模型。因为,我需要在两个推理之间更改模型,如果可能的话根本不用等待。
    猜你喜欢
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 2019-01-29
    • 2021-05-27
    • 2014-03-05
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多