Javascript 有没有一种方法可以从没有.dataSync()的tensorflow.js变量中获取值?

Javascript 有没有一种方法可以从没有.dataSync()的tensorflow.js变量中获取值?,javascript,tensorflow,tensorflow.js,nonlinear-optimization,Javascript,Tensorflow,Tensorflow.js,Nonlinear Optimization,标题有点不言自明。在将函数拟合到实验数据的优化过程的每次迭代之前,我需要得到一个变量的值。变量是c0和k,它们只是标量。使用.dataSync()我得到一个错误,如下所示: 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

标题有点不言自明。在将函数拟合到实验数据的优化过程的每次迭代之前,我需要得到一个变量的值。变量是c0和k,它们只是标量。使用.dataSync()我得到一个错误,如下所示:

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));
}; 
找不到任何变量与损失函数y=f(x)的结果之间的联系。请确保使用变量的操作在传递给minimize()的函数f中。

代码如下:

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));
}; 
const c0_tensor=tf.scalar(c0.variable(),k_tensor=tf.scalar(k.variable();
//y=c0*e^(k*x)
常量fun=(t)=>t.mul(k_张量).exp().mul(c0_张量);
const cost=(pred,label)=>pred.sub(label.square().mean();
常数学习率=0.1;
常量优化器=tf.train.adagrad(学习率);
//训练模型。
for(设i=0;i<500;i++){
最小化(()=>成本(fun(x_张量),y_张量));
}; 

我的问题是,是否有其他方法可以在不使用.dataSync()的情况下将每次迭代中的c0和k值捕获到新的JS变量中?

请直接在代码中找到解释

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()
let list_k=[]
for(设i=0;i<500;i++){
//如果希望在优化过程中获得k的所有值
//在数组中按k
//但是,也可以推送从后端下载的值
//ie list_k.push(…k.dataSync())
列表k.推送(k)
//对其他参数也执行同样的操作
最小化(()=>成本(乐趣(x),y));
}
//优化后,可以在此处访问k(s)值
//例如,打印它们
tf.stack(list_k).print()

请直接在代码中找到解释

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()
let list_k=[]
for(设i=0;i<500;i++){
//如果希望在优化过程中获得k的所有值
//在数组中按k
//但是,也可以推送从后端下载的值
//ie list_k.push(…k.dataSync())
列表k.推送(k)
//对其他参数也执行同样的操作
最小化(()=>成本(乐趣(x),y));
}
//优化后,可以在此处访问k(s)值
//例如,打印它们
tf.stack(list_k).print()

明白了!这是一种很好的存储方式,它的运行速度似乎也一样快。我还想知道是否有一种方法可以在进行优化时将它们放入js变量中,而不是存储它们并在之后使用它们。然而,据我所知,这可能很难做到,因为张量存储在GPU中(这也会影响性能)。如果没有其他选择,我会接受这个答案。非常感谢。您可以使用回答中所示的数据同步。明白了!这是一种很好的存储方式,它的运行速度似乎也一样快。我还想知道是否有一种方法可以在进行优化时将它们放入js变量中,而不是存储它们并在之后使用它们。然而,据我所知,这可能很难做到,因为张量存储在GPU中(这也会影响性能)。如果没有其他选择,我会接受这个答案。非常感谢。您可以使用答案中所示的dataSync