如何在不同模型的权重上应用 tf.layers.add?



我正试图对两个不同模型的权重进行元素相加

我开发了以下算法:

async function getWeights(url){
return new Promise(async function(resolve, reject){
const model  =  await tf.loadLayersModel(url);
resolve(model.layers[0].getWeights);
});
}
async function aggregate(){
return new Promise(function (resolve, reject){
weights.push(getWeights('file://./mymodel/modelReceived.json'));
weights.push(getWeights('file://./mymodel/model.json'));
let averageLayer = tf.layers.average();
console.log(weights.length);
const average = averageLayer.apply([weights[0], weights[1]]);
model.layers[0].setWeights[average];
resolve(model);
});
}
async function returnValue(){
var model = await aggregate();
console.log(model);
}
returnValue();

然而,我得到了这个错误:

(node:20468) UnhandledPromiseRejectionWarning: Error: A merge layer should be called on an Array of at least 2 inputs. Got 1 input(s).

我用以下代码创建了模型:

const modelOne = tf.sequential();
modelOne.add(tf.layers.dense({units: 100, activation: 'relu', inputShape: [50]}));
modelOne.compile({optimizer: 'sgd', loss: 'meanSquaredError', metrics: ['accuracy']});

有人能向我解释一下这个错误吗?有没有其他方法可以添加?

函数getWeights()返回Promise,因此当您调用weights.push(getWeights('...'))时,您传递的是Promise而不是Tensor。它可以这样更新:
weights.push(await getWeights('...'))

getWeights()中的Promise解析为一个函数(即model.layers[0].getWeights(,而不是解析为权重:

resolve(model.layers[0].getWeights())

您不应该同时执行Promise和async/await。您可以简化getWeights()函数,如下所示:

async function getWeights(url){
const model  =  await tf.loadLayersModel(url);
return model.layers[0].getWeights();
}

CCD_ 6也可以使用类似的更新。

你可以在Promises&async/await在此:https://stackoverflow.com/a/14220323

最新更新