首页 > 解决方案 > How to apply tf.layers.add on different models' weights?

问题描述

I am trying to make an element-wise addition on the weights of two different models.

I developed the following algorithm :

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();

However, I am getting this error:

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

I created the models with the following code:

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

Can anyone explain the error to me? Are there any alternative ways to make the addition?

标签: node.jstensorflowmachine-learningtensorflow.js

解决方案


该函数getWeights()返回一个 Promise,因此当您调用时,weights.push(getWeights('...'))您传入的是 Promise 而不是张量。它可以像这样更新:

weights.push(await getWeights('...'))

中的 PromisegetWeights()解析为函数(即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();
}

aggregate()也可以使用类似的更新。

您可以在此处找到有关 Promises 和 async/await 的更多详细信息: https ://stackoverflow.com/a/14220323


推荐阅读