问题描述
当我尝试在我的代码中实现此功能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,[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,"ba": tf.zeros([1,"Wya": tf.randomUniform([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,-1])
for(; l <= X.shape[1]; l++){
var xt = X_i.slice([0,l-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,parameters)
var loss = tf.losses.meanSquaredError(Y,model)
for (let f = 0; f < 10; f++) {
optimizer.minimize(loss)
}
这是一种用于情感分类的神经网络,具有多对一的结构。
解决方法
错误说明了一切
在variableGrads(f)中传递的f必须是一个函数
optimizer.minimize
期望函数作为参数而不是张量。由于代码正在尝试将meanSquaredError最小化,因此the argument
中的minimize
可以是一个计算预测值和预期值之间的meanSquaredError的函数。
const loss = (pred,label) => pred.sub(label).square().mean();
for (let f = 0; f < 10; f++) {
optimizer.minimize(() => tf.losses.meanSquaredError(Y,model))
}
它可以解决问题吗,还没有完全解决?该错误将因以下原因而改变:
variableGrads() expects at least one of the input variables to be trainable
是什么意思?使用优化器时,它期望作为参数传递的函数包含变量,变量的值将更新为函数输出的minimize
。
这是要进行的更改:
var Y = tf.tensor([[0,0],[0,[1,1,1]]).variable() // a variable instead
// var loss = tf.losses.meanSquaredError(Y,model)
// computed below in the minimize function
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))
}