基于Keras EfficientNet的早晚图像分类两大技术问题咨询
自定义「早晨/傍晚」图像分类问题解答
问题一:如何修改tfds.load(dataset_name, data_dir="gs://example-bucket/datapath")适配本地GPU测试?
针对原代码的修改很直接:
- 把
data_dir参数从GCS云存储路径(gs://xxx)替换为本地数据集存储路径,比如本地文件夹./my_local_dataset,修改后代码为:
如果本地还没有该数据集,tfds.load(dataset_name, data_dir="./my_local_dataset")tfds.load会自动下载到指定的本地目录。 - 直接移除TPU相关的所有代码(包括TPU初始化、分发策略设置等),GPU环境下TensorFlow会自动检测并使用可用的GPU资源,无需额外配置。
另外,如果你的数据是自定义本地图像文件夹(不是TFDS标准数据集),更推荐使用tf.keras.utils.image_dataset_from_directory来加载数据,代码示例:
train_ds = tf.keras.utils.image_dataset_from_directory( "./local_dataset_path", validation_split=0.2, subset="training", seed=123, image_size=(224, 224), batch_size=32)
问题二:解决classification_report样本数量不匹配错误
错误原因
报错中的[106, 100]说明:
labels是整个数据集的所有标签(共106个样本)predictions是对训练集train_x(100个样本)的预测结果
两者样本数量完全不对应,导致报错。
修正方案
需要使用与预测样本对应的真实标签,并将one-hot编码的标签转换为一维类别索引,具体代码如下:
方案1:评估训练集
from sklearn.metrics import classification_report # 对训练集做预测 predIdxs = model.predict(train_x, verbose=1) predictions = np.argmax(predIdxs, axis=1) # 将训练集的one-hot编码真实标签转换为一维索引 train_y_true = np.argmax(train_y, axis=1) # 生成分类报告(target_names为类别名称列表,比如['早晨', '傍晚']) print(classification_report(train_y_true, predictions, target_names=dataset_path))
方案2:评估测试集(更具参考价值)
通常我们会用测试集评估模型性能,代码如下:
from sklearn.metrics import classification_report # 对测试集做预测 predIdxs = model.predict(test_x, verbose=1) predictions = np.argmax(predIdxs, axis=1) # 将测试集的one-hot编码真实标签转换为一维索引 test_y_true = np.argmax(test_y, axis=1) # 生成分类报告 print(classification_report(test_y_true, predictions, target_names=dataset_path))
额外注意
原代码中target_names=dataset_path是合理的,因为dataset_path是你读取的类别名称列表(比如['早晨', '傍晚']),确保它的顺序和LabelEncoder编码的类别顺序一致即可。
内容的提问来源于stack exchange,提问作者SILA
相关产品推荐
相关产品推荐

