【发布时间】:2019-09-13 04:51:21
【问题描述】:
我想更改监督模型的权重,但在更改权重后我得到了完全相同的结果。我做错了什么?
const model = tf.sequential();
model.add(tf.layers.dense({...}));
model.add(tf.layers.dense({...}));
model.add(tf.layers.dense({...}));
model.compile({...});
model.fit({});
const result1 = model.predict(tf.tensor2d(...)).dataSync();
const newWeights = [];
model.layers.map((layer, i) => {
newWeights[i] = []
const weights = layer.getWeights();
newWeights[i][0] = weights[0].arraySync()
newWeights[i][1] = weights[1].arraySync()
newWeights[i][0].map(tensor => tensor.map(x => {
if (random(1) < 0.5) {
return x + offset();
}
return x;
})
layer.setWeights([tf.tensor2d(newWeights[i][0], [newWeights[i][0].length, newWeights[i][0][0].length]), tf.tensor(newWeights[i][1])])
})
const result2 = model.predict(tf.tensor2d(...)).dataSync();
代码sn-ps:
const random = (max) => {
return floor(Math.random() * Math.floor(max), 2);
}
const floor = (num, toDecimal) => {
let dec = Math.pow(10, toDecimal);
return Number(Math.floor(num * dec) / dec);
}
const offset = () => {
randomGaussian() * 0.5
}
let previous = false;
let y2 = 0;
const randomGaussian = (mean, sd) => {
let y1, x1, x2, w;
if (previous) {
y1 = y2;
previous = false;
} else {
do {
x1 = random(2) - 1;
x2 = random(2) - 1;
w = x1 * x1 + x2 * x2;
} while (w >= 1);
w = Math.sqrt(-2 * Math.log(w) / w);
y1 = x1 * w;
y2 = x2 * w;
previous = true;
}
let m = mean || 0;
let s = sd || 1;
return y1 * s + m;
};
result1 === result2 但为什么呢?
【问题讨论】:
-
您确定
random(1)返回的结果低于 0.5 吗?能否请您添加random和offset的代码,如果可能的话制作一个sn-p -
@edkeveked 我已经添加了代码 sn-ps,但是是的,我已经确认张量值实际上正在发生变异。我确信在设置权重时,我的 newWeights 变量中的值确实发生了变异和不同。是否有应用功能或我缺少的东西?
-
在下面查看我的答案