Deep and Machine Learning for Microscopy
Full Changelog: https://github.com/pycroscopy/atomai/compare/v0.7.4...v0.7.8
Minor fixes and improvements
stat.multivar.update_classes()
that didn't allow specifying custom window sizeExample of using an ensemble of DKL models:
# Initialize and train ensemble of models
dklgp = aoi.models.dklGPR(indim=X_train.shape[-1], embedim=2)
dklgp.fit_ensemble(X_train, y_train, n_models=5, training_cycles=1500, lr=0.01)
# Make a prediction
y_samples = dklgp.sample_from_posterior(X_test, num_samples=1000) # n_models x n_samples x n_data
y_pred = y_samples.mean(axis=(0,1)) # average over model and sample dimensions
y_var = y_samples.var(axis=(0,1))
Example of using a built-in Thompson sampler for active learning:
for e in range(exploration_steps):
# obtain/update DKL-GP posterior
dklgp = aoi.models.dklGPR(data_dim, embedim=2, precision="single")
dklgp.fit(X_train, y_train, training_cycles=50)
# Thompson sampling for selecting the next measurement/evaluation point
obj, next_point = dklgp.thompson(X_cand)
# Perform a 'measurement'
y_measured = measure(next_point)
# Update measured and candidate points, etc...
Bug fixes and additional utility functions for image and spectral data processing
Minor release to patch some numerical stability issues with DKL-GP
The DKL-GP is based on this paper and can be used for predicting a functional property (or properties) from structural data such as images. Example of usage:
# Structural image data
n, d1, d2 = imgstack.shape
x_train = imgstack.reshape(n, d1*d2)
# Property
y_train = P[:, 0] # can be a scalar or vector variable
# Input data dims
data_dim = x_train.shape[-1]
# Initialize model
dklgp = aoi.models.dklGPR(data_dim)
# Train
dklgp.fit(
x_train y_train, # inputs and outputs
training_cycles=100, precision="single", lr=1e-2 # training parameters
)
# Make a prediction (with quantified uncertainty) with the trained model
mean, var = dklgp.predict(x_new)
For more details, see the example notebook
One can now load pre-trained models for atomic feature finding in graphene and BFO-like systems. Currently limited to STEM data. Example of usage:
# Load model for atom finding in graphene, which was trained on simulated data
model = aoi.models.load_pretrained_model("G_MD")
# Apply to your data
nn_out, coords = model.predict(new_data)
As with any machine learning model, there is a caveat that the performance of pre-trained models will likely degrade significantly on the out-of-distribution data (different feature size, presence of objects on the surface not accounted for in the simulations, etc.)
atomai.utils.dataset
module with experimental datasets for scientific machine learning# We are going to start with a constant learning rate, then after 600 iterations we begin
# linearly decreasing it over the next 200 iterations, and keep constant afterwards
lr_t = np.ones(800) * 1e-3
lr_t[600:800] = np.linspace(1e-3, 1e-4, 200)
model.fit(images, labels, images_test, labels_test, # training data
training_cycles=1000, compute_accuracy=True, # basic training parameters
swa=True, lr_scheduler=lr_t # advanced training parameters
)