import cv2
import re
import os
import shutil
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.applications import resnet
from tensorflow.keras.utils import plot_model
from tensorflow.keras.layers import Input,GlobalAvgPool2D,Dense,Dropout
from tensorflow.keras.models import Model
from tensorflow.keras.losses import SparseCategoricalCrossentropy
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import ModelCheckpoint,TensorBoard,EarlyStopping
import matplotlib.pyplot as plt
dataAll=ImageDataGenerator(validation_split=0.3)
genIteratorForTrain=dataAll.flow_from_directory("D:/17flowers",batch_size=32,subset="training",class_mode='sparse')
genIteratorForText=dataAll.flow_from_directory("D:/17flowers",batch_size=32,subset="validation",class_mode='sparse')
shape_in=genIteratorForTrain.next()[0].shape[1:]
model=Dense(100)
inputs=Input(shape=shape_in)
x=model(inputs)
x=GlobalAvgPool2D()(x)
x=Dense(units=17)(x)
x=Dropout(rate=0.5)(x)
model2=Model(inputs = inputs, outputs = x)
plot_model(model2,to_file="text.png",show_shapes=True)
Ep = EarlyStopping(monitor='val_loss',min_delta=1, patience=5, restore_best_weights=True,baseline=5)
checkPoint=ModelCheckpoint(filepath='{epoch:02d}-{sparse_categorical_accuracy:.4f}.h5',
monitor='val_sparse_categorical_accuracy',
verbose=1,
save_best_only=True)
model2.compile(optimizer=Adam(lr=0.001),loss=SparseCategoricalCrossentropy(from_logits=True),metrics=['sparse_categorical_accuracy'])
history=model2.fit(x=genIteratorForTrain,validation_data=genIteratorForText,
callbacks=[checkPoint,Ep],validation_freq=1,epochs=2000)
plt.plot(history.history['sparse_categorical_accuracy'], label='sparse_categorical_accuracy')
plt.plot(history.history['val_sparse_categorical_accuracy'], label='val_sparse_categorical_accuracy')
plt.plot(history.history['val_loss'], label='val_loss')
plt.show()