如何用Keras从图像文件名提取标签用于字母分类CNN训练?
实现方法
完全可以通过提取文件名的方式生成标签完成训练,具体实现步骤如下:
- 第一步:按你现有逻辑加载训练、验证无标签数据集,同时保留文件路径映射
- 第二步:编写标签提取函数,从文件路径中解析出对应的字母标签并转成分类可用的数值编码
- 第三步:将原始图像数据集和标签做绑定,生成最终可用于训练的带标签数据集
完整代码示例
首先加载基础数据集:
import tensorflow as tf import string import os # 定义字母到数值的映射表,a对应0,z对应25 char_to_label = {char: idx for idx, char in enumerate(string.ascii_lowercase)} batch_size = 32 # 可按你自己的参数调整 directory = "你的数据集主目录路径" # 加载训练集 train_ds = tf.keras.preprocessing.image_dataset_from_directory( directory, label_mode=None, validation_split=0.2, subset="training", seed=123, image_size=(32, 32), batch_size=batch_size ) # 加载验证集 val_ds = tf.keras.preprocessing.image_dataset_from_directory( directory, label_mode=None, validation_split=0.2, subset="validation", seed=123, image_size=(32, 32), batch_size=batch_size )
再完成标签提取和数据集绑定:
def extract_label(file_path): # 从路径中拆分出文件名 file_name = tf.strings.split(file_path, os.path.sep)[-1] # 取文件名第一个字符作为字母标签 char = tf.strings.substr(file_name, 0, 1) # 转成对应的数值标签 label = char_to_label[char.numpy().decode('utf-8')] return label # 生成训练集的标签数据集 train_file_paths = train_ds.file_paths train_labels = [extract_label(path) for path in train_file_paths] train_label_ds = tf.data.Dataset.from_tensor_slices(train_labels) # 生成验证集的标签数据集 val_file_paths = val_ds.file_paths val_labels = [extract_label(path) for path in val_file_paths] val_label_ds = tf.data.Dataset.from_tensor_slices(val_labels) # 把原始图像数据集和标签数据集做合并,最终的数据集格式为(图像, 标签) train_ds = tf.data.Dataset.zip((train_ds, train_label_ds)) val_ds = tf.data.Dataset.zip((val_ds, val_label_ds)) # 后续可正常添加shuffle、prefetch等数据集优化操作 train_ds = train_ds.shuffle(1000).prefetch(tf.data.AUTOTUNE) val_ds = val_ds.prefetch(tf.data.AUTOTUNE)
注意事项
- 如果文件名首字母存在大写情况,需要先统一转成小写再做映射
- 如果你使用的TensorFlow版本较低,无法直接通过
file_paths属性拿到路径,可以改用tf.data.Dataset.list_files先遍历所有文件,再自行拆分训练验证集,核心逻辑一致
内容的提问来源于stack exchange,提问作者khashayar ehteshami
相关产品推荐
相关产品推荐

