from tensorflow.keras import Sequential
from tensorflow.keras.layers import Conv2D, Flatten, Dense, AvgPool2D
import matplotlib.pyplot as plt
import numpy as np
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprocessing.image import ImageDataGenerator
optimizer = Adam(lr=0.01)
datagen = ImageDataGenerator(validation_split=0.25, rescale=1/255)
def load_train(path):
train_datagen_flow = datagen.flow_from_directory(
'/datasets/fruits_small/',
target_size=(150, 150),
batch_size=16,
class_mode='sparse',
subset='training',
seed=12345)
return train_datagen_flow
def create_model(input_shape):
model = Sequential()
model.add(Conv2D(6, (3, 3), padding='same', activation='relu',
input_shape=(150, 150, 3)))
model.add(AvgPool2D(pool_size=(2, 2)))
model.add(Conv2D(filters=16, kernel_size=(5, 5), padding='same',
activation="relu"))
model.add(AvgPool2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(units=140, activation='relu'))
model.add(Dense(units=84, activation='relu'))
model.add(Dense(units=12, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer=optimizer, metrics=['acc'])
return model
def train_model(model, train_data, test_data, batch_size=None, epochs=1,
steps_per_epoch=None, validation_steps=None):
if steps_per_epoch is None:
steps_per_epoch = len(train_data)
if validation_steps is None:
validation_steps = len(test_data)
model.fit(train_data,
validation_data=test_data,
batch_size=batch_size, epochs=epochs,
steps_per_epoch=steps_per_epoch,
validation_steps=validation_steps,
verbose=2)
return model