【问题标题】:Stacking functional models with python functions induce graph disconnection in Keras使用 python 函数堆叠函数模型会导致 Keras 中的图形断开连接
【发布时间】:2019-03-13 11:56:19
【问题描述】:

我要连接model_1

x_a = Input((5,))
hidden_a = Dense(2)(x_a)
hidden_b = Dense(2)(x_a)
model_1 = Model(x_a, [hidden_a, hidden_b])

model_2:

x_b = Input((2,))
output = Dense(1)(x_b)
model_2 = Model(x_b, output)

我可以用下面这行来做到这一点:

model_3 = Model(x_a, model_2(model_1.outputs[0]))

但是我想定义任意数量的模型,所以我想使用函数来做到这一点。

有趣的是,当我尝试将每个模型嵌入到一个函数中时,如下所示:

def model1():
  x_a = Input((5,))
  hidden_a = Dense(2)(x_a)
  hidden_b = Dense(2)(x_a)
  model_1 = Model(x_a, [hidden_a, hidden_b])
  return model_1

def model2():    
  x_b = Input((2,))
  output = Dense(1)(x_b)
  model_2 = Model(x_b, output)
  return model_2

input_a = Input((5,))
m1 = model1()
m2 = model2()
m3 = Model(input_a, m2(m1.outputs[0]))

我收到一个错误:

ValueError: Graph disconnected: cannot obtain value for tensor Tensor("input_3:0", shape=(?, 5), dtype=float32) at layer "input_3". The following previous layers were accessed without issue: [].

基本上我想做和这篇文章一样的事情:Why when using this simple model with multiple outputs does Keras complain about a lack of gradients?

但有功能。

有没有办法使用函数来做我想要的,或者你认为使用自定义图层会更好吗? 谢谢。

【问题讨论】:

    标签: python-3.x tensorflow keras keras-layer


    【解决方案1】:

    如果您使用输入“model_inputs”和“sub_model_inputs”来设计模型函数,则可以完成这项工作。完整的工作代码(没有梯度错误),如下所示:

    from tensorflow.keras.layers import Dense, Input
    from tensorflow.keras.models import Model
    import numpy as np
    
    def model1(model_inputs, sub_model_inputs):
      #x_a = Input((5,))
      hidden_a = Dense(2)(sub_model_inputs)
      hidden_b = Dense(2)(sub_model_inputs)
      model_1 = Model(model_inputs, [hidden_a, hidden_b])
      return model_1
    
    def model2(model_inputs, sub_model_inputs):    
      #x_b = Input((2,))
      output = Dense(1)(sub_model_inputs)
      model_2 = Model(model_inputs, output)
      return model_2
    
    input_a = Input((5,))
    m1 = model1(input_a, input_a)
    m2 = model2(input_a, m1.outputs[0])
    m3 = Model(input_a, m2.outputs)
    
    m3.compile(optimizer='adam', loss='mse')
    
    x= np.ones((10,5))
    y = np.ones((10,1))
    m3.train_on_batch(x,y)
    

    model_inputs 是完整模型的输入(结合了较小的模型),而 sub_model_inputs 对应于特定子模型的输入(本例中的示例 model1 和 model2)。

    【讨论】:

      【解决方案2】:

      我认为将 m3 更改为此应该可以:

      m3 = Model(input_a, m2(m1(input_a)[0]))
      

      您的方法的问题是您的模型图中 input_a 和 m2 的输出之间没有连接,因此模型不知道如何处理 input_a

      【讨论】:

      • 链接中提到的问题是我们之后不能使用自动微分,即m3.compile(optimizer='adam', loss='mse') m3.train_on_batch(x,y) 将在某处产生无渐变。
      猜你喜欢
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 2020-10-16
      • 1970-01-01
      • 2019-07-14
      • 1970-01-01
      • 2019-04-07
      相关资源
      最近更新 更多