美文网首页
keras 猫狗大战模型训练和测试

keras 猫狗大战模型训练和测试

作者: 牛奶大泡芙 | 来源:发表于2020-03-29 00:22 被阅读0次

    今天温习了一下keras实现猫狗两种图像分类的功能,具体的代码我贴在下面了:
    训练和loss acc监测:

    from keras import layers
    from keras import models
    from keras import optimizers
    from keras.preprocessing.image import ImageDataGenerator
    import matplotlib.pyplot as plt
    
    model = models.Sequential()
    model.add(layers.Conv2D(32, (3,3), activation='relu', input_shape=(150,150,3)))
    model.add(layers.MaxPooling2D((2,2)))
    model.add(layers.Conv2D(64, (3,3), activation='relu'))
    model.add(layers.MaxPooling2D((2,2)))
    model.add(layers.Conv2D(128, (3,3), activation='relu'))
    model.add(layers.MaxPooling2D((2,2)))
    model.add(layers.Conv2D(128, (3,3), activation='relu'))
    model.add(layers.MaxPooling2D((2,2)))
    model.add(layers.Flatten())
    model.add(layers.Dense(512, activation='relu'))
    model.add(layers.Dense(1, activation='sigmoid'))
    
    model.compile(loss='binary_crossentropy', optimizer=optimizers.RMSprop(lr=1e-4), metrics=['acc'])
    
    # data preprocessing
    base_path = '/Users/**/猫狗图像分类/dogs-vs-cats/'
    test_path = '/Users/**/猫狗图像分类/test_t/'
    
    train_datagen = ImageDataGenerator(rescale=1./255)
    test_datagen = ImageDataGenerator(rescale=1./255)
    
    train_generator = train_datagen.flow_from_directory(
        base_path,
        target_size=(150,150),
        batch_size=64,
        class_mode='binary'
    )
    validation_generator = test_datagen.flow_from_directory(
        test_path,
        target_size=(150,150),
        batch_size=20,
        class_mode='binary'
    )
    history = model.fit_generator(
        train_generator,
        steps_per_epoch=190,
        epochs=10,
        validation_data=validation_generator,
        validation_steps=7  # 从验证生成器中抽取多少个批次用于评估
    )
    
    model.save('catdog.h5')
    
    acc = history.history['acc']
    val_acc = history.history['val_acc']
    loss = history.history['loss']
    val_loss = history.history['val_loss']
    epochs = range(1, len(acc) + 1)
    plt.plot(epochs, acc, 'bo', label='Traing acc')
    plt.plot(epochs, val_acc, 'b', label='Validation acc')
    plt.title('train and val acc')
    plt.legend()
    
    plt.figure()
    
    plt.plot(epochs, loss, 'bo', label='Traing loss')
    plt.plot(epochs, val_loss, 'b', label='Validation loss')
    plt.title('train and val loss')
    plt.legend()
    
    plt.show()
    

    测试过程中loss和acc的图像效果如下:


    loss-acc.png
    train-val acc.png

    关于flow_from_directory函数的参数需要说明一下:
    directory:子文件夹所在的目录
    classes:类别,子文件夹的数量,如['cat', 'dog']
    class_mode:可以是'categorical'
    batch_size
    target_size:输出的图像尺寸如,(150,150)

    下面是测试代码:

    import os
    import numpy as np
    from keras.preprocessing import image
    from keras.models import load_model
    
    base_path = r'/Users/**/猫狗图像分类/dogs-vs-cats/dog'
    model = load_model('catdog.h5')
    num = 100
    files_name = [name for name in os.listdir(base_path) if os.path.splitext(name)[1]=='.jpg']
    sum = 0
    for i in range(num):
        # print()
        f = str(i+1)+'.jpg'
        f = files_name[i]
        # print(f)
        file_path = os.path.join(base_path, f)
    
        img = image.load_img(file_path, target_size=(150, 150))
        x = image.img_to_array(img)
        x = np.expand_dims(x, axis=0)
        y = model.predict_classes(x)
        print(i, ' ', f, ' ', y)
        if y[0][0]:
            sum += 1
    print('sum', sum)
    

    点个小心心在走吧💗

    相关文章

      网友评论

          本文标题:keras 猫狗大战模型训练和测试

          本文链接:https://www.haomeiwen.com/subject/kooeuhtx.html