Python 无法合并多个输入tf.keras模型/错误:图形已断开连接:无法获取张量的值

Python 无法合并多个输入tf.keras模型/错误:图形已断开连接:无法获取张量的值,python,tensorflow,keras,Python,Tensorflow,Keras,在编译tf.keras模型时,我无法理解为什么连接层不使用year\u输入。。 详情: 要连接的3个层的类型为tf.float32 在Tensorflow 2.1.0 GPU上使用Keras函数API 这三层的类型为: 如果我创建的模型没有year\u输入,则模型编译正确 函数调用 错误 --------------------------------------------------------------------------- ValueError回溯(最近一次调用上次) 在()

在编译tf.keras模型时,我无法理解为什么连接层不使用
year\u输入。

详情:

  • 要连接的3个层的类型为
    tf.float32
  • 在Tensorflow 2.1.0 GPU上使用Keras函数API
  • 这三层的类型为:
  • 如果我创建的模型没有
    year\u输入
    ,则模型编译正确
函数调用

错误

---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
4个透镜(系统类别),
5规格最大长度,
---->6标题(最大长度)
5帧
在创建系统分类器模型(df、预训练模型、创建日期df、输出类别nbr、规格最大长度、标题最大长度)中
20输出=tf.keras.layers.Dense(输出类别nbr,激活='sigmoid')(下降)
21
--->22模型=tf.keras.models.model(输入=[标题输入,规格输入],输出=输出)
23 model=tf.keras.models.model(输入=[标题输入,规格输入,年份输入],输出=输出)
24
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training.py in uuuuuuu init_uuuuu(self,*args,**kwargs)
144
145定义初始值(self,*args,**kwargs):
-->146超级(型号,自我)。\uuuuu初始值(*args,**kwargs)
147 keras api量规。获取单元格(“模型”)。设置(真)
148#在此处初始化"分发"策略,因为可以调用
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/network.py in uuuuuuu init_uuuuu(self,*args,**kwargs)
167 kwargs中的“输入”和kwargs中的“输出”:
168#图形网络
-->169自初始化图网络(*args,**kwargs)
170其他:
171#子类网络
/usr/local/lib/python3.6/dist-packages/tensorflow\u core/python/training/tracking/base.py in\u method\u wrapper(self,*args,**kwargs)
455 self._self_setattr_tracking=False#pylint:disable=protected access
456试试:
-->457结果=方法(自身、*args、**kwargs)
458最后:
459 self._self_setattr_tracking=上一个值#pylint:disable=受保护访问
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/network.py in_init_graph_network(self、input、output、name、**kwargs)
322#跟踪网络的节点和层。
323个节点,按深度、层划分的节点,映射图网络(
-->324自输入、自输出)
325自我网络节点=节点
326自。_节点按深度=节点按深度
/usr/local/lib/python3.6/dist-packages/tensorflow\u core/python/keras/engine/network.py in\u map\u graph\u network(输入、输出)
1674“以下前几层”
1675'访问时未出现问题:'+
->1676 str(带有完整输入的图层)
1677用于嵌套中的x。展平(节点。输出_张量):
1678可计算的_张量。加(id(x))
ValueError:图形已断开连接:无法获取层“year\u input\u ll”处的张量张量值(“year\u input\u ll\u 11:0”,shape=(无,5),dtype=float32)。访问以下以前的层时没有问题:[“规范输入”、“标题输入”、“tf\U distil\u bert\u model\u 2”、“tf\u distil\u bert\u model\u 2”、“全局平均值\u poolg1d\u 72”、“全局平均值\u poolg1d\u 73']
此代码适用于:

def create_system_classifier_model(df, pretrain_model, create_date_df, 
                                   output_cat_nbr, spec_max_length, heading_max_length):

    heading_input = tf.keras.layers.Input((heading_max_length,), name="heading_input", dtype=tf.int32)
    spec_input = tf.keras.layers.Input((spec_max_length,), name="spec_input", dtype=tf.int32)
    year_input_ts = tf.keras.layers.Input((5,), name="year_input_ll", dtype=tf.float32)

    spec_embedding = pretrain_model(heading_input)[0]
    heading_embedding = pretrain_model(spec_input)[0]

    heading_pool_ts = tf.keras.layers.GlobalAveragePooling1D()(spec_embedding)
    spec_pool_ts = tf.keras.layers.GlobalAveragePooling1D()(heading_embedding)

    concat = tf.keras.layers.concatenate([heading_pool_ts, spec_pool_ts, year_input_ts], axis=1)

    dense_ts_1 = tf.keras.layers.Dense(768, activation='relu', name='dense_ts_1')(concat)
    dense_ts_2 = tf.keras.layers.Dense(768, activation='relu', name='dense_ts_2')(dense_ts_1)
    dense_ts_3 = tf.keras.layers.Dense(768, activation='relu', name='dense_ts_3')(dense_ts_2)
    drop_ts = tf.keras.layers.Dropout(0.2)(dense_ts_3)
    output_ts = tf.keras.layers.Dense(output_cat_nbr, activation='sigmoid')(drop_ts)

    model = tf.keras.models.Model(inputs=[heading_input, spec_input, year_input], outputs=output_ts)

    return model
此代码适用于:

def create_system_classifier_model(df, pretrain_model, create_date_df, 
                                   output_cat_nbr, spec_max_length, heading_max_length):

    heading_input = tf.keras.layers.Input((heading_max_length,), name="heading_input", dtype=tf.int32)
    spec_input = tf.keras.layers.Input((spec_max_length,), name="spec_input", dtype=tf.int32)
    year_input_ts = tf.keras.layers.Input((5,), name="year_input_ll", dtype=tf.float32)

    spec_embedding = pretrain_model(heading_input)[0]
    heading_embedding = pretrain_model(spec_input)[0]

    heading_pool_ts = tf.keras.layers.GlobalAveragePooling1D()(spec_embedding)
    spec_pool_ts = tf.keras.layers.GlobalAveragePooling1D()(heading_embedding)

    concat = tf.keras.layers.concatenate([heading_pool_ts, spec_pool_ts, year_input_ts], axis=1)

    dense_ts_1 = tf.keras.layers.Dense(768, activation='relu', name='dense_ts_1')(concat)
    dense_ts_2 = tf.keras.layers.Dense(768, activation='relu', name='dense_ts_2')(dense_ts_1)
    dense_ts_3 = tf.keras.layers.Dense(768, activation='relu', name='dense_ts_3')(dense_ts_2)
    drop_ts = tf.keras.layers.Dropout(0.2)(dense_ts_3)
    output_ts = tf.keras.layers.Dense(output_cat_nbr, activation='sigmoid')(drop_ts)

    model = tf.keras.models.Model(inputs=[heading_input, spec_input, year_input], outputs=output_ts)

    return model

在代码片段中,有两条语句用于
model=…
。把它粘贴到这里是打字错误吗?或者在您的代码中也是如此?这肯定会导致您描述的错误,因为
输入
列表中缺少
year\u输入。@MarkLoyman这是一个打字错误。我改正了。谢谢你指出这一点。你也能更新你发布的错误消息吗?@MarkLoyman,它正在工作。您指出的
Model=
语句的重复解决了问题。。。(在这一点上我并不自豪)谢谢你的帮助。在你的代码片段中,你有两条关于
model=…
的语句。把它粘贴到这里是打字错误吗?或者在您的代码中也是如此?这肯定会导致您描述的错误,因为
输入
列表中缺少
year\u输入。@MarkLoyman这是一个打字错误。我改正了。谢谢你指出这一点。你也能更新你发布的错误消息吗?@MarkLoyman,它正在工作。您指出的
Model=
语句的重复解决了问题。。。(在这件事上我并不自豪)谢谢你的帮助。
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-171-367b40edc46e> in <module>()
      4                                                          len(system_cat_ls),
      5                                                          spec_max_length,
----> 6                                                          heading_max_length)

