Есть ли способ получить значение из переменной tensorflow.js без .dataSync ()?

название говорит само за себя. Мне нужно получить значение переменной перед каждой итерацией процесса оптимизации подгонки функции к экспериментальным данным. Переменные c0 и k, которые являются просто скалярами. Используя .dataSync (), я получаю следующее сообщение об ошибке:

Не удается найти связь между какой-либо переменной и результатом функции потерь y = f (x). Убедитесь, что операции, в которых используются переменные, находятся внутри функции f, переданной в Minimum ().

Код выглядит следующим образом:

const c0_tensor = tf.scalar(c0).variable(), k_tensor = tf.scalar(k).variable();
// y = c0*e^(k*x)
const fun = (t) => t.mul(k_tensor).exp().mul(c0_tensor);
const cost = (pred, label) => pred.sub(label).square().mean();
const learning_rate = 0.1;
const optimizer = tf.train.adagrad(learning_rate);
// Train the model.
for (let i = 0; i < 500; i++) {
optimizer.minimize(() => cost(fun(x_tensor), y_tensor));
}; 

Мой вопрос: есть ли другой способ уловить значение c0 и k на каждой итерации в новую переменную JS без использования .dataSync ()?


person OMS    schedule 25.11.2020    source источник


Ответы (1)


Пожалуйста, найдите объяснение прямо в коде

let list_k = []
for (let i = 0; i < 500; i++) {
  // if you want to get all the values of k as the optimizations continues
  // push k in the array
  // however, the values downloaded from the backend could also be pushed
  // ie list_k.push(...k.dataSync())
  list_k.push(k)
  // do likewise for the other parameters
  optimizer.minimize(() => cost(fun(x), y));
}

// after the optimizations the k(s) values can be accessed here
// for example print them
tf.stack(list_k).print()
person edkeveked    schedule 26.11.2020
comment
Понятно! это хороший способ их хранения, и, похоже, он работает так же быстро. Мне также было интересно, есть ли способ поместить их в переменную js во время оптимизации, вместо того, чтобы хранить и использовать их впоследствии. Однако, насколько мне известно, это может быть сложно сделать, потому что тензоры хранятся в графическом процессоре (и это также повлияет на производительность). Я приму этот ответ, если не будет другого выхода. Спасибо! - person OMS; 26.11.2020
comment
вы можете использовать dataSync, как указано в ответе - person edkeveked; 26.11.2020