tensorflow训练模型报错,Invalid JPEG data or crop window, data size 32768

tensorflow训练模型报错,Invalid JPEG data or crop window, data size 32768

报错如下,数据集文件13个G,压缩包重新下个,也重新解压过。尝试过使用一个py文件删除有损的jpg文件

训练多次都是第一轮百分百的时候报这个错误,用这个代码训练其他两个比较小的数据集没报错
报错信息如下

img

import tensorflow as tf
import matplotlib.pyplot as plt
from time import *


# 加载数据集,按照8比2的比例划分数据集,其中8份作为训练集,2份作为验证集
def data_load(data_dir, img_height, img_width, batch_size):
    train_ds = tf.keras.preprocessing.image_dataset_from_directory(
        data_dir,
        label_mode='categorical',
        validation_split=0.2,  # 数据集划分比例
        subset="training",  # 选择训练集
        seed=123,
        color_mode="rgb",
        image_size=(img_height, img_width),
        batch_size=batch_size,

    )

    val_ds = tf.keras.preprocessing.image_dataset_from_directory(
        data_dir,
        label_mode='categorical',
        validation_split=0.2,  # 数据集划分比例
        subset="validation",  # 选择验证集
        seed=123,
        color_mode="rgb",
        image_size=(img_height, img_width),
        batch_size=batch_size,

    )

    class_names = train_ds.class_names
    print(class_names)

    return train_ds, val_ds, class_names


# 获取classname.txt文件中的类名
def load_class_name(data_dir):
    class_names = []
    with open(data_dir + '/classname.txt', 'r', encoding='utf-8') as f:
        lines = f.readlines()
        class_names = [line.strip() for line in lines]

    return class_names


# 模型加载,指定图片处理的大小和是否进行迁移学习
def model_load(IMG_SHAPE=(224, 224, 3), class_num=245):
    # 微调的过程中不需要进行归一化的处理
    base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
                                                   include_top=False,
                                                   weights='imagenet')  # 加载mobilenetv2模型
    base_model.trainable = False  # 将主干的特征提取网络参数进行冻结
    model = tf.keras.models.Sequential([
        tf.keras.layers.experimental.preprocessing.Rescaling(1. / 127.5, offset=-1, input_shape=IMG_SHAPE),
        # 归一化处理,将像素值处理为-1到1之间
        base_model,
        tf.keras.layers.GlobalAveragePooling2D(),  # 全局平均池化
        tf.keras.layers.Dense(class_num, activation='softmax')  # 设置最后的全连接层,用于分类
    ])
    model.summary()  # 输出模型信息
    # 模型训练
    model.compile(optimizer='adam', loss='categorical_crossentropy',
                  metrics=['accuracy'])  # 用于编译模型,指定模型的优化器是adam优化器,模型的损失函数是交叉熵损失函数
    return model  # 返回模型


# 展示训练过程的曲线
def show_loss_acc(history):
    # 从history参数中提取准确率和误差信息
    acc = history.history['accuracy']
    val_acc = history.history['val_accuracy']

    loss = history.history['loss']
    val_loss = history.history['val_loss']
    # 绘制准确率曲线图
    plt.figure(figsize=(8, 8))
    plt.subplot(2, 1, 1)
    plt.plot(acc, label='Training Accuracy')
    plt.plot(val_acc, label='Validation Accuracy')
    plt.legend(loc='lower right')
    plt.ylabel('Accuracy')
    plt.ylim([min(plt.ylim()), 1])
    plt.title('Training and Validation Accuracy')
    # 绘制模型误差曲线图
    plt.subplot(2, 1, 2)
    plt.plot(loss, label='Training Loss')
    plt.plot(val_loss, label='Validation Loss')
    plt.legend(loc='upper right')
    plt.ylabel('Cross Entropy')
    plt.title('Training and Validation Loss')
    plt.xlabel('epoch')
    plt.savefig('results_mobilenet_epoch30.png', dpi=100)


# 训练模型主流程
def train(epochs):
    begin_time = time()  # 记录开始时间
    train_ds, val_ds, class_names = data_load("P:/train", 224, 224, 16)  # todo 记录数据集位置,修改为自己的数据集位置
    print(class_names)  # 输出类名
    model = model_load(class_num=len(class_names))  # 加载模型
    history = model.fit(train_ds, validation_data=val_ds, epochs=epochs, verbose=1)  # 开始训练
    model.save("models/mobilenet_265_epoch10Lanrge.h5")  # todo 修改了自己的模型保存位置,保存模型
    end_time = time()  # 记录开始时间
    run_time = end_time - begin_time  # 记录时间花费
    print('该循环程序运行时间:', run_time, "s")  # 输出程序运行时间
    show_loss_acc(history)  # 展示曲线图


if __name__ == '__main__':
    train(epochs=10)  # todo 设置训练的轮数


有可能是数据容量问题,13个G有点大了,可以试试自己对数据集进行初步处理。