5 frames
<ipython-input-170-6b485af7c7be> in create_system_classifier_model(df, pretrain_model, create_date_df, output_cat_nbr, spec_max_length, heading_max_length)
     20     output_ts = tf.keras.layers.Dense(output_cat_nbr, activation='sigmoid')(drop_ts)
     21 
---> 22     model = tf.keras.models.Model(inputs=[heading_input, spec_input], outputs=output_ts)
     23     model = tf.keras.models.Model(inputs=[heading_input, spec_input, year_input], outputs=output_ts)
     24 

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training.py in __init__(self, *args, **kwargs)
    144 
    145   def __init__(self, *args, **kwargs):
--> 146     super(Model, self).__init__(*args, **kwargs)
    147     _keras_api_gauge.get_cell('model').set(True)
    148     # initializing _distribution_strategy here since it is possible to call

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/network.py in __init__(self, *args, **kwargs)
    167         'inputs' in kwargs and 'outputs' in kwargs):
    168       # Graph network
--> 169       self._init_graph_network(*args, **kwargs)
    170     else:
    171       # Subclassed network

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/training/tracking/base.py in _method_wrapper(self, *args, **kwargs)
    455     self._self_setattr_tracking = False  # pylint: disable=protected-access
    456     try:
--> 457       result = method(self, *args, **kwargs)
    458     finally:
    459       self._self_setattr_tracking = previous_value  # pylint: disable=protected-access

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/network.py in _init_graph_network(self, inputs, outputs, name, **kwargs)
    322     # Keep track of the network's nodes and layers.
    323     nodes, nodes_by_depth, layers, _ = _map_graph_network(
--> 324         self.inputs, self.outputs)
    325     self._network_nodes = nodes
    326     self._nodes_by_depth = nodes_by_depth

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/network.py in _map_graph_network(inputs, outputs)
   1674                              'The following previous layers '
   1675                              'were accessed without issue: ' +
