当我尝试将tf.train.stg(learningRate).minimize(loss)
这个函数集成到我的代码中以进行反向传播时,我遇到了多个错误,例如传递给variableGrads(f)的f必须是一个函数。我该如何成功地将上述函数集成到下面的代码中?为什么会出现这个错误?
神经网络:
var X = tf.tensor([[1,2,3], [4,5,6], [7,8,9], [10,11,12]]) var Y = tf.tensor([[0,0,0],[0,0,0], [1,1,1]]) var m = X.shape[0] var a0 = tf.zeros([1,3]) var y_hat = tf.zeros([1,3]) var parameters = { "Wax": tf.randomUniform([1,3]), "Waa": tf.randomUniform([3,3]), "ba": tf.zeros([1,3]), "Wya": tf.randomUniform([3,3]), "by": tf.zeros([1,3]) } function RNN_cell_Foward(xt, a_prev, parameters){ var Wax = parameters["Wax"] var Waa = parameters["Waa"] var ba = parameters["ba"] var a_next = tf.sigmoid(tf.add(tf.add(tf.matMul(xt, Wax), tf.matMul(a_prev , Waa)),ba)) return a_next } function RNN_FowardProp(X, a0, parameters){ var T_x = X.shape[0] var a_next = a0 var i = 1 var Wya = parameters["Wya"] var by = parameters["by"] var l = 1 for(; i <= T_x; i++){ var X_i = X.slice([i-1,0],[1,-1]) for(; l <= X.shape[1]; l++){ var xt = X_i.slice([0,l-1],[1,1]) var a_next = RNN_cell_Foward(xt, a_next, parameters) } var y_pred = tf.sigmoid((tf.add(tf.matMul(a_next, Wya), by))) l = 1 if (i == 1){ var y_pred1 = y_pred } else if (i == 2) { var y_pred2 = y_pred } else if (i == 3) { var y_pred3 = y_pred } } var y_predx = tf.concat([y_pred1, y_pred2, y_pred3]) return y_predx } const learningRate = 0.01; var optimizer = tf.train.sgd(learningRate); var model = RNN_FowardProp(X, a0, parameters) var loss = tf.losses.meanSquaredError(Y, model) for (let f = 0; f < 10; f++) { optimizer.minimize(loss) }
这是一个用于情感分类的多对一结构的神经网络。
回答:
错误信息已经说明了一切:
传递给variableGrads(f)的f必须是一个函数
optimizer.minimize
期望接收一个函数作为参数,而不是一个张量。由于代码试图最小化均方误差,minimize
的参数可以是一个计算预测值和期望值之间均方误差的函数。
const loss = (pred, label) => pred.sub(label).square().mean();for (let f = 0; f < 10; f++) { optimizer.minimize(() => tf.losses.meanSquaredError(Y, model))}
这是否解决了问题?还不完全。错误会变成类似于:
variableGrads()期望至少有一个输入变量是可训练的
这是什么意思?当使用优化器时,它期望作为参数传递的函数包含其值将被更新以最小化
函数输出的变量。
需要做的更改如下:
var Y = tf.tensor([[0,0,0],[0,0,0], [1,1,1]]).variable() // 改为变量// var loss = tf.losses.meanSquaredError(Y, model)// 在minimize函数中计算const learningRate = 0.01;var optimizer = tf.train.sgd(learningRate);var model = RNN_FowardProp(X, a0, parameters);const loss = (pred, label) => pred.sub(label).square().mean();for (let f = 0; f < 10; f++) { optimizer.minimize(() => tf.losses.meanSquaredError(Y, model))}