Nathanaël Perraudin, Michaël Defferrard, Tomasz Kacprzak, Raphael Sgier
This demo uses the whole datataset, smoothing, and the addition of noise.
You need a private dataset to execute this notebook. See the README. But you can use it with your own data.
%load_ext autoreload
%autoreload 2
%matplotlib inline
import os
import shutil
# Run on first GPU.
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
# To get the CUDA profiler (do it on the CLI before starting jupyter):
# export LD_LIBRARY_PATH=/usr/local/cuda-9.0/extras/CUPTI/lib64
import numpy as np
import matplotlib.pyplot as plt
from deepsphere import models, experiment_helper, plot, utils
from deepsphere.data import LabeledDatasetWithNoise, LabeledDataset
import hyperparameters
plt.rcParams['figure.figsize'] = (17, 5)
These parameters are fixed or the preprocessing script has to be modified.
Nside = 1024
sigma = 3
data_path = 'data/same_psd/'
These parameters can be changed.
We choose to work in the noiseless setting by setting sigma_noise = 0
. This allows this notebook to run an acceptable time. In the noisy case, the training of the network needs considerably more iterations.
order = 2 # 1,2,4,8 correspond to 12,48,192,768 parts of the sphere.
sigma_noise = 2 # Amount of noise for the experiment
Set download
to True
to download the dataset from zenodo
download = False
if download:
%run -i 'download.py'
Apply the preprocessing steps.
sigma
parameter)Set preprocess
to True
to execute the preprocessing script.
preprocess = False
if preprocess:
%run -i 'data_preprocess.py'
Let us display the resulting PSDs of the preprocessed data. We pre-computed the PSDs for faster execution.
compute = False
if compute:
psd = experiment_helper.psd
data_path = 'data/same_psd/'
ds1 = np.load(data_path+'smoothed_class1_sigma{}.npz'.format(sigma))['arr_0']
ds2 = np.load(data_path+'smoothed_class2_sigma{}.npz'.format(sigma))['arr_0']
psds_img1 = [psd(img) for img in ds1]
psds_img2 = [psd(img) for img in ds2]
np.savez('results/psd_data_sigma{}'.format(sigma), psd_class1=psds_img1, psd_class2=psds_img2)
else:
psds_img1 = np.load('results/psd_data_sigma{}.npz'.format(sigma))['psd_class1']
psds_img2 = np.load('results/psd_data_sigma{}.npz'.format(sigma))['psd_class2']
The PSD of the two classes is almost indistinguishable.
Spoiler Alert! This is the reason why PSD features are not good enough to classify the data.
ell = np.arange(psds_img1.shape[1])
plot.plot_with_std(ell,np.stack(psds_img1)*ell*(ell+1), label='class 1, $\Omega_m=0.31$, $\sigma_8=0.82$, $h=0.7$', color='r')
plot.plot_with_std(ell,np.stack(psds_img2)*ell*(ell+1), label='class 2, $\Omega_m=0.26$, $\sigma_8=0.91$, $h=0.7$', color='b')
plt.legend(fontsize=16);
plt.xlim([11, np.max(ell)])
plt.ylim([1e-6, 5e-4])
plt.yscale('log')
plt.xscale('log')
plt.xlabel('$\ell$: spherical harmonic index', fontsize=18)
plt.ylabel('$C_\ell \cdot \ell \cdot (\ell+1)$', fontsize=18)
plt.title('Power Spectrum Density, 3-arcmin smoothing, noiseless, Nside=1024', fontsize=18);
The following functions will
hp_split
of experiment_helper.py
for more specific informations.The function that load the testing data will additionally add the noise to the sample.
x_raw_train, labels_raw_train, x_raw_std = experiment_helper.get_training_data(sigma, order)
x_raw_test, labels_test, _ = experiment_helper.get_testing_data(sigma, order, sigma_noise, x_raw_std)
The following function prepare the features for the SVM classifier.
The features are computed using the function histogram
of experiment_helper.py
.
We use 10 different noise realization by setting augmentation=10
in order to increase the number of training sample.
ret = experiment_helper.data_preprossing(x_raw_train, labels_raw_train, x_raw_test, sigma_noise, feature_type='histogram', augmentation=10)
features_train, labels_train, features_validation, labels_validation, features_test = ret
/home/defferra/miniconda3/envs/scnn/lib/python3.6/site-packages/sklearn/model_selection/_split.py:2026: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified. FutureWarning)
Class 1 VS class 2 Training set: 765 / 771 Validation set: 195 / 189 Computing the features for the training set Iteration 0 / 20 Iteration 1 / 20 Iteration 2 / 20 Iteration 3 / 20 Iteration 4 / 20 Iteration 5 / 20 Iteration 6 / 20 Iteration 7 / 20 Iteration 8 / 20 Iteration 9 / 20 Iteration 10 / 20 Iteration 11 / 20 Iteration 12 / 20 Iteration 13 / 20 Iteration 14 / 20 Iteration 15 / 20 Iteration 16 / 20 Iteration 17 / 20 Iteration 18 / 20 Iteration 19 / 20 Computing the features for the validation set Computing the features for the testing set
Let us test classify our data using an SVM classifier.
error_train, error_validation, C = experiment_helper.err_svc_linear(features_train, labels_train, features_validation, labels_validation)
Optimal C: 0.03162277660168379
print('The validation error is {}%'.format(error_validation * 100), flush=True)
print('The Training error is {}%'.format(error_train * 100), flush=True)
The validation error is 11.458333333333332% The Training error is 10.188802083333332%
We now compute the error on the testing set. To avoid complexity, we do a small mistake that advantage the SVM classifer: we do cross-validation on the testing set.
While this is wrong, the spherical CNN still clearly outperform the SVM classifier.
_, error_test = experiment_helper.err_svc_linear_single(C, features_train, labels_train, features_test, labels_test)
print('The testing error is {}%'.format(error_test * 100), flush=True)
The testing error is 10.104166666666666%
To get a grasp of what is happening, let us plot the histogram of the data.
cmin = np.min(x_raw_train)
cmax = np.max(x_raw_train)
bins = 100
x = np.linspace(cmin,cmax,bins)
fig, axes = plt.subplots(1, 2)
x_hist = experiment_helper.histogram(x_raw_train, cmin, cmax)
plot.plot_with_std(x, x_hist[labels_raw_train==0], color='b', label='class 1', ax=axes[0])
plot.plot_with_std(x, x_hist[labels_raw_train==1], color='r', label='class 2', ax=axes[0])
axes[0].legend()
axes[0].set_title('Histogram - Noiselss case');
if sigma_noise:
# Updating cmin and cmax does not really affect the features.
# We keep the same as in the noisless case in order to have the same x axis.
x_hist = experiment_helper.histogram(x_raw_train+sigma_noise*np.random.randn(*x_raw_train.shape), cmin, cmax)
plot.plot_with_std(x, x_hist[labels_raw_train==0], color='b', label='class 1', ax=axes[1])
plot.plot_with_std(x, x_hist[labels_raw_train==1], color='r', label='class 2', ax=axes[1])
axes[1].legend()
axes[1].set_title('Histogram- Noisy case');
These histogram are normalized in order to get the final features
ax = plot.plot_with_std(features_train[labels_train==0], color='b', label='class 1')
ax = plot.plot_with_std(features_train[labels_train==1], color='r', label='class 2', ax=ax)
ax.legend()
ax.set_title('Histogram features');
# ax = plot.plot_with_std(features_validation[labels_validation==0,:80], color='b', label='class 1')
# ax = plot.plot_with_std(features_validation[labels_validation==1,:80], color='r', label='class 2', ax=ax)
# ax.legend()
# ax.set_title('Histogram features - Validation set');
# ax = plot.plot_with_std(features_test[labels_test==0,:80], color='b', label='class 1')
# ax = plot.plot_with_std(features_test[labels_test==1,:80], color='r', label='class 2', ax=ax)
# ax.legend()
# ax.set_title('Histogram features - Test set');
Solving the problem with PSD features is very similar than solving it with histogram features. Hence we are not describing each step.
The computation of the PSD features is actually very expensive. Since the classifier will also fail miserably, you may just want to not exectute this part of the notebook. In order to reduce the amount of PSD to be computed, we disable the dataset augementation by setting augmentation=1
. Nevertheless, we use augmentation for the results in the paper.
ret = experiment_helper.data_preprossing(x_raw_train, labels_raw_train, x_raw_test, sigma_noise, feature_type='psd', augmentation=1)
features_train, labels_train, features_validation, labels_validation, features_test = ret
/home/defferra/miniconda3/envs/scnn/lib/python3.6/site-packages/sklearn/model_selection/_split.py:2026: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified. FutureWarning)
Class 1 VS class 2 Training set: 765 / 771 Validation set: 195 / 189 Computing the features for the training set Iteration 0 / 2 Iteration 1 / 2 Computing the features for the validation set Computing the features for the testing set
error_train, error_validation, C = experiment_helper.err_svc_linear(features_train, labels_train, features_validation, labels_validation)
print('The validation error is {}%'.format(error_validation * 100), flush=True)
print('The Training error is {}%'.format(error_train * 100), flush=True)
Optimal C: 0.1 The validation error is 26.822916666666668% The Training error is 0.5859375%
_, error_test = experiment_helper.err_svc_linear_single(C, features_train, labels_train, features_test, labels_test)
print('The testing error is {}%'.format(error_test * 100), flush=True)
The testing error is 32.916666666666664%
To get a grasp of what is happening, let us plot the psd features.
ell = np.arange(features_train.shape[1])
ax = plot.plot_with_std(ell, features_train[labels_train==0], color='b', label='class 1')
ax = plot.plot_with_std(ell, features_train[labels_train==1], color='r', label='class 2', ax=ax)
ax.legend()
ax.set_title('PSD features');
# plt.xscale('log')
# ell = np.arange(features_train.shape[1])
# ax = plot.plot_with_std(ell, features_validation[labels_validation==0], color='b', label='class 1')
# ax = plot.plot_with_std(ell, features_validation[labels_validation==1], color='r', label='class 2', ax=ax)
# ax.legend()
# ax.set_title('PSD features - validation dataset');
# # plt.xscale('log')
# ell = np.arange(features_train.shape[1])
# ax = plot.plot_with_std(ell, features_test[labels_test==0], color='b', label='class 1')
# ax = plot.plot_with_std(ell, features_test[labels_test==1], color='r', label='class 2', ax=ax)
# ax.legend()
# ax.set_title('PSD features - testing dataset');
# # plt.xscale('log')
Let us now classify our data using a spherical convolutional neural network.
Let us create the datafor the spherical neural network. It is simply the raw data.
ret = experiment_helper.data_preprossing(x_raw_train, labels_raw_train, x_raw_test, sigma_noise, feature_type=None, train_size=0.8)
features_train, labels_train, features_validation, labels_validation, features_test = ret
/home/defferra/miniconda3/envs/scnn/lib/python3.6/site-packages/sklearn/model_selection/_split.py:2026: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified. FutureWarning)
Class 1 VS class 2 Training set: 765 / 771 Validation set: 195 / 189
The spherical neural network will uses a Dataset object that need to be initialized. The object LabeledDatasetWithNoise
will add noise to the raw data at the time of training. It will slowly increase the amount of noise during nit
iteration.
training = LabeledDatasetWithNoise(features_train, labels_train, end_level=sigma_noise)
validation = LabeledDataset(features_validation, labels_validation)
We now create our spherical neural network. We use one architecture, a fully convolutional architecture (see the exact parameters in hyperparameters.py
), for all the problems (that is for all configurations of order
and sigma_noise
. A smaller order
means more pixels per sample, that is more data for a prediction. It translates to higher accuracy as the network is more confident about its prediction (as they are averaged across spatial locations).
For the paper, we selected a conservative set of parameters that were providing good results across the board. To train faster, diminish num_epochs
, or interrupt training whenever you get bored. To reproduce all the results from the paper, the easiest is to run the experiments_deepsphere.py
script.
ntype = 'FCN'
EXP_NAME = '40sim_{}sides_{:0.1f}noise_{}order_{}sigma_{}'.format(Nside, sigma_noise, order, sigma, ntype)
params = hyperparameters.get_params(training.N, EXP_NAME, order, Nside, ntype)
# params['profile'] = True # See computation time and memory usage in Tensorboard.
# params['debug'] = True # Debug the model in Tensorboard.
model = models.deepsphere(**params)
#sides: [1024, 512, 256, 128, 64, 32, 32] #pixels: [262144, 65536, 16384, 4096, 1024, 256, 256] #samples per batch: 64 => #pixels per batch (input): 16,777,216 => #pixels for training (input): 32,212,254,720 Learning rate will start at 2.0e-04 and finish at 2.9e-05. NN architecture input: M_0 = 262144 layer 1: cgconv1 representation: M_0 * F_1 / p_1 = 262144 * 16 / 4 = 1048576 weights: F_0 * F_1 * K_1 = 1 * 16 * 5 = 80 biases: F_1 = 16 batch normalization layer 2: cgconv2 representation: M_1 * F_2 / p_2 = 65536 * 32 / 4 = 524288 weights: F_1 * F_2 * K_2 = 16 * 32 * 5 = 2560 biases: F_2 = 32 batch normalization layer 3: cgconv3 representation: M_2 * F_3 / p_3 = 16384 * 64 / 4 = 262144 weights: F_2 * F_3 * K_3 = 32 * 64 * 5 = 10240 biases: F_3 = 64 batch normalization layer 4: cgconv4 representation: M_3 * F_4 / p_4 = 4096 * 64 / 4 = 65536 weights: F_3 * F_4 * K_4 = 64 * 64 * 5 = 20480 biases: F_4 = 64 batch normalization layer 5: cgconv5 representation: M_4 * F_5 / p_5 = 1024 * 64 / 4 = 16384 weights: F_4 * F_5 * K_5 = 64 * 64 * 5 = 20480 biases: F_5 = 64 batch normalization layer 6: cgconv6 representation: M_5 * F_6 / p_6 = 256 * 2 / 1 = 512 weights: F_5 * F_6 * K_6 = 64 * 2 * 5 = 640 batch normalization Statistical layer: mean representation: 1 * 2 = 2
# Cleanup before running again.
shutil.rmtree('summaries/{}/'.format(EXP_NAME), ignore_errors=True)
shutil.rmtree('checkpoints/{}/'.format(EXP_NAME), ignore_errors=True)
The learning rate is the most important hyper-parameter. A technique to find an optimal value is to visualize the validation loss while increasing the learning rate. One way to define the optimal learning rate is to search for the largest value looking for which the validation loss still decreases.
# backup = params.copy()
#
# params, learning_rate = utils.test_learning_rates(params, training.N, 1e-6, 1e-1, num_epochs=20)
#
# shutil.rmtree('summaries/{}/'.format(params['dir_name']), ignore_errors=True)
# shutil.rmtree('checkpoints/{}/'.format(params['dir_name']), ignore_errors=True)
#
# model = models.deepsphere(**params)
# _, loss_validation, _, _ = model.fit(training, validation)
#
# params.update(backup)
#
# plt.semilogx(learning_rate, loss_validation, '.-')
Here are a few remarks.
summaries
folder. Start tensorboard with cd summaries
then tensorboard --logdir .
, and open http://localhost:6006 in a browser tab to visualize training progress and statistics about the learned parameters. You can debug the model by setting params['debug'] = True
and launching tensorboard with tensorboard --logdir . --debugger_port 6064
.accuracy_validation, loss_validation, loss_training, t_step = model.fit(training, validation)
step 9 / 1920 (epoch 0.38 / 80): learning_rate = 1.97e-04, training loss = 7.15e-01 validation accuracy: 48.18 (185 / 384), f1 (weighted): 32.01, loss: 6.97e-01 CPU time: 33s, wall time: 52s step 18 / 1920 (epoch 0.75 / 80): learning_rate = 1.93e-04, training loss = 6.70e-01 validation accuracy: 48.96 (188 / 384), f1 (weighted): 32.35, loss: 7.15e-01 CPU time: 61s, wall time: 100s step 27 / 1920 (epoch 1.12 / 80): learning_rate = 1.90e-04, training loss = 6.34e-01
/home/defferra/miniconda3/envs/scnn/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples. 'precision', 'predicted', average, warn_for)
validation accuracy: 49.22 (189 / 384), f1 (weighted): 32.47, loss: 8.39e-01 CPU time: 88s, wall time: 146s step 36 / 1920 (epoch 1.50 / 80): learning_rate = 1.86e-04, training loss = 6.20e-01 validation accuracy: 49.22 (189 / 384), f1 (weighted): 32.47, loss: 8.60e-01 CPU time: 115s, wall time: 193s step 45 / 1920 (epoch 1.88 / 80): learning_rate = 1.83e-04, training loss = 5.86e-01 validation accuracy: 49.22 (189 / 384), f1 (weighted): 32.47, loss: 1.23e+00 CPU time: 142s, wall time: 239s step 54 / 1920 (epoch 2.25 / 80): learning_rate = 1.80e-04, training loss = 5.66e-01 validation accuracy: 49.22 (189 / 384), f1 (weighted): 32.47, loss: 9.67e-01 CPU time: 168s, wall time: 286s step 63 / 1920 (epoch 2.62 / 80): learning_rate = 1.76e-04, training loss = 5.00e-01 validation accuracy: 49.22 (189 / 384), f1 (weighted): 32.47, loss: 8.74e-01 CPU time: 196s, wall time: 332s step 72 / 1920 (epoch 3.00 / 80): learning_rate = 1.73e-04, training loss = 4.25e-01 validation accuracy: 49.74 (191 / 384), f1 (weighted): 33.61, loss: 7.30e-01 CPU time: 222s, wall time: 379s step 81 / 1920 (epoch 3.38 / 80): learning_rate = 1.70e-04, training loss = 4.02e-01 validation accuracy: 54.69 (210 / 384), f1 (weighted): 42.35, loss: 6.64e-01 CPU time: 249s, wall time: 425s step 90 / 1920 (epoch 3.75 / 80): learning_rate = 1.67e-04, training loss = 3.00e-01 validation accuracy: 51.30 (197 / 384), f1 (weighted): 35.35, loss: 1.67e+00 CPU time: 275s, wall time: 472s step 99 / 1920 (epoch 4.12 / 80): learning_rate = 1.64e-04, training loss = 3.13e-01 validation accuracy: 51.56 (198 / 384), f1 (weighted): 35.92, loss: 1.30e+00 CPU time: 301s, wall time: 518s step 108 / 1920 (epoch 4.50 / 80): learning_rate = 1.61e-04, training loss = 3.14e-01 validation accuracy: 51.56 (198 / 384), f1 (weighted): 35.92, loss: 1.10e+00 CPU time: 327s, wall time: 564s step 117 / 1920 (epoch 4.88 / 80): learning_rate = 1.58e-04, training loss = 2.87e-01 validation accuracy: 59.64 (229 / 384), f1 (weighted): 51.35, loss: 6.14e-01 CPU time: 354s, wall time: 610s step 126 / 1920 (epoch 5.25 / 80): learning_rate = 1.56e-04, training loss = 2.68e-01 validation accuracy: 66.67 (256 / 384), f1 (weighted): 62.25, loss: 5.69e-01 CPU time: 380s, wall time: 656s step 135 / 1920 (epoch 5.62 / 80): learning_rate = 1.53e-04, training loss = 2.38e-01 validation accuracy: 69.53 (267 / 384), f1 (weighted): 66.22, loss: 4.81e-01 CPU time: 406s, wall time: 702s step 144 / 1920 (epoch 6.00 / 80): learning_rate = 1.50e-04, training loss = 2.32e-01 validation accuracy: 72.92 (280 / 384), f1 (weighted): 70.63, loss: 4.23e-01 CPU time: 432s, wall time: 748s step 153 / 1920 (epoch 6.38 / 80): learning_rate = 1.47e-04, training loss = 2.40e-01 validation accuracy: 93.49 (359 / 384), f1 (weighted): 93.46, loss: 2.43e-01 CPU time: 458s, wall time: 794s step 162 / 1920 (epoch 6.75 / 80): learning_rate = 1.45e-04, training loss = 1.91e-01 validation accuracy: 69.79 (268 / 384), f1 (weighted): 66.57, loss: 4.88e-01 CPU time: 484s, wall time: 840s step 171 / 1920 (epoch 7.12 / 80): learning_rate = 1.42e-04, training loss = 2.27e-01 validation accuracy: 92.45 (355 / 384), f1 (weighted): 92.40, loss: 2.33e-01 CPU time: 510s, wall time: 886s step 180 / 1920 (epoch 7.50 / 80): learning_rate = 1.40e-04, training loss = 2.14e-01 validation accuracy: 91.93 (353 / 384), f1 (weighted): 91.86, loss: 2.31e-01 CPU time: 535s, wall time: 932s step 189 / 1920 (epoch 7.88 / 80): learning_rate = 1.37e-04, training loss = 1.80e-01 validation accuracy: 69.79 (268 / 384), f1 (weighted): 66.57, loss: 4.82e-01 CPU time: 561s, wall time: 978s step 198 / 1920 (epoch 8.25 / 80): learning_rate = 1.35e-04, training loss = 2.21e-01 validation accuracy: 91.67 (352 / 384), f1 (weighted): 91.61, loss: 2.15e-01 CPU time: 587s, wall time: 1024s step 207 / 1920 (epoch 8.62 / 80): learning_rate = 1.32e-04, training loss = 1.84e-01 validation accuracy: 94.01 (361 / 384), f1 (weighted): 93.99, loss: 2.03e-01 CPU time: 613s, wall time: 1069s step 216 / 1920 (epoch 9.00 / 80): learning_rate = 1.30e-04, training loss = 1.65e-01 validation accuracy: 93.49 (359 / 384), f1 (weighted): 93.46, loss: 2.03e-01 CPU time: 638s, wall time: 1115s step 225 / 1920 (epoch 9.38 / 80): learning_rate = 1.28e-04, training loss = 1.48e-01 validation accuracy: 95.05 (365 / 384), f1 (weighted): 95.05, loss: 1.80e-01 CPU time: 664s, wall time: 1161s step 234 / 1920 (epoch 9.75 / 80): learning_rate = 1.25e-04, training loss = 1.22e-01 validation accuracy: 97.92 (376 / 384), f1 (weighted): 97.92, loss: 1.44e-01 CPU time: 691s, wall time: 1207s step 243 / 1920 (epoch 10.12 / 80): learning_rate = 1.23e-04, training loss = 1.77e-01 validation accuracy: 97.40 (374 / 384), f1 (weighted): 97.39, loss: 1.41e-01 CPU time: 716s, wall time: 1253s step 252 / 1920 (epoch 10.50 / 80): learning_rate = 1.21e-04, training loss = 1.28e-01 validation accuracy: 89.84 (345 / 384), f1 (weighted): 89.75, loss: 2.37e-01 CPU time: 742s, wall time: 1299s step 261 / 1920 (epoch 10.88 / 80): learning_rate = 1.19e-04, training loss = 1.45e-01 validation accuracy: 94.27 (362 / 384), f1 (weighted): 94.26, loss: 1.77e-01 CPU time: 768s, wall time: 1345s step 270 / 1920 (epoch 11.25 / 80): learning_rate = 1.17e-04, training loss = 2.01e-01 validation accuracy: 97.66 (375 / 384), f1 (weighted): 97.66, loss: 1.47e-01 CPU time: 794s, wall time: 1391s step 279 / 1920 (epoch 11.62 / 80): learning_rate = 1.15e-04, training loss = 1.65e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 1.26e-01 CPU time: 820s, wall time: 1437s step 288 / 1920 (epoch 12.00 / 80): learning_rate = 1.13e-04, training loss = 1.40e-01 validation accuracy: 96.35 (370 / 384), f1 (weighted): 96.35, loss: 1.55e-01 CPU time: 846s, wall time: 1483s step 297 / 1920 (epoch 12.38 / 80): learning_rate = 1.11e-04, training loss = 1.15e-01 validation accuracy: 94.79 (364 / 384), f1 (weighted): 94.78, loss: 1.59e-01 CPU time: 872s, wall time: 1529s step 306 / 1920 (epoch 12.75 / 80): learning_rate = 1.09e-04, training loss = 7.18e-02 validation accuracy: 97.66 (375 / 384), f1 (weighted): 97.66, loss: 1.23e-01 CPU time: 898s, wall time: 1576s step 315 / 1920 (epoch 13.12 / 80): learning_rate = 1.07e-04, training loss = 1.76e-01 validation accuracy: 96.35 (370 / 384), f1 (weighted): 96.35, loss: 1.35e-01 CPU time: 925s, wall time: 1622s step 324 / 1920 (epoch 13.50 / 80): learning_rate = 1.05e-04, training loss = 9.73e-02 validation accuracy: 98.18 (377 / 384), f1 (weighted): 98.18, loss: 1.16e-01 CPU time: 951s, wall time: 1668s step 333 / 1920 (epoch 13.88 / 80): learning_rate = 1.03e-04, training loss = 1.37e-01 validation accuracy: 97.92 (376 / 384), f1 (weighted): 97.92, loss: 1.24e-01 CPU time: 977s, wall time: 1714s step 342 / 1920 (epoch 14.25 / 80): learning_rate = 1.01e-04, training loss = 1.49e-01 validation accuracy: 94.27 (362 / 384), f1 (weighted): 94.26, loss: 1.61e-01 CPU time: 1003s, wall time: 1761s step 351 / 1920 (epoch 14.62 / 80): learning_rate = 9.92e-05, training loss = 1.32e-01 validation accuracy: 97.40 (374 / 384), f1 (weighted): 97.40, loss: 1.20e-01 CPU time: 1029s, wall time: 1807s step 360 / 1920 (epoch 15.00 / 80): learning_rate = 9.74e-05, training loss = 1.30e-01 validation accuracy: 98.18 (377 / 384), f1 (weighted): 98.18, loss: 1.15e-01 CPU time: 1055s, wall time: 1853s step 369 / 1920 (epoch 15.38 / 80): learning_rate = 9.57e-05, training loss = 1.05e-01 validation accuracy: 97.92 (376 / 384), f1 (weighted): 97.92, loss: 1.22e-01 CPU time: 1081s, wall time: 1899s step 378 / 1920 (epoch 15.75 / 80): learning_rate = 9.40e-05, training loss = 1.00e-01 validation accuracy: 88.80 (341 / 384), f1 (weighted): 88.64, loss: 2.28e-01 CPU time: 1107s, wall time: 1945s step 387 / 1920 (epoch 16.12 / 80): learning_rate = 9.23e-05, training loss = 1.40e-01 validation accuracy: 97.66 (375 / 384), f1 (weighted): 97.66, loss: 1.07e-01 CPU time: 1133s, wall time: 1991s step 396 / 1920 (epoch 16.50 / 80): learning_rate = 9.06e-05, training loss = 1.17e-01 validation accuracy: 97.14 (373 / 384), f1 (weighted): 97.13, loss: 1.19e-01 CPU time: 1160s, wall time: 2037s step 405 / 1920 (epoch 16.88 / 80): learning_rate = 8.90e-05, training loss = 1.04e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 9.68e-02 CPU time: 1186s, wall time: 2083s step 414 / 1920 (epoch 17.25 / 80): learning_rate = 8.74e-05, training loss = 1.48e-01 validation accuracy: 98.18 (377 / 384), f1 (weighted): 98.18, loss: 1.05e-01 CPU time: 1212s, wall time: 2130s step 423 / 1920 (epoch 17.62 / 80): learning_rate = 8.59e-05, training loss = 1.29e-01 validation accuracy: 97.92 (376 / 384), f1 (weighted): 97.92, loss: 1.07e-01 CPU time: 1238s, wall time: 2176s step 432 / 1920 (epoch 18.00 / 80): learning_rate = 8.43e-05, training loss = 7.71e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 1.08e-01 CPU time: 1264s, wall time: 2221s step 441 / 1920 (epoch 18.38 / 80): learning_rate = 8.28e-05, training loss = 1.30e-01 validation accuracy: 97.92 (376 / 384), f1 (weighted): 97.92, loss: 1.08e-01 CPU time: 1289s, wall time: 2267s step 450 / 1920 (epoch 18.75 / 80): learning_rate = 8.14e-05, training loss = 1.03e-01 validation accuracy: 98.18 (377 / 384), f1 (weighted): 98.18, loss: 9.14e-02 CPU time: 1315s, wall time: 2313s step 459 / 1920 (epoch 19.12 / 80): learning_rate = 7.99e-05, training loss = 1.30e-01 validation accuracy: 96.88 (372 / 384), f1 (weighted): 96.87, loss: 1.16e-01 CPU time: 1340s, wall time: 2358s step 468 / 1920 (epoch 19.50 / 80): learning_rate = 7.85e-05, training loss = 1.10e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 9.45e-02 CPU time: 1366s, wall time: 2404s step 477 / 1920 (epoch 19.88 / 80): learning_rate = 7.71e-05, training loss = 8.65e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 9.23e-02 CPU time: 1392s, wall time: 2450s step 486 / 1920 (epoch 20.25 / 80): learning_rate = 7.57e-05, training loss = 1.36e-01 validation accuracy: 98.18 (377 / 384), f1 (weighted): 98.18, loss: 9.06e-02 CPU time: 1418s, wall time: 2496s step 495 / 1920 (epoch 20.62 / 80): learning_rate = 7.44e-05, training loss = 1.08e-01 validation accuracy: 98.18 (377 / 384), f1 (weighted): 98.18, loss: 9.05e-02 CPU time: 1444s, wall time: 2542s step 504 / 1920 (epoch 21.00 / 80): learning_rate = 7.30e-05, training loss = 1.21e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 8.54e-02 CPU time: 1470s, wall time: 2589s step 513 / 1920 (epoch 21.38 / 80): learning_rate = 7.17e-05, training loss = 8.05e-02 validation accuracy: 97.66 (375 / 384), f1 (weighted): 97.65, loss: 1.13e-01 CPU time: 1496s, wall time: 2635s step 522 / 1920 (epoch 21.75 / 80): learning_rate = 7.04e-05, training loss = 7.54e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 8.68e-02 CPU time: 1522s, wall time: 2681s step 531 / 1920 (epoch 22.12 / 80): learning_rate = 6.92e-05, training loss = 1.51e-01 validation accuracy: 97.92 (376 / 384), f1 (weighted): 97.92, loss: 9.25e-02 CPU time: 1548s, wall time: 2727s step 540 / 1920 (epoch 22.50 / 80): learning_rate = 6.80e-05, training loss = 7.09e-02 validation accuracy: 97.92 (376 / 384), f1 (weighted): 97.92, loss: 9.57e-02 CPU time: 1574s, wall time: 2773s step 549 / 1920 (epoch 22.88 / 80): learning_rate = 6.67e-05, training loss = 1.20e-01 validation accuracy: 98.70 (379 / 384), f1 (weighted): 98.70, loss: 8.36e-02 CPU time: 1600s, wall time: 2819s step 558 / 1920 (epoch 23.25 / 80): learning_rate = 6.55e-05, training loss = 1.18e-01 validation accuracy: 96.61 (371 / 384), f1 (weighted): 96.61, loss: 1.13e-01 CPU time: 1626s, wall time: 2865s step 567 / 1920 (epoch 23.62 / 80): learning_rate = 6.44e-05, training loss = 9.67e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 9.04e-02 CPU time: 1652s, wall time: 2911s step 576 / 1920 (epoch 24.00 / 80): learning_rate = 6.32e-05, training loss = 7.85e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 8.36e-02 CPU time: 1678s, wall time: 2957s step 585 / 1920 (epoch 24.38 / 80): learning_rate = 6.21e-05, training loss = 1.12e-01 validation accuracy: 98.70 (379 / 384), f1 (weighted): 98.70, loss: 8.24e-02 CPU time: 1704s, wall time: 3004s step 594 / 1920 (epoch 24.75 / 80): learning_rate = 6.10e-05, training loss = 7.88e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 8.94e-02 CPU time: 1731s, wall time: 3050s step 603 / 1920 (epoch 25.12 / 80): learning_rate = 5.99e-05, training loss = 1.07e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 7.96e-02 CPU time: 1757s, wall time: 3096s step 612 / 1920 (epoch 25.50 / 80): learning_rate = 5.88e-05, training loss = 1.24e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 7.92e-02 CPU time: 1783s, wall time: 3142s step 621 / 1920 (epoch 25.88 / 80): learning_rate = 5.78e-05, training loss = 1.17e-01 validation accuracy: 97.92 (376 / 384), f1 (weighted): 97.92, loss: 8.83e-02 CPU time: 1808s, wall time: 3188s step 630 / 1920 (epoch 26.25 / 80): learning_rate = 5.68e-05, training loss = 1.32e-01 validation accuracy: 96.88 (372 / 384), f1 (weighted): 96.87, loss: 9.79e-02 CPU time: 1834s, wall time: 3234s step 639 / 1920 (epoch 26.62 / 80): learning_rate = 5.57e-05, training loss = 8.64e-02 validation accuracy: 98.18 (377 / 384), f1 (weighted): 98.18, loss: 7.85e-02 CPU time: 1861s, wall time: 3280s step 648 / 1920 (epoch 27.00 / 80): learning_rate = 5.47e-05, training loss = 7.69e-02 validation accuracy: 97.40 (374 / 384), f1 (weighted): 97.40, loss: 9.27e-02 CPU time: 1887s, wall time: 3326s step 657 / 1920 (epoch 27.38 / 80): learning_rate = 5.38e-05, training loss = 1.01e-01 validation accuracy: 97.40 (374 / 384), f1 (weighted): 97.40, loss: 9.36e-02 CPU time: 1913s, wall time: 3373s step 666 / 1920 (epoch 27.75 / 80): learning_rate = 5.28e-05, training loss = 8.49e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 8.15e-02 CPU time: 1939s, wall time: 3419s step 675 / 1920 (epoch 28.12 / 80): learning_rate = 5.19e-05, training loss = 5.87e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 8.04e-02 CPU time: 1965s, wall time: 3465s step 684 / 1920 (epoch 28.50 / 80): learning_rate = 5.09e-05, training loss = 5.77e-02 validation accuracy: 98.18 (377 / 384), f1 (weighted): 98.18, loss: 7.84e-02 CPU time: 1991s, wall time: 3511s step 693 / 1920 (epoch 28.88 / 80): learning_rate = 5.00e-05, training loss = 7.09e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 7.77e-02 CPU time: 2017s, wall time: 3557s step 702 / 1920 (epoch 29.25 / 80): learning_rate = 4.91e-05, training loss = 1.09e-01 validation accuracy: 98.18 (377 / 384), f1 (weighted): 98.18, loss: 7.78e-02 CPU time: 2043s, wall time: 3603s step 711 / 1920 (epoch 29.62 / 80): learning_rate = 4.83e-05, training loss = 1.16e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 7.71e-02 CPU time: 2069s, wall time: 3649s step 720 / 1920 (epoch 30.00 / 80): learning_rate = 4.74e-05, training loss = 1.01e-01 validation accuracy: 98.18 (377 / 384), f1 (weighted): 98.18, loss: 7.78e-02 CPU time: 2094s, wall time: 3695s step 729 / 1920 (epoch 30.38 / 80): learning_rate = 4.66e-05, training loss = 1.31e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 7.34e-02 CPU time: 2120s, wall time: 3741s step 738 / 1920 (epoch 30.75 / 80): learning_rate = 4.57e-05, training loss = 6.79e-02 validation accuracy: 98.18 (377 / 384), f1 (weighted): 98.18, loss: 7.91e-02 CPU time: 2146s, wall time: 3786s step 747 / 1920 (epoch 31.12 / 80): learning_rate = 4.49e-05, training loss = 7.23e-02 validation accuracy: 98.70 (379 / 384), f1 (weighted): 98.70, loss: 7.63e-02 CPU time: 2171s, wall time: 3832s step 756 / 1920 (epoch 31.50 / 80): learning_rate = 4.41e-05, training loss = 6.86e-02 validation accuracy: 97.14 (373 / 384), f1 (weighted): 97.14, loss: 9.07e-02 CPU time: 2197s, wall time: 3878s step 765 / 1920 (epoch 31.88 / 80): learning_rate = 4.33e-05, training loss = 7.45e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 7.08e-02 CPU time: 2223s, wall time: 3924s step 774 / 1920 (epoch 32.25 / 80): learning_rate = 4.25e-05, training loss = 1.17e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 7.07e-02 CPU time: 2249s, wall time: 3970s step 783 / 1920 (epoch 32.62 / 80): learning_rate = 4.18e-05, training loss = 7.08e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 7.20e-02 CPU time: 2275s, wall time: 4016s step 792 / 1920 (epoch 33.00 / 80): learning_rate = 4.10e-05, training loss = 1.03e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 7.32e-02 CPU time: 2301s, wall time: 4063s step 801 / 1920 (epoch 33.38 / 80): learning_rate = 4.03e-05, training loss = 6.00e-02 validation accuracy: 98.70 (379 / 384), f1 (weighted): 98.70, loss: 7.81e-02 CPU time: 2328s, wall time: 4109s step 810 / 1920 (epoch 33.75 / 80): learning_rate = 3.96e-05, training loss = 6.94e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 7.28e-02 CPU time: 2354s, wall time: 4155s step 819 / 1920 (epoch 34.12 / 80): learning_rate = 3.89e-05, training loss = 6.96e-02 validation accuracy: 97.66 (375 / 384), f1 (weighted): 97.65, loss: 9.24e-02 CPU time: 2380s, wall time: 4201s step 828 / 1920 (epoch 34.50 / 80): learning_rate = 3.82e-05, training loss = 7.22e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.90e-02 CPU time: 2406s, wall time: 4247s step 837 / 1920 (epoch 34.88 / 80): learning_rate = 3.75e-05, training loss = 6.32e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 7.11e-02 CPU time: 2432s, wall time: 4294s step 846 / 1920 (epoch 35.25 / 80): learning_rate = 3.68e-05, training loss = 1.13e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.91e-02 CPU time: 2458s, wall time: 4339s step 855 / 1920 (epoch 35.62 / 80): learning_rate = 3.62e-05, training loss = 1.40e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.98e-02 CPU time: 2484s, wall time: 4385s step 864 / 1920 (epoch 36.00 / 80): learning_rate = 3.55e-05, training loss = 9.87e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 7.03e-02 CPU time: 2509s, wall time: 4431s step 873 / 1920 (epoch 36.38 / 80): learning_rate = 3.49e-05, training loss = 7.18e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.68e-02 CPU time: 2535s, wall time: 4477s step 882 / 1920 (epoch 36.75 / 80): learning_rate = 3.43e-05, training loss = 4.09e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.73e-02 CPU time: 2561s, wall time: 4523s step 891 / 1920 (epoch 37.12 / 80): learning_rate = 3.37e-05, training loss = 8.88e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 7.30e-02 CPU time: 2587s, wall time: 4569s step 900 / 1920 (epoch 37.50 / 80): learning_rate = 3.31e-05, training loss = 7.56e-02 validation accuracy: 97.66 (375 / 384), f1 (weighted): 97.66, loss: 8.62e-02 CPU time: 2613s, wall time: 4615s step 909 / 1920 (epoch 37.88 / 80): learning_rate = 3.25e-05, training loss = 1.14e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 7.23e-02 CPU time: 2638s, wall time: 4660s step 918 / 1920 (epoch 38.25 / 80): learning_rate = 3.19e-05, training loss = 8.43e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.69e-02 CPU time: 2664s, wall time: 4706s step 927 / 1920 (epoch 38.62 / 80): learning_rate = 3.13e-05, training loss = 1.68e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.95e-02 CPU time: 2690s, wall time: 4752s step 936 / 1920 (epoch 39.00 / 80): learning_rate = 3.08e-05, training loss = 9.05e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.81e-02 CPU time: 2716s, wall time: 4798s step 945 / 1920 (epoch 39.38 / 80): learning_rate = 3.02e-05, training loss = 1.00e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.82e-02 CPU time: 2742s, wall time: 4844s step 954 / 1920 (epoch 39.75 / 80): learning_rate = 2.97e-05, training loss = 7.78e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 7.54e-02 CPU time: 2768s, wall time: 4890s step 963 / 1920 (epoch 40.12 / 80): learning_rate = 2.91e-05, training loss = 6.80e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.64e-02 CPU time: 2794s, wall time: 4936s step 972 / 1920 (epoch 40.50 / 80): learning_rate = 2.86e-05, training loss = 1.00e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.57e-02 CPU time: 2820s, wall time: 4982s step 981 / 1920 (epoch 40.88 / 80): learning_rate = 2.81e-05, training loss = 6.67e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.56e-02 CPU time: 2846s, wall time: 5028s step 990 / 1920 (epoch 41.25 / 80): learning_rate = 2.76e-05, training loss = 6.90e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.44e-02 CPU time: 2872s, wall time: 5075s step 999 / 1920 (epoch 41.62 / 80): learning_rate = 2.71e-05, training loss = 7.83e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.69e-02 CPU time: 2898s, wall time: 5121s step 1008 / 1920 (epoch 42.00 / 80): learning_rate = 2.66e-05, training loss = 9.80e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.53e-02 CPU time: 2923s, wall time: 5167s step 1017 / 1920 (epoch 42.38 / 80): learning_rate = 2.62e-05, training loss = 4.13e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.42e-02 CPU time: 2950s, wall time: 5213s step 1026 / 1920 (epoch 42.75 / 80): learning_rate = 2.57e-05, training loss = 6.28e-02 validation accuracy: 98.96 (380 / 384), f1 (weighted): 98.96, loss: 7.68e-02 CPU time: 2976s, wall time: 5259s step 1035 / 1920 (epoch 43.12 / 80): learning_rate = 2.52e-05, training loss = 5.58e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.58e-02 CPU time: 3002s, wall time: 5305s step 1044 / 1920 (epoch 43.50 / 80): learning_rate = 2.48e-05, training loss = 5.78e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.64e-02 CPU time: 3028s, wall time: 5351s step 1053 / 1920 (epoch 43.88 / 80): learning_rate = 2.43e-05, training loss = 6.29e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.37e-02 CPU time: 3054s, wall time: 5397s step 1062 / 1920 (epoch 44.25 / 80): learning_rate = 2.39e-05, training loss = 9.03e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.45e-02 CPU time: 3080s, wall time: 5444s step 1071 / 1920 (epoch 44.62 / 80): learning_rate = 2.35e-05, training loss = 1.38e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.67e-02 CPU time: 3106s, wall time: 5489s step 1080 / 1920 (epoch 45.00 / 80): learning_rate = 2.31e-05, training loss = 1.33e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.38e-02 CPU time: 3132s, wall time: 5535s step 1089 / 1920 (epoch 45.38 / 80): learning_rate = 2.27e-05, training loss = 7.19e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.34e-02 CPU time: 3158s, wall time: 5581s step 1098 / 1920 (epoch 45.75 / 80): learning_rate = 2.22e-05, training loss = 5.98e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.46e-02 CPU time: 3184s, wall time: 5628s step 1107 / 1920 (epoch 46.12 / 80): learning_rate = 2.19e-05, training loss = 5.49e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.45e-02 CPU time: 3210s, wall time: 5674s step 1116 / 1920 (epoch 46.50 / 80): learning_rate = 2.15e-05, training loss = 6.90e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.73e-02 CPU time: 3236s, wall time: 5720s step 1125 / 1920 (epoch 46.88 / 80): learning_rate = 2.11e-05, training loss = 8.96e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.43e-02 CPU time: 3262s, wall time: 5766s step 1134 / 1920 (epoch 47.25 / 80): learning_rate = 2.07e-05, training loss = 1.56e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.49e-02 CPU time: 3289s, wall time: 5813s step 1143 / 1920 (epoch 47.62 / 80): learning_rate = 2.03e-05, training loss = 4.31e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.86e-02 CPU time: 3315s, wall time: 5859s step 1152 / 1920 (epoch 48.00 / 80): learning_rate = 2.00e-05, training loss = 5.34e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.31e-02 CPU time: 3342s, wall time: 5905s step 1161 / 1920 (epoch 48.38 / 80): learning_rate = 1.96e-05, training loss = 4.06e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.33e-02 CPU time: 3368s, wall time: 5952s step 1170 / 1920 (epoch 48.75 / 80): learning_rate = 1.93e-05, training loss = 6.35e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.25e-02 CPU time: 3394s, wall time: 5998s step 1179 / 1920 (epoch 49.12 / 80): learning_rate = 1.89e-05, training loss = 6.65e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.42e-02 CPU time: 3420s, wall time: 6044s step 1188 / 1920 (epoch 49.50 / 80): learning_rate = 1.86e-05, training loss = 7.93e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.27e-02 CPU time: 3446s, wall time: 6090s step 1197 / 1920 (epoch 49.88 / 80): learning_rate = 1.82e-05, training loss = 7.74e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.25e-02 CPU time: 3472s, wall time: 6136s step 1206 / 1920 (epoch 50.25 / 80): learning_rate = 1.79e-05, training loss = 7.50e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.33e-02 CPU time: 3498s, wall time: 6182s step 1215 / 1920 (epoch 50.62 / 80): learning_rate = 1.76e-05, training loss = 6.42e-02 validation accuracy: 98.70 (379 / 384), f1 (weighted): 98.70, loss: 6.65e-02 CPU time: 3525s, wall time: 6229s step 1224 / 1920 (epoch 51.00 / 80): learning_rate = 1.73e-05, training loss = 6.12e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.48e-02 CPU time: 3551s, wall time: 6275s step 1233 / 1920 (epoch 51.38 / 80): learning_rate = 1.70e-05, training loss = 1.00e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.28e-02 CPU time: 3577s, wall time: 6321s step 1242 / 1920 (epoch 51.75 / 80): learning_rate = 1.67e-05, training loss = 5.98e-02 validation accuracy: 98.70 (379 / 384), f1 (weighted): 98.70, loss: 6.81e-02 CPU time: 3603s, wall time: 6367s step 1251 / 1920 (epoch 52.12 / 80): learning_rate = 1.64e-05, training loss = 5.92e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.45e-02 CPU time: 3629s, wall time: 6413s step 1260 / 1920 (epoch 52.50 / 80): learning_rate = 1.61e-05, training loss = 5.63e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.14e-02 CPU time: 3654s, wall time: 6459s step 1269 / 1920 (epoch 52.88 / 80): learning_rate = 1.58e-05, training loss = 5.75e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.13e-02 CPU time: 3680s, wall time: 6504s step 1278 / 1920 (epoch 53.25 / 80): learning_rate = 1.55e-05, training loss = 8.75e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.35e-02 CPU time: 3706s, wall time: 6550s step 1287 / 1920 (epoch 53.62 / 80): learning_rate = 1.52e-05, training loss = 5.56e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.74e-02 CPU time: 3731s, wall time: 6596s step 1296 / 1920 (epoch 54.00 / 80): learning_rate = 1.50e-05, training loss = 1.07e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.29e-02 CPU time: 3757s, wall time: 6642s step 1305 / 1920 (epoch 54.38 / 80): learning_rate = 1.47e-05, training loss = 7.64e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.25e-02 CPU time: 3782s, wall time: 6687s step 1314 / 1920 (epoch 54.75 / 80): learning_rate = 1.44e-05, training loss = 2.61e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.16e-02 CPU time: 3808s, wall time: 6733s step 1323 / 1920 (epoch 55.12 / 80): learning_rate = 1.42e-05, training loss = 1.48e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.13e-02 CPU time: 3834s, wall time: 6779s step 1332 / 1920 (epoch 55.50 / 80): learning_rate = 1.39e-05, training loss = 1.12e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.18e-02 CPU time: 3860s, wall time: 6825s step 1341 / 1920 (epoch 55.88 / 80): learning_rate = 1.37e-05, training loss = 1.02e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.07e-02 CPU time: 3886s, wall time: 6871s step 1350 / 1920 (epoch 56.25 / 80): learning_rate = 1.34e-05, training loss = 6.99e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.10e-02 CPU time: 3911s, wall time: 6917s step 1359 / 1920 (epoch 56.62 / 80): learning_rate = 1.32e-05, training loss = 7.60e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.02e-02 CPU time: 3938s, wall time: 6963s step 1368 / 1920 (epoch 57.00 / 80): learning_rate = 1.30e-05, training loss = 8.83e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.11e-02 CPU time: 3964s, wall time: 7009s step 1377 / 1920 (epoch 57.38 / 80): learning_rate = 1.27e-05, training loss = 6.36e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.30e-02 CPU time: 3990s, wall time: 7055s step 1386 / 1920 (epoch 57.75 / 80): learning_rate = 1.25e-05, training loss = 5.36e-02 validation accuracy: 98.70 (379 / 384), f1 (weighted): 98.70, loss: 6.53e-02 CPU time: 4015s, wall time: 7101s step 1395 / 1920 (epoch 58.12 / 80): learning_rate = 1.23e-05, training loss = 8.28e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.02e-02 CPU time: 4041s, wall time: 7147s step 1404 / 1920 (epoch 58.50 / 80): learning_rate = 1.21e-05, training loss = 7.91e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.11e-02 CPU time: 4067s, wall time: 7193s step 1413 / 1920 (epoch 58.88 / 80): learning_rate = 1.18e-05, training loss = 4.83e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.21e-02 CPU time: 4094s, wall time: 7240s step 1422 / 1920 (epoch 59.25 / 80): learning_rate = 1.16e-05, training loss = 1.28e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.96e-02 CPU time: 4120s, wall time: 7286s step 1431 / 1920 (epoch 59.62 / 80): learning_rate = 1.14e-05, training loss = 6.44e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.05e-02 CPU time: 4146s, wall time: 7332s step 1440 / 1920 (epoch 60.00 / 80): learning_rate = 1.12e-05, training loss = 1.21e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.03e-02 CPU time: 4172s, wall time: 7378s step 1449 / 1920 (epoch 60.38 / 80): learning_rate = 1.10e-05, training loss = 9.79e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.98e-02 CPU time: 4198s, wall time: 7425s step 1458 / 1920 (epoch 60.75 / 80): learning_rate = 1.08e-05, training loss = 7.59e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.25e-02 CPU time: 4224s, wall time: 7471s step 1467 / 1920 (epoch 61.12 / 80): learning_rate = 1.06e-05, training loss = 1.45e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.07e-02 CPU time: 4250s, wall time: 7517s step 1476 / 1920 (epoch 61.50 / 80): learning_rate = 1.04e-05, training loss = 8.53e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.04e-02 CPU time: 4276s, wall time: 7563s step 1485 / 1920 (epoch 61.88 / 80): learning_rate = 1.03e-05, training loss = 7.03e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.97e-02 CPU time: 4302s, wall time: 7608s step 1494 / 1920 (epoch 62.25 / 80): learning_rate = 1.01e-05, training loss = 9.81e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.00e-02 CPU time: 4327s, wall time: 7654s step 1503 / 1920 (epoch 62.62 / 80): learning_rate = 9.89e-06, training loss = 8.56e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.03e-02 CPU time: 4354s, wall time: 7701s step 1512 / 1920 (epoch 63.00 / 80): learning_rate = 9.72e-06, training loss = 6.64e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.09e-02 CPU time: 4379s, wall time: 7746s step 1521 / 1920 (epoch 63.38 / 80): learning_rate = 9.54e-06, training loss = 6.75e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.20e-02 CPU time: 4405s, wall time: 7792s step 1530 / 1920 (epoch 63.75 / 80): learning_rate = 9.37e-06, training loss = 9.36e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.13e-02 CPU time: 4431s, wall time: 7838s step 1539 / 1920 (epoch 64.12 / 80): learning_rate = 9.21e-06, training loss = 7.28e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.00e-02 CPU time: 4457s, wall time: 7885s step 1548 / 1920 (epoch 64.50 / 80): learning_rate = 9.04e-06, training loss = 7.60e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.98e-02 CPU time: 4484s, wall time: 7931s step 1557 / 1920 (epoch 64.88 / 80): learning_rate = 8.88e-06, training loss = 7.12e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.93e-02 CPU time: 4510s, wall time: 7977s step 1566 / 1920 (epoch 65.25 / 80): learning_rate = 8.72e-06, training loss = 7.64e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.92e-02 CPU time: 4536s, wall time: 8023s step 1575 / 1920 (epoch 65.62 / 80): learning_rate = 8.57e-06, training loss = 2.81e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.96e-02 CPU time: 4562s, wall time: 8070s step 1584 / 1920 (epoch 66.00 / 80): learning_rate = 8.41e-06, training loss = 8.04e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.10e-02 CPU time: 4588s, wall time: 8115s step 1593 / 1920 (epoch 66.38 / 80): learning_rate = 8.26e-06, training loss = 1.01e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.14e-02 CPU time: 4614s, wall time: 8161s step 1602 / 1920 (epoch 66.75 / 80): learning_rate = 8.12e-06, training loss = 5.86e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.91e-02 CPU time: 4640s, wall time: 8207s step 1611 / 1920 (epoch 67.12 / 80): learning_rate = 7.97e-06, training loss = 8.23e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.00e-02 CPU time: 4665s, wall time: 8253s step 1620 / 1920 (epoch 67.50 / 80): learning_rate = 7.83e-06, training loss = 4.46e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.92e-02 CPU time: 4692s, wall time: 8299s step 1629 / 1920 (epoch 67.88 / 80): learning_rate = 7.69e-06, training loss = 4.42e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.88e-02 CPU time: 4718s, wall time: 8346s step 1638 / 1920 (epoch 68.25 / 80): learning_rate = 7.55e-06, training loss = 1.07e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.90e-02 CPU time: 4744s, wall time: 8392s step 1647 / 1920 (epoch 68.62 / 80): learning_rate = 7.42e-06, training loss = 4.77e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.02e-02 CPU time: 4771s, wall time: 8439s step 1656 / 1920 (epoch 69.00 / 80): learning_rate = 7.28e-06, training loss = 1.05e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.87e-02 CPU time: 4797s, wall time: 8485s step 1665 / 1920 (epoch 69.38 / 80): learning_rate = 7.15e-06, training loss = 1.29e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.85e-02 CPU time: 4823s, wall time: 8531s step 1674 / 1920 (epoch 69.75 / 80): learning_rate = 7.03e-06, training loss = 6.29e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.13e-02 CPU time: 4849s, wall time: 8577s step 1683 / 1920 (epoch 70.12 / 80): learning_rate = 6.90e-06, training loss = 5.80e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.06e-02 CPU time: 4875s, wall time: 8623s step 1692 / 1920 (epoch 70.50 / 80): learning_rate = 6.78e-06, training loss = 1.07e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.88e-02 CPU time: 4902s, wall time: 8670s step 1701 / 1920 (epoch 70.88 / 80): learning_rate = 6.66e-06, training loss = 6.38e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.89e-02 CPU time: 4928s, wall time: 8716s step 1710 / 1920 (epoch 71.25 / 80): learning_rate = 6.54e-06, training loss = 1.08e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.85e-02 CPU time: 4953s, wall time: 8762s step 1719 / 1920 (epoch 71.62 / 80): learning_rate = 6.42e-06, training loss = 7.15e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.83e-02 CPU time: 4979s, wall time: 8808s step 1728 / 1920 (epoch 72.00 / 80): learning_rate = 6.31e-06, training loss = 5.41e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.95e-02 CPU time: 5005s, wall time: 8854s step 1737 / 1920 (epoch 72.38 / 80): learning_rate = 6.19e-06, training loss = 1.10e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.98e-02 CPU time: 5032s, wall time: 8900s step 1746 / 1920 (epoch 72.75 / 80): learning_rate = 6.08e-06, training loss = 4.54e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.81e-02 CPU time: 5058s, wall time: 8946s step 1755 / 1920 (epoch 73.12 / 80): learning_rate = 5.98e-06, training loss = 9.96e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.83e-02 CPU time: 5084s, wall time: 8992s step 1764 / 1920 (epoch 73.50 / 80): learning_rate = 5.87e-06, training loss = 6.18e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.82e-02 CPU time: 5110s, wall time: 9039s step 1773 / 1920 (epoch 73.88 / 80): learning_rate = 5.76e-06, training loss = 7.71e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.86e-02 CPU time: 5136s, wall time: 9085s step 1782 / 1920 (epoch 74.25 / 80): learning_rate = 5.66e-06, training loss = 7.80e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.82e-02 CPU time: 5162s, wall time: 9131s step 1791 / 1920 (epoch 74.62 / 80): learning_rate = 5.56e-06, training loss = 4.86e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.81e-02 CPU time: 5189s, wall time: 9178s step 1800 / 1920 (epoch 75.00 / 80): learning_rate = 5.46e-06, training loss = 6.50e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.85e-02 CPU time: 5214s, wall time: 9223s step 1809 / 1920 (epoch 75.38 / 80): learning_rate = 5.36e-06, training loss = 6.64e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.83e-02 CPU time: 5240s, wall time: 9269s step 1818 / 1920 (epoch 75.75 / 80): learning_rate = 5.27e-06, training loss = 2.60e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.15e-02 CPU time: 5266s, wall time: 9316s step 1827 / 1920 (epoch 76.12 / 80): learning_rate = 5.17e-06, training loss = 5.70e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 6.04e-02 CPU time: 5293s, wall time: 9362s step 1836 / 1920 (epoch 76.50 / 80): learning_rate = 5.08e-06, training loss = 7.17e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.93e-02 CPU time: 5319s, wall time: 9408s step 1845 / 1920 (epoch 76.88 / 80): learning_rate = 4.99e-06, training loss = 7.91e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.78e-02 CPU time: 5345s, wall time: 9454s step 1854 / 1920 (epoch 77.25 / 80): learning_rate = 4.90e-06, training loss = 1.58e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.81e-02 CPU time: 5371s, wall time: 9500s step 1863 / 1920 (epoch 77.62 / 80): learning_rate = 4.81e-06, training loss = 4.91e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.83e-02 CPU time: 5397s, wall time: 9546s step 1872 / 1920 (epoch 78.00 / 80): learning_rate = 4.73e-06, training loss = 4.18e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.83e-02 CPU time: 5423s, wall time: 9592s step 1881 / 1920 (epoch 78.38 / 80): learning_rate = 4.64e-06, training loss = 7.88e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.85e-02 CPU time: 5449s, wall time: 9638s step 1890 / 1920 (epoch 78.75 / 80): learning_rate = 4.56e-06, training loss = 2.71e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.78e-02 CPU time: 5475s, wall time: 9684s step 1899 / 1920 (epoch 79.12 / 80): learning_rate = 4.48e-06, training loss = 8.61e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.91e-02 CPU time: 5500s, wall time: 9730s step 1908 / 1920 (epoch 79.50 / 80): learning_rate = 4.40e-06, training loss = 1.37e-01 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.84e-02 CPU time: 5526s, wall time: 9776s step 1917 / 1920 (epoch 79.88 / 80): learning_rate = 4.32e-06, training loss = 5.87e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.80e-02 CPU time: 5552s, wall time: 9822s step 1920 / 1920 (epoch 80.00 / 80): learning_rate = 4.29e-06, training loss = 6.98e-02 validation accuracy: 98.44 (378 / 384), f1 (weighted): 98.44, loss: 5.79e-02 CPU time: 5566s, wall time: 9842s validation accuracy: best = 98.96, mean = 98.44
We can see below that the classifier does not overfit the training data.
plot.plot_loss(loss_training, loss_validation, t_step, params['eval_frequency'])
error_validation = experiment_helper.model_error(model, features_validation, labels_validation)
print('The validation error is {:.2%}'.format(error_validation), flush=True)
/mnt/scratch/lts2/mdeff/deepsphere/deepsphere/../checkpoints/40sim_1024sides_2.0noise_2order_3sigma_FCN INFO:tensorflow:Restoring parameters from /mnt/scratch/lts2/mdeff/deepsphere/deepsphere/../checkpoints/40sim_1024sides_2.0noise_2order_3sigma_FCN/model-1920 The validation error is 1.56%
error_test = experiment_helper.model_error(model, features_test, labels_test)
print('The testing error is {:.2%}'.format(error_test), flush=True)
/mnt/scratch/lts2/mdeff/deepsphere/deepsphere/../checkpoints/40sim_1024sides_2.0noise_2order_3sigma_FCN INFO:tensorflow:Restoring parameters from /mnt/scratch/lts2/mdeff/deepsphere/deepsphere/../checkpoints/40sim_1024sides_2.0noise_2order_3sigma_FCN/model-1920 The testing error is 1.35%
The package offers a few different visualizations for the learned filters. First we can simply look at the Chebyshef coefficients. This visualization is not very interpretable for human, but can help for debugging problems related to optimization.
layer=2
ind_in = range(6) # Should be None if layer=1
ind_out = range(4)
model.plot_chebyshev_coeffs(layer, ind_in, ind_out)
/mnt/scratch/lts2/mdeff/deepsphere/deepsphere/../checkpoints/40sim_1024sides_2.0noise_2order_3sigma_FCN INFO:tensorflow:Restoring parameters from /mnt/scratch/lts2/mdeff/deepsphere/deepsphere/../checkpoints/40sim_1024sides_2.0noise_2order_3sigma_FCN/model-1920
<matplotlib.axes._subplots.AxesSubplot at 0x7f8b44c50cc0>
We observe the Chebyshef polynomials, i.e the filters in the graph spectral domain. This visuallization can help to understand wich graph frequencies are picked by the filtering operation. It mostly interpretable by the people for the graph signal processing community.
model.plot_filters_spectral(layer, ind_in, ind_out);
/mnt/scratch/lts2/mdeff/deepsphere/deepsphere/../checkpoints/40sim_1024sides_2.0noise_2order_3sigma_FCN INFO:tensorflow:Restoring parameters from /mnt/scratch/lts2/mdeff/deepsphere/deepsphere/../checkpoints/40sim_1024sides_2.0noise_2order_3sigma_FCN/model-1920
Here comes one of the most human friendly representation of the filters. It consists the section of the filters "projected" on the sphere. Because of the irregularity of the healpix sampling, this representation of the filters may not look very smooth.
import matplotlib
matplotlib.rcParams.update({'font.size': 16})
model.plot_filters_section(layer, ind_in, ind_out, title='');
/mnt/scratch/lts2/mdeff/deepsphere/deepsphere/../checkpoints/40sim_1024sides_2.0noise_2order_3sigma_FCN INFO:tensorflow:Restoring parameters from /mnt/scratch/lts2/mdeff/deepsphere/deepsphere/../checkpoints/40sim_1024sides_2.0noise_2order_3sigma_FCN/model-1920 4 6
Eventually, we can simply look at the filters on sphere. This representation clearly displays the sampling artifacts.
plt.rcParams['figure.figsize'] = (10, 17)
model.plot_filters_gnomonic(layer, ind_in, ind_out, title='');
/mnt/scratch/lts2/mdeff/deepsphere/deepsphere/../checkpoints/40sim_1024sides_2.0noise_2order_3sigma_FCN INFO:tensorflow:Restoring parameters from /mnt/scratch/lts2/mdeff/deepsphere/deepsphere/../checkpoints/40sim_1024sides_2.0noise_2order_3sigma_FCN/model-1920