python - 带有生成器错误的 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
由于我是分段的新手,我不太确定我需要注意的细微差别可能与分类不同。有什么明显的我错过了吗?
解决方案
我现在在猜测,但.fit()
需要数据、tf.data.Dataset
结构或 data_generator(我不太熟悉)。但是,您在 return 时传递了一个元组,这是不能用于训练zip(train_image_generator, train_mask_generator)
的格式.fit()
推荐阅读
- python - django模板渲染慢
- c# - 我可以在 ASP.NET Core 项目上使用带有 web.config 的 URL 重写吗?
- javascript - 计算低潮和高潮之间时间的算法
- javascript - 按照文档,我无法创建 Vue.js 3 的实例
- asp.net-mvc - 什么时候不会查看返回 id 到控制器?
- sql - 带有时间戳表达式的已保存视图
- javascript - 通过 Javascript 中的 for 循环创建多维数组
- python - 如何将具有相同名称的文件夹递归复制到 Google Colab 中的另一个文件夹
- javascript - 如何仅为 Android 用户显示 Shopify 商店
- ios - webview_flutter 主线程检查器:在后台线程上调用的 UI API: