首页 > 解决方案 > 如何设置 Keras 层以在返回元组中包含“无”

问题描述

我正在尝试制作一个None在其元组中返回的 Keras 层。

class transformer_IO(tf.keras.layers.Layer):
  def call(self, input):
    return (input, None, None, None)

但是,当我尝试使用此错误进行编译时,我得到

AttributeError:“NoneType”对象没有属性“形状”

这是一个例子

!pip install transformers
from transformers import TFBertModel
import tensorflow as tf
from copy import deepcopy

class transformer_IO(tf.keras.layers.Layer):
  def call(self, input):
    return (input, None, None, None)
    
def get_functional_model_protoFix():
    bioRoberta_f = TFBertModel.from_pretrained('bert-base-uncased', from_pt=True)

    Q_Tlayer0_f = deepcopy(bioRoberta_f.layers[0].encoder.layer[8])
    Q_Tlayer0_f._name = Q_Tlayer0_f._name + 'Query_f'

    Q_Tlayer1_f = deepcopy(bioRoberta_f.layers[0].encoder.layer[9])
    Q_Tlayer1_f._name = Q_Tlayer1_f._name + 'Query_f'

    transIO = transformer_IO()

    inputIds = tf.keras.Input(shape=(None,), dtype=tf.int32, name='input_Q') 
    
    Q_outputs = bioRoberta_f(inputIds)[0]
    Q_outputs = transIO(Q_outputs)
    Q_outputs = Q_Tlayer0_f(Q_outputs)[0]
    Q_outputs = transIO(Q_outputs)
    Q_outputs = Q_Tlayer1_f(Q_outputs)[0]

    modelNew = tf.keras.Model(inputs=inputIds, outputs=Q_outputs)

    return modelNew

model_functional = get_functional_model_protoFix()
model_functional.compile(loss=loss_fn,
                optimizer=tfa.optimizers.AdamW(weight_decay=1e-4, learning_rate=1e-5, 
                                                epsilon=1e-06))

完整的错误信息

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-35-a029c18cecf9> in <module>()
----> 1 model_functional_new = get_functional_model_protoFix()
      2 model_functional_new.compile(loss=loss_fn,
      3                 optimizer=tfa.optimizers.AdamW(weight_decay=1e-4, learning_rate=1e-5, 
      4                                                 epsilon=1e-06))

7 frames
<ipython-input-34-693ee085f848> in get_functional_model_protoFix()
     13 
     14     Q_outputs = bioRoberta_f(inputIds)[0]
---> 15     Q_outputs = transIO(Q_outputs)
     16     Q_outputs = Q_Tlayer0_f(Q_outputs)[0]
     17     Q_outputs = transIO(Q_outputs)

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/base_layer.py in __call__(self, *args, **kwargs)
    952               kwargs.pop('mask')
    953             inputs, outputs = self._set_connectivity_metadata_(
--> 954                 inputs, outputs, args, kwargs)
    955           self._handle_activity_regularization(inputs, outputs)
    956           self._set_mask_metadata(inputs, outputs, input_masks)

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/base_layer.py in _set_connectivity_metadata_(self, inputs, outputs, args, kwargs)
   2312     # This updates the layer history of the output tensor(s).
   2313     self._add_inbound_node(
-> 2314         input_tensors=inputs, output_tensors=outputs, arguments=arguments)
   2315     return inputs, outputs
   2316 

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/base_layer.py in _add_inbound_node(self, input_tensors, output_tensors, arguments)
   2342         input_tensors=input_tensors,
   2343         output_tensors=output_tensors,
-> 2344         arguments=arguments)
   2345 
   2346     # Update tensor history metadata.

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/node.py in __init__(self, outbound_layer, inbound_layers, node_indices, tensor_indices, input_tensors, output_tensors, arguments)
    108     self.input_shapes = nest.map_structure(backend.int_shape, input_tensors)
    109     # Nested structure of shape tuples, shapes of output_tensors.
--> 110     self.output_shapes = nest.map_structure(backend.int_shape, output_tensors)
    111 
    112     # Optional keyword arguments to layer's `call`.

/usr/local/lib/python3.6/dist-packages/tensorflow/python/util/nest.py in map_structure(func, *structure, **kwargs)
    615 
    616   return pack_sequence_as(
--> 617       structure[0], [func(*x) for x in entries],
    618       expand_composites=expand_composites)
    619 

/usr/local/lib/python3.6/dist-packages/tensorflow/python/util/nest.py in <listcomp>(.0)
    615 
    616   return pack_sequence_as(
--> 617       structure[0], [func(*x) for x in entries],
    618       expand_composites=expand_composites)
    619 

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/backend.py in int_shape(x)
   1201   """
   1202   try:
-> 1203     shape = x.shape
   1204     if not isinstance(shape, tuple):
   1205       shape = tuple(shape.as_list())

AttributeError: 'NoneType' object has no attribute 'shape'

标签: tensorflowkeras

解决方案


推荐阅读