Keras (twenty-one) 10monkeys basic model and data enhancement

This article will introduce:

  • 10monkeys basic model construction and training
  • Keras implements data enhancement

One, download kaggle-10monkey data

The following link to download the dataset to a local directory intputin
kaggle-10monkey Download

Second, use ImageDataGenerator in keras to read data and enhance data

1. Instantiate ImageDataGenerator
# 对于图片数据,在keras里有更高层的封装.读取数据且做数据增强 -> Generator
train_datagen = keras.preprocessing.image.ImageDataGenerator(
    rescale = 1./255,    # 图像中的每个像素点都是在0~255之间,得到一个0~1之间的数
    rotation_range = 40,    # 图片增强的方法,把图片随机旋转一个角度,旋转的角度就在-40~40之间
    width_shift_range = 0.2,    # 做水平位移 - 增加位移鲁棒性(如果0~1之间则位移比例随机选数做位移;如果大于1,则是具体的像素大小)
    height_shift_range = 0.2,   # 做垂直位移 - 增加位移鲁棒性(如果0~1之间则位移比例随机选数做位移;如果大于1,则是具体的像素大小)
    shear_range = 0.2,  # 剪切强度
    zoom_range = 0.2,   # 缩放强度
    horizontal_flip = True, # 是否随机做水平翻转
    fill_mode = 'nearest',  # 填充像素规则,用离其最近的像素点做填充
)
2. Use ImageDataGenerator to read pictures
# 从训练集的文件夹中读取图片
train_generator = train_datagen.flow_from_directory(train_dir,# 图片的文件夹位置
                                                   target_size = (height, width),# 将图片缩放到的大小
                                                   batch_size = batch_size, # 多少张为一组
                                                   seed = 7,#随机数种子
                                                   shuffle = True,# 是否做混插
                                                   class_mode = "categorical")  # 控制目标值label的形式-选择onehot编码后的形式 
# 从验证集的文件夹中读取图片
valid_datagen = keras.preprocessing.image.ImageDataGenerator(rescale = 1./255)
valid_generator = valid_datagen.flow_from_directory(valid_dir,
                                                    target_size = (height, width),
                                                    batch_size = batch_size,
                                                    seed = 7,
                                                    shuffle = False,
                                                    class_mode = "categorical")
3. Check how many pieces of data are in the trainer and validation set respectively
train_num = train_generator.samples
valid_num = valid_generator.samples
print(train_num, valid_num)
4. How to read data from ImageDataGenerator
for i in range(1):
    x, y = train_generator.next()
    print(x.shape, y.shape)
    print(y)

Three, define the model

1. Define the model
model = keras.models.Sequential([
    keras.layers.Conv2D(filters=32, kernel_size=3, padding='same',
                        activation='relu', input_shape=[width, height, channels]),
    keras.layers.Conv2D(filters=32, kernel_size=3, padding='same',
                        activation='relu'),
    keras.layers.MaxPool2D(pool_size=2),
    
    keras.layers.Conv2D(filters=64, kernel_size=3, padding='same',
                        activation='relu'),
    keras.layers.Conv2D(filters=64, kernel_size=3, padding='same',
                        activation='relu'),
    keras.layers.MaxPool2D(pool_size=2),
    
    keras.layers.Conv2D(filters=128, kernel_size=3, padding='same',
                        activation='relu'),
    keras.layers.Conv2D(filters=128, kernel_size=3, padding='same',
                        activation='relu'),
    keras.layers.MaxPool2D(pool_size=2),
    
    keras.layers.Flatten(),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(num_classes, activation='softmax'),
])

model.compile(loss="categorical_crossentropy",
              optimizer="adam", metrics=['accuracy'])   # adam是更高级一些的优化器,更快速且稳定
2. View the model structure
model.summary()

Four, training model

