def train(X, y, num_epochs, train_fn, val_fn=None, train_iterator=None, validation_iterator=None): if train_iterator is None: train_iterator = SpectTrainBatchIterator(100, 10, config) if validation_iterator is None: validation_iterator = SpectValidBatchIterator(100, 10, config) if val_fn is not None: train_splitter = sts.SpeakerTrainSplit(eval_size=0.25, sentences=8) X_train, X_valid, y_train, y_valid = train_splitter(X, y) else: X_train = X y_train = y margin = 2 print("Start training") confusion = analytics.ConfusionMatrix(len(set(y))) theano.printing.pydotprint(train_fn, outfile='/data/test.svg', format='svg') print('printed network') for epoch in range(num_epochs): start_time = time.time() # Training train_err = 0 train_batches = 0 for Xb, yb in train_iterator.iterate(X_train, y_train): train_err += train_fn(Xb, yb) train_batches += 1 # Validation if val_fn is not None: val_err = 0 val_batches = 0 for Xb, yb in validation_iterator.iterate(X_valid, y_valid): err, class_predictions = val_fn(Xb, yb) val_err += err confusion.add_predictions(yb, class_predictions) val_batches += 1 accs = confusion.calculate_accuracies() confusion.mat.fill(0) print("Epoch {} of {} took {:.3f}s".format(epoch + 1, num_epochs, time.time() - start_time)) print(" training loss:\t\t{:.6f}".format(train_err / train_batches)) if val_fn is not None: print(" validation loss:\t\t{:.6f}".format(val_err / val_batches)) print(" validation accuracy:\t\t{:.2f} %".format(accs.sum() / len(accs) * 100)) sys.stdout.flush()
def create_train_data(self): with open(get_speaker_pickle(self.training_data), 'rb') as f: (X, y, speaker_names) = pickle.load(f) splitter = sts.SpeakerTrainSplit(0.2, 10) X_t, X_v, y_t, y_v = splitter(X, y) return X_t, y_t, X_v, y_v
def _split_train_val_data(self, X, y): splitter = sts.SpeakerTrainSplit(0.2) X_t, X_v, y_t, y_v = splitter(X, y) return X_t, y_t, X_v, y_v