-> 1676                              str(layers_with_complete_input))
   1677         for x in nest.flatten(node.output_tensors):
   1678           computable_tensors.add(id(x))

ValueError: Graph disconnected: cannot obtain value for tensor Tensor("year_input_ll_11:0", shape=(None, 5), dtype=float32) at layer "year_input_ll". The following previous layers were accessed without issue: ['spec_input', 'heading_input', 'tf_distil_bert_model_2', 'tf_distil_bert_model_2', 'global_average_pooling1d_72', 'global_average_pooling1d_73']
def create_system_classifier_model(df, pretrain_model, create_date_df, 
                                   output_cat_nbr, spec_max_length, heading_max_length):

    heading_input = tf.keras.layers.Input((heading_max_length,), name="heading_input", dtype=tf.int32)
    spec_input = tf.keras.layers.Input((spec_max_length,), name="spec_input", dtype=tf.int32)
    year_input_ts = tf.keras.layers.Input((5,), name="year_input_ll", dtype=tf.float32)

    spec_embedding = pretrain_model(heading_input)[0]
    heading_embedding = pretrain_model(spec_input)[0]

    heading_pool_ts = tf.keras.layers.GlobalAveragePooling1D()(spec_embedding)
    spec_pool_ts = tf.keras.layers.GlobalAveragePooling1D()(heading_embedding)

    concat = tf.keras.layers.concatenate([heading_pool_ts, spec_pool_ts, year_input_ts], axis=1)

    dense_ts_1 = tf.keras.layers.Dense(768, activation='relu', name='dense_ts_1')(concat)
    dense_ts_2 = tf.keras.layers.Dense(768, activation='relu', name='dense_ts_2')(dense_ts_1)
    dense_ts_3 = tf.keras.layers.Dense(768, activation='relu', name='dense_ts_3')(dense_ts_2)
    drop_ts = tf.keras.layers.Dropout(0.2)(dense_ts_3)
    output_ts = tf.keras.layers.Dense(output_cat_nbr, activation='sigmoid')(drop_ts)

    model = tf.keras.models.Model(inputs=[heading_input, spec_input, year_input], outputs=output_ts)

    return model