Как запустить графовую нейронную сеть в машинном обучении Azure (регрессия)
Предпосылка
- Учетная запись Azure
- Служба машинного обучения Azure
- Создание вычислительного экземпляра
- Нужна учетная запись хранения
Пример использования
- Создавайте модели глубокого обучения с помощью графа
- Технология совершенно новая и может быть изменена
- Идея здесь состоит в том, чтобы использовать графические данные и использовать глубокое обучение.
- используя спектрал (https://github.com/danielegrattarola/spektral)
Пример 1
- На указанном выше веб-сайте есть еще примеры
- Цель здесь — запустить spektral в службе машинного обучения Azure.
- Создание вычислительного экземпляра
Код
- Теперь установите библиотеку
pip install spektral
- установленная версия на момент обучения
pip show spektral
Name: spektral Version: 1.0.8 Summary: Graph Neural Networks with Keras and Tensorflow 2. Home-page: https://github.com/danielegrattarola/spektral Author: Daniele Grattarola Author-email: [email protected] License: MIT Location: /anaconda/envs/azureml_py36/lib/python3.6/site-packages Requires: networkx, scipy, tensorflow, numpy, lxml, scikit-learn, requests, joblib, pandas, tqdm Required-by: Note: you may need to restart the kernel to use updated packages.
- Теперь создайте новый ноутбук Jupyter с Python 3.6 и AML SDK.
- Импорт библиотеки
import numpy as np import tensorflow as tf from tensorflow.keras import Model from tensorflow.keras.layers import Dense from tensorflow.keras.losses import MeanSquaredError from tensorflow.keras.optimizers import Adam
from spektral.data import DisjointLoader from spektral.datasets import QM9 from spektral.layers import ECCConv, GlobalSumPool
- Установите CPU/GPU и переменные
learning_rate = 1e-3 # Learning rate
epochs = 10 # Number of training epochs
batch_size = 32 # Batch size
- Теперь загрузите образцы данных
dataset = QM9(amount=1000) # Set amount=None to train on whole dataset
# Parameters F = dataset.n_node_features # Dimension of node features S = dataset.n_edge_features # Dimension of edge features n_out = dataset.n_labels # Dimension of the target
- Разделить данные
idxs = np.random.permutation(len(dataset)) split = int(0.9 * len(dataset)) idx_tr, idx_te = np.split(idxs, [split]) dataset_tr, dataset_te = dataset[idx_tr], dataset[idx_te]
loader_tr = DisjointLoader(dataset_tr, batch_size=batch_size, epochs=epochs) loader_te = DisjointLoader(dataset_te, batch_size=batch_size, epochs=1)
- определить модель
class Net(Model): def __init__(self): super().__init__() self.conv1 = ECCConv(32, activation="relu") self.conv2 = ECCConv(32, activation="relu") self.global_pool = GlobalSumPool() self.dense = Dense(n_out)
def call(self, inputs): x, a, e, i = inputs x = self.conv1([x, a, e]) x = self.conv2([x, a, e]) output = self.global_pool([x, i]) output = self.dense(output)
return output
model = Net() optimizer = Adam(learning_rate) loss_fn = MeanSquaredError()
- Создайте функции подгонки модели
@tf.function(input_signature=loader_tr.tf_signature(), experimental_relax_shapes=True)
def train_step(inputs, target):
with tf.GradientTape() as tape:
predictions = model(inputs, training=True)
loss = loss_fn(target, predictions) + sum(model.losses)
gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
return loss
- теперь обучите модель
- Модель будет работать 400 эпох
step = loss = 0
for batch in loader_tr:
step += 1
loss += train_step(*batch)
if step == loader_tr.steps_per_epoch:
step = 0
print("Loss: {}".format(loss / loader_tr.steps_per_epoch))
loss = 0
- Теперь покажите оцененные результаты из модели выше.
print("Testing model")
loss = 0
for batch in loader_te:
inputs, target = batch
predictions = model(inputs, training=False)
loss += loss_fn(target, predictions)
loss /= loader_te.steps_per_epoch
print("Done. Test loss: {}".format(loss))
Оригинал статьи — Samples2021/gnntestreg.md на главной · balakreshnan/Samples2021 (github.com)