Как применить tf.layers.add к весам разных моделей? - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь сделать поэлементное сложение для весов двух разных моделей.

Я разработал следующий алгоритм:

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']});

Может кто-нибудь объяснить мне ошибку? Есть ли альтернативные способы сделать дополнение?

1 Ответ

0 голосов
/ 17 марта 2020

функция getWeights() возвращает Обещание, поэтому при вызове weights.push(getWeights('...')) вы передаете Обещание вместо Тензора. его можно обновить следующим образом:

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

Обещание в getWeights() разрешается в функции (т.е. 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 здесь: { ссылка }

...