model.fit validation_set ValueError:DataFrame 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()

Posted

技术标签:

【中文标题】model.fit validation_set ValueError:DataFrame 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()【英文标题】:model.fit validation_set ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all() 【发布时间】:2021-11-28 19:53:03 【问题描述】:

看起来 train.df 期望验证数据集使用不同类型的数据或结构,但我不知道该怎么做,因为这是我第一次使用在文件夹中包含所有图像的 dataset ,然后是 metadata.csv 和训练、测试和验证 .txts。 txt 列的格式为:

photo.png_string, diagnostic_number, xmin_number, xmax_number, ymin_number, ymax_number

数据帧显示为 dtype:int64

我正在从每个 .txt 中加载训练、测试和验证:

train_df = pd.read_csv('/location/.txt', sep=" ", header=None)

另外,边界框对我没有用,因为我想做一个没有分割的分类任务,所以我从每个 .txt 中删除 xmin、xmax、ymin 和 ymax

我正在尝试使用这个简单的模型作为开始的基础:

num_classes = 3

model = tf.keras.Sequential([
  tf.keras.layers.Rescaling(1./255),
  tf.keras.layers.Conv2D(32, 3, activation='gelu'),
  tf.keras.layers.MaxPooling2D(),
  tf.keras.layers.Conv2D(32, 3, activation='gelu'),
  tf.keras.layers.MaxPooling2D(),
  tf.keras.layers.Conv2D(32, 3, activation='gelu'),
  tf.keras.layers.MaxPooling2D(),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='gelu'),
  tf.keras.layers.Dense(num_classes)
])

model.compile(
  optimizer='adam',
  loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
  metrics=['accuracy'])

model.fit(
  train_df,
  validation_data=val_df,
  epochs=25
)

当我尝试执行此单元格时,它会返回:

ValueError                                Traceback (most recent call last)
/tmp/ipykernel_9779/2327921962.py in <module>
     19   metrics=['accuracy'])
     20 
---> 21 model.fit(
     22   train_df,
     23   validation_data=val_df,

/usr/lib/python3.9/site-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)
   1121               (x, y, sample_weight), validation_split=validation_split))
   1122 
-> 1123     if validation_data:
   1124       val_x, val_y, val_sample_weight = (
   1125           data_adapter.unpack_x_y_sample_weight(validation_data))

/usr/lib/python3.9/site-packages/pandas/core/generic.py in __nonzero__(self)
   1535     @final
   1536     def __nonzero__(self):
-> 1537         raise ValueError(
   1538             f"The truth value of a type(self).__name__ is ambiguous. "
   1539             "Use a.empty, a.bool(), a.item(), a.any() or a.all()."

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

什么是理解我应该将数据转换为接受为输入的类型、张量或数组的正确方法?

谢谢!

【问题讨论】:

您模型的 fit 函数不期望 validation_data 参数的 Pandas 数据框。 tensorflow.org/api_docs/python/tf/keras/Sequential#fit 【参考方案1】:

试试吧:

model.fit(train_df.values,
          validation_data=val_df.values,
          epochs=25)

【讨论】:

以上是关于model.fit validation_set ValueError:DataFrame 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()的主要内容,如果未能解决你的问题,请参考以下文章

model.predict() 和 model.fit() 做啥?

keras.models.Model.fit 中的“时代”是啥?

同时运行 model.fit() 和 TensorBoard?

history=model.fit_generator() 为啥 keras 历史是空的?

保存不同时期的 model.fit 历史

如何修改 model.fit 设置?