from tensorflow.keras.layers import Dense, GlobalAveragePooling2D
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.applications.resnet import ResNet50
#import numpy as np
#import os
def load_train(path):
dataframe = pd.read_csv(path + '/labels.csv')
train_datagen = ImageDataGenerator(validation_split=0.25,
rescale=1. / 255)
train_datagen_flow = train_datagen.flow_from_dataframe(
dataframe,
directory=path + '/final_files',
x_col='file_name',
y_col='real_age',
target_size=(150, 150),
batch_size=16,
class_mode='raw',
subset='training',
seed=12345)
return train_datagen_flow
def load_test(path):
dataframe = pd.read_csv(path + '/labels.csv')
train_datagen = ImageDataGenerator(validation_split=0.25,
rescale=1. / 255)
test_datagen_flow = test_datagen.flow_from_dataframe(
dataframe,
directory=path + '/final_files',
x_col='file_name',
y_col='real_age',
target_size=(150, 150),
batch_size=16,
class_mode='raw',
subset='validation',
seed=12345)
return test_datagen_flow
def create_model(input_shape):
backbone = ResNet50(input_shape=input_shape,
weights='imagenet',
include_top=False)
model = Sequential()
model.add(backbone)
model.add(GlobalAveragePooling2D())
model.add(Dense(1, activation='relu'))
optimizer = Adam(lr=0.00001)
model.compile(optimizer=optimizer, loss='mse', metrics=['mae'])
return model
def train_model(model, train_data, test_data, batch_size=None, epochs=20, steps_per_epoch=None, validation_steps=None):
test_gen_flow = test_data
if steps_per_epoch is None:
steps_per_epoch = len(train_data)
if validation_steps is None:
validation_steps = len(test_gen_flow)
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, shuffle=True)
return model