【发布时间】:2020-02-02 04:43:39
【问题描述】:
在 TensorFlow.js 中,我创建了一个具有 3 个密集层的顺序神经网络,当我将激活函数设置为“relu”时,它可以工作,但是当我尝试“tanh”或“sigmoid”时,它会抛出错误,“错误:张量被处置”。
我做了一个模型总结,以验证更改激活函数不会改变网络结构或参数编号。我还尝试注释掉我正在使用的tf.tidy。
这是我的模型:
const myModel = tf.sequential();
myModel.add(tf.layers.dense({ units: 64, inputShape: [1], activation: 'tanh' }));
myModel.add(tf.layers.dense({ units: 64, inputShape: [1], activation: 'relu' }));
myModel.add(tf.layers.dense({ units: 1 }));
将'tanh' 切换为'relu' 可以解决问题,但我不知道为什么。
这是我的训练代码:
optimizer.minimize(() => {
let inputs = tf.tensor2d(x_vals);
let predictions = myModel.predictOnBatch(inputs);
let totalLoss = tf.losses.meanSquaredError(tf.tensor2d(y_vals), predictions);
return totalLoss;
});
完整代码片段(运行需要一秒钟):
x_vals = [
[1],
[2],
[3],
[4],
[5]
];
y_vals = [
[1],
[2],
[3],
[4],
[5]
];
const optimizer = tf.train.adam(.005);
const myModel = tf.sequential();
myModel.add(tf.layers.dense({ units: 64, inputShape: [1], activation: 'tanh' }));
myModel.add(tf.layers.dense({ units: 64, activation: 'relu' }));
myModel.add(tf.layers.dense({ units: 1 }));
myModel.summary();
optimizer.minimize(() => {
let inputs = tf.tensor2d(x_vals);
let predictions = myModel.predictOnBatch(inputs);
let totalLoss = tf.losses.meanSquaredError(tf.tensor2d(y_vals), predictions);
return totalLoss;
});
curveY = [];
for (let i = 0; i < x_vals.length; i++) {
curveY.push(myModel.predict(tf.tensor([
x_vals[i]
])).dataSync());
}
console.log(curveY);
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.0.0/dist/tf.js">
</script>
</head>
<body>
</body>
</html>
【问题讨论】:
标签: tensorflow neural-network tensorflow.js activation-function