首页 > 解决方案 > 带有生成器错误的 TensorFlow 拟合方法。AttributeError:“元组”对象没有属性“形状”

问题描述

我试图在进行重大调整之前建立一个基本的分割模型,无论我做得多么简单,我都会收到这个错误。我正在合作

Found 500 images belonging to 1 classes.
Found 500 images belonging to 1 classes.
Found 50 images belonging to 1 classes.
Found 50 images belonging to 1 classes.
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-23-420c271bfe7a> in <module>()
      3                           steps_per_epoch = (32),
      4                           validation_data=val_generator(),
----> 5                           callbacks=callbacks_list)

10 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/func_graph.py in wrapper(*args, **kwargs)
    971           except Exception as e:  # pylint:disable=broad-except
    972             if hasattr(e, "ag_error_metadata"):
--> 973               raise e.ag_error_metadata.to_exception(e)
    974             else:
    975               raise

AttributeError: in user code:

    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:806 train_function  *
        return step_function(self, iterator)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:796 step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:1211 run
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2585 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2945 _call_for_each_replica
        return fn(*args, **kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:789 run_step  **
        outputs = model.train_step(data)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:759 train_step
        self.compiled_metrics.update_state(y, y_pred, sample_weight)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/compile_utils.py:388 update_state
        self.build(y_pred, y_true)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/compile_utils.py:319 build
        self._metrics, y_true, y_pred)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/util/nest.py:1139 map_structure_up_to
        **kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/util/nest.py:1235 map_structure_with_tuple_paths_up_to
        *flat_value_lists)]
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/util/nest.py:1234 <listcomp>
        results = [func(*args, **kwargs) for args in zip(flat_path_list,
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/util/nest.py:1137 <lambda>
        lambda _, *values: func(*values),  # Discards the path arg.
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/compile_utils.py:419 _get_metric_objects
        return [self._get_metric_object(m, y_t, y_p) for m in metrics]
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/compile_utils.py:419 <listcomp>
        return [self._get_metric_object(m, y_t, y_p) for m in metrics]
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/compile_utils.py:440 _get_metric_object
        y_t_rank = len(y_t.shape.as_list())

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

根据我在网上找到的内容,我认为它与生成器有关,但我无法确定它到底是什么。可能是我也错误地编译了分割模型?(我是这种模型的新手)

这是我的模型

Model: "functional_4"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_4 (InputLayer)         [(None, 1024, 1024, 3)]   0         
_________________________________________________________________
blockx_conv1 (Conv2D)        (None, 1024, 1024, 64)    1792      
_________________________________________________________________
blockx_conv2 (Conv2D)        (None, 1024, 1024, 64)    36928     
_________________________________________________________________
max_pooling2d_6 (MaxPooling2 (None, 512, 512, 64)      0         
_________________________________________________________________
blocky_conv1 (Conv2D)        (None, 512, 512, 128)     73856     
_________________________________________________________________
blocky_conv2 (Conv2D)        (None, 512, 512, 256)     295168    
_________________________________________________________________
max_pooling2d_7 (MaxPooling2 (None, 256, 256, 256)     0         
_________________________________________________________________
blockxy_conv1 (Conv2D)       (None, 256, 256, 512)     1180160   
_________________________________________________________________
dropout_3 (Dropout)          (None, 256, 256, 512)     0         
_________________________________________________________________
blockxy_conv2 (Conv2D)       (None, 256, 256, 1024)    25691136  
_________________________________________________________________
max_pooling2d_8 (MaxPooling2 (None, 128, 128, 1024)    0         
_________________________________________________________________
blockxy_conv3 (Conv2D)       (None, 128, 128, 1024)    1049600   
_________________________________________________________________
blockxy_conv4 (Conv2D)       (None, 128, 128, 3)       3075      
_________________________________________________________________
up_sampling2d_3 (UpSampling2 (None, 1024, 1024, 3)     0         
=================================================================
Total params: 28,331,715
Trainable params: 28,331,715
Non-trainable params: 0

我的编译如下。我认为这也可能是错误的潜在来源,因为我仍然不确定应该使用哪些优化器和损失函数。

model.compile(optimizer='adam', loss='categorical_crossentropy',metrics=['acc','loss','val_loss','val_acc'])

这是我的适合方法。我保持简单以尝试排除故障

results = model.fit(train_generator(), epochs=1, 
                          steps_per_epoch = (32),
                          validation_data=val_generator(),                          
                          callbacks=callbacks_list)

这是我用过的发电机以防万一

def train_generator(batch=16):
  from tensorflow.keras.preprocessing.image import ImageDataGenerator
  train_datagen = ImageDataGenerator(
          rescale=1./255)

  train_image_generator = train_datagen.flow_from_directory(
  '/content/drive/My Drive/Thesis Pics/train_frames/',
  batch_size = batch,
  target_size=(1024,768))

  train_mask_generator = train_datagen.flow_from_directory(
  '/content/drive/My Drive/Thesis Pics/train_masks/',
  batch_size = batch,
  target_size=(1024,768))

  
  train_generator = zip(train_image_generator, train_mask_generator)

  return train_generator

由于我是分段的新手,我不太确定我需要注意的细微差别可能与分类不同。有什么明显的我错过了吗?

标签: pythontensorflowkeras

解决方案


我现在在猜测,但.fit()需要数据、tf.data.Dataset结构或 data_generator(我不太熟悉)。但是,您在 return 时传递了一个元组,这是不能用于训练zip(train_image_generator, train_mask_generator)的格式.fit()


推荐阅读