reader = ReadData(path_file=args.dataset,
                      embedding_config=embedding,
                      data_shape=inputs,
                      train_val_split=args.train_val_split,
                      sentence_pair=True)
else:
    reader = ReadData(path_file=args.dataset,
                      embedding_config=embedding,
                      data_shape=inputs,
                      train_val_split=args.train_val_split,
                      sentence_pair=False)

print('Reading Validation Data ..')
val_x, val_y = reader.read_val()

train_generator = reader.generator()

log_dir = args.model

logging = TrainValTensorBoard(log_dir=log_dir)

checkpoint = ModelCheckpoint(os.path.join(
    log_dir, 'ep{epoch:03d}-val_loss{val_loss:.3f}-val_acc{val_acc:.3f}.h5'),
                             monitor='val_loss',
                             save_weights_only=True,
                             save_best_only=True,
                             period=1)

reduce_lr = ReduceLROnPlateau(monitor='val_loss',
                              factor=0.1,
                              patience=3,
    model = RecurrentCNN(no_filters=hidden_size, no_classes=args.no_classes)
elif args.model == 'bilstm_rcnn':
    inputs = [(args.no_comments, 512), (30, 1536)]
    model = BiLSTMRecurrentCNN(hidden_size, no_classes=args.no_classes)

model = model.build(inputs)
model.compile(loss='binary_crossentropy', optimizer=Adam(lr=args.learning_rate), metrics=['accuracy'])
model.summary()

if args.check_build:
    exit()

reader = ReadData(dataset=args.dataset, text_embedding_path=args.text_embedding,
                  video_feature_path=args.video_features, data_shape=inputs, train_val_split=args.train_val_split)

train_generator = reader.generator(batch_size=args.batch_size)
val_generator = reader.generator_val(batch_size=args.batch_size)

log_dir = args.logs + '_' + args.model
logging = TrainValTensorBoard(log_dir=log_dir)
checkpoint = ModelCheckpoint(os.path.join(log_dir, 'ep{epoch:03d}-val_loss{val_loss:.3f}-val_acc{val_acc:.3f}.h5'),
        monitor='val_acc', save_weights_only=True, save_best_only=True, period=1)
reduce_lr = ReduceLROnPlateau(monitor='val_acc', factor=0.1, patience=3, verbose=1)
early_stopping = EarlyStopping(monitor='val_acc', min_delta=0, patience=5, verbose=1)

print('Training on {} samples and Validating on {} samples.'.format(reader.train_size, reader.val_size))

model.fit_generator(generator=train_generator, steps_per_epoch=int(reader.train_size/args.batch_size),
                    validation_data=val_generator, epochs=args.epochs, validation_steps=int(reader.val_size/args.batch_size),
                    callbacks=[logging, checkpoint, reduce_lr, early_stopping])