【问题标题】:ValueError: Graph disconnected. ······ The following previous layers were accessed without issue: []ValueError:图表已断开连接。 ······ 访问以下以前的层没有问题:[]
【发布时间】:2021-01-31 13:20:04
【问题描述】:

我想实现一个复杂的模型,但是它不起作用,卡在输入层。我已经简化了代码,下面是一个例子:

from keras.layers import *
from keras.models import Model
from keras import backend as K

def build_model():
    label_num = 4
    max_len = 50
    # shape = (B, label_num, max_len)
    label_inputs = Input((label_num, max_len))

    # shape = (B*label_num, max_len)
    reshape_input = Lambda(lambda x: K.reshape(x, (-1, max_len)))(label_inputs)

    dense = Dense(10)(reshape_input)

    model = Model(reshape_input, dense)
    # do another things
    return model


if __name__ == '__main__':
    build_model()

错误表明:

File "####################\test.py", line 21, in build_model
    model = Model(label_inputs, model1_dense)
  File "####################\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)
  File "####################\lib\site-packages\keras\engine\network.py", line 93, in __init__
    self._init_graph_network(*args, **kwargs)
  File "####################\lib\site-packages\keras\engine\network.py", line 231, in _init_graph_network
    self.inputs, self.outputs)
  File "####################\lib\site-packages\keras\engine\network.py", line 1443, in _map_graph_network
    str(layers_with_complete_input))
ValueError: Graph disconnected: cannot obtain value for tensor Tensor("input_1:0", shape=(?, 4, 50), dtype=float32) at layer "input_1". The following previous layers were accessed without issue: []

复杂模型包含两个不同batch_size的输入张量,但是keras有一个batch_size函数来检查每个输入张量是否有相同的batch_size。所以我必须用相同的batch_size对数据进行预处理,在喂给模型之后,我应该像上面的代码'reshape_input'一样重塑输入张量之一。

我该如何解决?非常感谢。

【问题讨论】:

  • 您的数据根本不应该有 batch_size。分批是 keras 实现随机梯度下降的一部分。它与数据无关
  • 我已经解决了我的问题,因为我使用了动态输入层。实际上,这个问题的背景是,一个句子嵌入的模型(称为sentence_model),另一个是标签嵌入(称为label_model)。我使用类似连体或三元组的网络架构来计算句子和标签之间的相似度。一个句子对应一个positive_label,为了让整个模型收敛,我应该至少创建一个negative_label样本。
  • 假设 sentence_model 的 batch_size 叫做 bs,label_model 会喂一个 positive_label 和 n 个negative_labels,总共 n+1。所以输入数据的形状是[(bs,seq_len),(bs, n+1, seq_len)]。
  • 我应该将 (bs, n+1, seq_len) 重塑为 (bs*(n+1), seq_len),并将数据提供给 label_model。

标签: python tensorflow keras deep-learning nlp


【解决方案1】:

Model() 调用的第一个参数应该是Input() 层。

改变这一行:

model = Model(label_inputs, dense)

【讨论】:

  • 注释“Model() 调用的第一个参数应该是 Input() 层。”提醒了我,我应该尽量让模型有一个动态输入层以便重用。还是谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多