epochs = 20
history = model.fit_generator(train_generator,
                              steps_per_epoch = train_num // batch_size,
                              epochs = epochs,
                              validation_data = valid_generator,
                              validation_steps = valid_num // batch_size)

Five, print model training curve

def plot_learning_curves(history, label, epcohs, min_value, max_value):
    data = {
    
    }
    data[label] = history.history[label]
    data['val_'+label] = history.history['val_'+label]
    pd.DataFrame(data).plot(figsize=(8, 5))
    plt.grid(True)
    plt.axis([0, epochs, min_value, max_value])
    plt.show()
    
plot_learning_curves(history, 'accuracy', epochs, 0, 1)
plot_learning_curves(history, 'loss', epochs, 1.5, 2.5)

Six, summarize the code

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd
import sklearn
import sys
import tensorflow as tf
import time
from tensorflow import keras

# 打印使用的python库的版本信息
print(tf.__version__)
print(sys.version_info)
for module in mpl, np, pd, sklearn, tf, keras:
    print(module.__name__, module.__version__)
    
# 常量的定义
train_dir = "./input/training/training"
valid_dir = "./input/validation/validation"
label_file = "./input/monkey_labels.txt"
print(os.path.exists(train_dir))
print(os.path.exists(valid_dir))
print(os.path.exists(label_file))
print(os.listdir(train_dir))
print(os.listdir(valid_dir))

# 查看打印出来的label值
labels = pd.read_csv(label_file, header=0)
print(labels)

# 定义常量
height = 128
width = 128
channels = 3
batch_size = 64
num_classes = 10

# 一,使用keras中ImageDataGenerator读取数据
# 1,实例化ImageDataGenerator
# 对于图片数据,在keras里有更高层的封装.读取数据且做数据增强 -> Generator
train_datagen = keras.preprocessing.image.ImageDataGenerator(
    rescale = 1./255,    # 图像中的每个像素点都是在0~255之间,得到一个0~1之间的数
    rotation_range = 40,    # 图片增强的方法,把图片随机旋转一个角度,旋转的角度就在-40~40之间
    width_shift_range = 0.2,    # 做水平位移 - 增加位移鲁棒性(如果0~1之间则位移比例随机选数做位移;如果大于1,则是具体的像素大小)
    height_shift_range = 0.2,   # 做垂直位移 - 增加位移鲁棒性(如果0~1之间则位移比例随机选数做位移;如果大于1,则是具体的像素大小)
    shear_range = 0.2,  # 剪切强度
    zoom_range = 0.2,   # 缩放强度
    horizontal_flip = True, # 是否随机做水平翻转
    fill_mode = 'nearest',  # 填充像素规则,用离其最近的像素点做填充
)
# 2,使用ImageDataGenerator读取图片
# 从训练集的文件夹中读取图片
train_generator = train_datagen.flow_from_directory(train_dir,# 图片的文件夹位置
                                                   target_size = (height, width),# 将图片缩放到的大小
                                                   batch_size = batch_size, # 多少张为一组
                                                   seed = 7,#随机数种子
                                                   shuffle = True,# 是否做混插
                                                   class_mode = "categorical")  # 控制目标值label的形式-选择onehot编码后的形式 
# 从验证集的文件夹中读取图片
valid_datagen = keras.preprocessing.image.ImageDataGenerator(rescale = 1./255)
valid_generator = valid_datagen.flow_from_directory(valid_dir,
                                                    target_size = (height, width),
                                                    batch_size = batch_size,
                                                    seed = 7,
                                                    shuffle = False,
                                                    class_mode = "categorical")
# 3,查看训练家和验证集分别有多少张数据
train_num = train_generator.samples
valid_num = valid_generator.samples
print(train_num, valid_num)

# 4,如何从ImageDataGenerator中读取数据
for i in range(1):
    x, y = train_generator.next()
    print(x.shape, y.shape)
    print(y)

    
# 二,定义模型
model = keras.models.Sequential([
    keras.layers.Conv2D(filters=32, kernel_size=3, padding='same',
                        activation='relu', input_shape=[width, height, channels]),
    keras.layers.Conv2D(filters=32, kernel_size=3, padding='same',
                        activation='relu'),
    keras.layers.MaxPool2D(pool_size=2),
    
    keras.layers.Conv2D(filters=64, kernel_size=3, padding='same',
                        activation='relu'),
    keras.layers.Conv2D(filters=64, kernel_size=3, padding='same',
                        activation='relu'),
    keras.layers.MaxPool2D(pool_size=2),
    
    keras.layers.Conv2D(filters=128, kernel_size=3, padding='same',
                        activation='relu'),
    keras.layers.Conv2D(filters=128, kernel_size=3, padding='same',
                        activation='relu'),
    keras.layers.MaxPool2D(pool_size=2),
    
    keras.layers.Flatten(),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(num_classes, activation='softmax'),
])

model.compile(loss="categorical_crossentropy",
              optimizer="adam", metrics=['accuracy'])   # adam是更高级一些的优化器,更快速且稳定
model.summary()


# 三,训练模型
epochs = 20
history = model.fit_generator(train_generator,
                              steps_per_epoch = train_num // batch_size,
                              epochs = epochs,
                              validation_data = valid_generator,
                              validation_steps = valid_num // batch_size)

# 四,打印训练曲线
print(history.history.keys())
def plot_learning_curves(history, label, epcohs, min_value, max_value):
    data = {
    
    }
    data[label] = history.history[label]
    data['val_'+label] = history.history['val_'+label]
    pd.DataFrame(data).plot(figsize=(8, 5))
    plt.grid(True)
    plt.axis([0, epochs, min_value, max_value])
    plt.show()

plot_learning_curves(history, 'accuracy', epochs, 0, 1)
plot_learning_curves(history, 'loss', epochs, 0, 2.5)


Guess you like

Origin blog.csdn.net/TFATS/article/details/114141403