Ver 2
from keras.models import Sequential
from keras.layers import Conv2D, Dense, MaxPool2D, Flatten, Dropout
from tensorflow.keras import optimizers
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import datetime
batch_size = 32
num_classes = 3
epochs = 30
train_dir = 'images/train'
validation_dir = 'images/test'
image_height, image_weight = 384, 216
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu',
input_shape=(image_height, image_weight, 3)))
model.add(MaxPool2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPool2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPool2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPool2D((2, 2)))
model.add(Flatten())
model.add(Dropout(0.5))
model.add(Dense(512, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['acc'])
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
width_shift_range=10,
height_shift_range=10,
brightness_range=[0.7, 2]
)
validation_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
width_shift_range=10,
height_shift_range=10,
brightness_range=[0.7, 2]
)
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(image_height, image_weight),
batch_size=batch_size,
class_mode='categorical'
)
validation_generator = validation_datagen.flow_from_directory(
validation_dir,
target_size=(image_height, image_weight),
batch_size=batch_size,
class_mode='categorical'
)
from keras.callbacks import ModelCheckpoint
mc = ModelCheckpoint(
filepath='best.h5',
monitor="val_loss",
verbose=1,
save_weights_only=False,
mode='min',
save_best_only=True,
period=1
)
train_step_size = train_generator.n // train_generator.batch_size
validation_step_size = validation_generator.n // validation_generator.batch_size
model.fit_generator(
train_generator,
steps_per_epoch=train_step_size,
epochs=epochs,
validation_data=validation_generator,
validation_steps=validation_step_size,
verbose=1,
callbacks=[mc]
)
Ver 1
データは Fruits 360 dataset | Kaggle
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras import models
from tensorflow.keras import optimizers
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import datetime
from keras.backend.tensorflow_backend import set_session
config = tf.ConfigProto(
gpu_options=tf.GPUOptions(
visible_device_list="0",
allow_growth=True
)
)
set_session(tf.Session(config=config))
batch_size = 32
num_classes = 103
epochs = 20
img_rows, img_cols = 100, 100
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
input_shape=(img_rows, img_cols, 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.Dropout(0.5))
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['acc'])
train_dir = 'works/data/fruits-360/Training'
validation_dir = 'works/data/fruits-360/Test'
train_datagen = ImageDataGenerator(rescale=1./255)
validation_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(img_rows, img_cols),
batch_size=batch_size,
class_mode='categorical'
)
validation_generator = validation_datagen.flow_from_directory(
validation_dir,
target_size=(img_rows, img_cols),
batch_size=batch_size,
class_mode='categorical'
)
log_dir="works/logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M")
tensorboard_callback = tf.keras.callbacks.TensorBoard(
log_dir=log_dir,
histogram_freq=1,
write_grads=True,
write_graph=False)
train_step_size = train_generator.n // train_generator.batch_size
validation_step_size = validation_generator.n // validation_generator.batch_size
model.fit_generator(
train_generator,
steps_per_epoch=train_step_size,
epochs=epochs,
validation_data=validation_generator,
validation_steps=validation_step_size,
verbose=1,
callbacks=[tensorboard_callback]
)
model.save('fruit_1.h5')