Newer
Older
def skip_autoencoder(path_train, path_valid, batch_size, epochs, path_save_model, path_weights_model, weight, plot_name, option, reduction_divisor):
#!/usr/bin/env python3
# -*- coding: utf8 -*-
import ctypes
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '1'
os.environ['TF_ENABLE_XLA'] = '1'
os.environ['TF_ENABLE_AUTO_MIXED_PRECISION'] = '1'
os.environ['TF_ENABLE_CUDNN_RNN_TENSOR_OP_MATH_FP32'] = '1'
os.environ['TF_DISABLE_CUDNN_TENSOR_OP_MATH'] = '1'
os.environ['TF_ENABLE_CUBLAS_TENSOR_OP_MATH_FP32'] = '1'
import numpy as np
import tensorflow as tf
from tensorflow import keras
from keras.layers import Add, Input, Dense, Flatten, Dropout, Conv2D, MaxPooling2D, Conv2DTranspose, LeakyReLU, Reshape, Activation, BatchNormalization, UpSampling2D
from keras.models import Model
from keras.constraints import max_norm
from keras.optimizers import Adam, SGD
from keras.utils import to_categorical, normalize
from keras.callbacks import ModelCheckpoint
from keras import losses
from keras import backend as K
import matplotlib.pyplot as plt
import random
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
try:
tf.config.experimental.set_virtual_device_configuration(gpus[0], [tf.config.experimental.VirtualDeviceConfiguration(memory_limit=4096)])
except RuntimeError as e:
print(e)
# custom generator import
from Generators.DataGenerator_framelength import DataGenerator
def count_files(dir):
return len([1 for x in list(os.scandir(dir)) if x.is_file()])
len_train = count_files(path_train)
len_valid = count_files(path_valid)
# train = os.listdir(path_train)
# train = sorted(train,key=lambda x: (int(x.split("_")[1])))
# valid = os.listdir(path_valid)
# valid = sorted(valid,key=lambda x: (int(x.split("_")[1])))
# generator for train and validation
train_generator = DataGenerator(path_train, option, reduction_divisor, len_train, batch_size, True)
valid_generator = DataGenerator(path_valid, option, reduction_divisor, len_valid, batch_size, True)
# defining input and normalizing and filtering to 5
# conv_0 = Conv2D(filters=32, kernel_size=(1,11), strides=1, padding='valid', kernel_constraint=max_norm(max_norm_value), kernel_initializer='he_normal')(normalized)
conv_1 = Conv2D(filters=32, kernel_size=(1,3),strides=1,padding="valid",kernel_constraint=max_norm(max_norm_value), kernel_initializer="he_normal")(normalized)
leakyrelu_1 = LeakyReLU()(conv_1)
conv_2 = Conv2D(filters=32, kernel_size=(1,3),strides=1,padding="valid",kernel_constraint=max_norm(max_norm_value), kernel_initializer="he_normal")(leakyrelu_1)
leakyrelu_2 = LeakyReLU()(conv_2)
conv_3 = Conv2D(filters=32, kernel_size=(16,1),strides=1,padding="same", kernel_constraint=max_norm(max_norm_value), kernel_initializer="he_normal")(leakyrelu_2)
leakyrelu_3 = LeakyReLU()(conv_3)
maxpool_1 = MaxPooling2D(pool_size=(2,1))(leakyrelu_3)
conv_4 = Conv2D(filters=32, kernel_size=(16,1),strides=1,padding="same", kernel_constraint=max_norm(max_norm_value), kernel_initializer="he_normal")(maxpool_1)
leakyrelu_4 = LeakyReLU()(conv_4)
maxpool_2 = MaxPooling2D(pool_size=(2,1))(leakyrelu_4)
conv_5 = Conv2D(filters=32, kernel_size=(16,1),strides=1,padding="valid", kernel_constraint=max_norm(max_norm_value), kernel_initializer="he_normal")(maxpool_2)
leakyrelu_5 = LeakyReLU()(conv_5)
conv_6 = Conv2D(filters=32, kernel_size=(16,1),strides=1,padding="valid", kernel_constraint=max_norm(max_norm_value), kernel_initializer="he_normal")(leakyrelu_5)
leakyrelu_6 = LeakyReLU()(conv_6)
convtrans_1 = Conv2DTranspose(filters=32, kernel_size=(16,1),strides=1,padding="valid", kernel_constraint=max_norm(max_norm_value), kernel_initializer="he_normal")(leakyrelu_6)
leakyrelu_7 = LeakyReLU()(convtrans_1)
convtrans_2 = Conv2DTranspose(filters=32, kernel_size=(16,1),strides=1, padding="valid", kernel_constraint=max_norm(max_norm_value), kernel_initializer="he_normal")(leakyrelu_7)
leakyrelu_8 = LeakyReLU()(convtrans_2)
skip_1 = Add()([maxpool_2,leakyrelu_8])
up_1 = UpSampling2D(size=(2,1))(skip_1)
conv_7 = Conv2D(filters=32, kernel_size=(16,1), strides=1, padding="same", kernel_constraint=max_norm(max_norm_value), kernel_initializer="he_normal")(up_1)
leakyrelu_9 = LeakyReLU()(conv_7)
skip_2 = Add()([leakyrelu_4,leakyrelu_9])
up_2 = UpSampling2D(size=(2,1))(skip_2)
conv_8 = Conv2D(filters=32, kernel_size=(16,1), strides=1, padding="same", kernel_constraint=max_norm(max_norm_value), kernel_initializer="he_normal")(up_2)
leakyrelu_10 = LeakyReLU()(conv_8)
skip_3 = Add()([leakyrelu_3,leakyrelu_10])
conv_9 = Conv2D(filters=1, kernel_size=(16,1),strides=1, padding="same", activation='linear', kernel_constraint=max_norm(max_norm_value), kernel_initializer="he_normal")(skip_3)
# defining model with input and output (i.e. target)
model = Model(inputs=input, outputs=conv_9)
return model
model = build_model()
model.compile(loss='mse', optimizer='adam', metrics=['mape','accuracy'])
if not os.path.exists(path_weights_model):
try:
os.mkdir(path_weights_model)
except Exception as e:
print("Konnte Ordner fuer Gewichte nicht erstellen" + str(e))
checkpoint = ModelCheckpoint(
filepath,
monitor='loss',
verbose=0,
save_best_only=True,
mode='min'
)
model.summary()
# train model
history = model.fit(train_generator, steps_per_epoch = int(np.floor(len_train // reduction_divisor / batch_size)), epochs = epochs, validation_data = valid_generator, validation_steps = int(np.floor(len_valid // reduction_divisor / batch_size)), callbacks=[checkpoint], use_multiprocessing=True)
# save history
index = path_save_model.split("/")
path_save_nomodel = '/'.join(index[0:-1])
loss_history = history.history["loss"]
mape_history = history.history["mape"]
accuracy_history = history.history["accuracy"]
val_loss_history = history.history["val_loss"]
val_mape_history = history.history["val_mape"]
val_accuracy_history = history.history["val_accuracy"]
dict_history = {'loss':loss_history, 'mape':mape_history, 'accuracy':accuracy_history, 'val_loss':val_loss_history, 'val_mape':val_mape_history, 'val_accuracy':val_accuracy_history}
np.save(path_save_nomodel + '/' + plot_name, dict_history)
# plot train and validation loss after training ends
plt.style.use("ggplot")
plt.figure()
plt.plot(history.history["loss"], label="train_loss")
plt.plot(history.history["val_loss"], label="val_loss")
plt.title("Training Loss and Accuracy")
plt.xlabel("Epochs")
plt.ylabel("Loss/Accuracy")
plt.legend(loc="lower left")
index = path_save_model.split("/")
path_save_nomodel = '/'.join(index[0:-1])
plt.savefig(path_save_nomodel + '/' + plot_name + '.png', dpi=400)