import keras
from keras.preprocessing.image import load_img, img_to_array, array_to_img, ImageDataGenerator
from keras.models import Sequential, Model
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense, GlobalAveragePooling2D
from keras.applications import ResNet50
import matplotlib.pyplot as plt
%matplotlib inline
img = load_img("food-binary/Dosa/img103.jpeg")
x = img_to_array(img)
plt.imshow(x/255.)
img_generator = ImageDataGenerator(
validation_split=0.2,
rescale=1./255,
featurewise_std_normalization=True,
vertical_flip=True,
zoom_range=0.4,
featurewise_center=True,
horizontal_flip=True,
rotation_range=90.
)
# ?img_generator.flow_from_directory
def get_batches(path, subset, gen = img_generator,
shuffle=True, batch_size=8, class_mode = "categorical"):
return gen.flow_from_directory(path, target_size=(228, 228),
class_mode=class_mode, shuffle=shuffle, batch_size=batch_size,
subset=subset)
# x
!mkdir preview
x2 = x.reshape((1, ) + x.shape)
i = 0
for batch in img_generator.flow(x2, batch_size = 1, save_to_dir="preview",
save_prefix="cat", save_format="jpeg"):
i += 1
if i > 20:
break
train_generator = get_batches("food-binary/", "training")
val_generator = get_batches("food-binary/", "validation")
base_model = ResNet50(include_top=False, input_shape=(228, 228, 3))
batch_size = 28
x = base_model.output
x.shape
x = GlobalAveragePooling2D()(x)
x.shape
x = Dense(128, activation ="relu")(x)
predictions = Dense(2, activation="softmax")(x)
m = Model(inputs = base_model.input, outputs= predictions)
# m.summary()
m.compile(loss="categorical_crossentropy", optimizer="sgd", metrics=["accuracy"])
m.fit_generator( train_generator,
steps_per_epoch=2000 // batch_size,
epochs = 10,
validation_data = val_generator,
validation_steps = 800 // batch_size)