Tensorflow / ff js: веса слоя внедрения равны NaN после обучения с помощью метода model.fit () - PullRequest
1 голос
/ 10 июля 2020

Я новичок в программировании тензорного потока (tf js), и я хотел бы обучить вложения для задач и связанных действий. Идея состоит в том, чтобы иметь 2 слоя встраивания (один для задач и один для соответствующих действий). Что меня интересует, так это получить тренированные веса двух встраиваемых слоев. Однако после выполнения метода model.fit (...) все веса встраиваемых слоев будут NaN . Понятия не имею, что я делаю неправильно.

С помощью следующего фрагмента кода я создаю соответствующую сеть тензорного потока:

function createNetwork(samples, embeddingDimSize, taskIndexesLength, actionIndexesLength) {
const actionInput = tf.input({name: 'actionInput', shape: [1]})
const actionEmbedding = tf.layers.embedding({name: 'actionEmbedding', inputDim: actionIndexesLength, outputDim: embeddingDimSize}).apply(actionInput)

const taskInput = tf.input({name: 'taskInput', shape: [1]})
const taskEmbedding = tf.layers.embedding({name: 'taskEmbedding', inputDim: taskIndexesLength, outputDim: embeddingDimSize}).apply(taskInput)

const dotLayer = tf.layers.dot({normalize: true, axes: 2}).apply([taskEmbedding, actionEmbedding])

const reshapeLayer = tf.layers.reshape({targetShape: [1]}).apply(dotLayer)

const output = tf.layers.dense({name: "output", activation: "sigmoid", units: 1}).apply(reshapeLayer)
const model = tf.model({name: "myEmbeddings", inputs: [taskInput, actionInput], outputs: output})
model.compile({optimizer: tf.train.adam(0.0001), loss: 'binaryCrossentropy', metrics: ['accuracy']})
return model}

Следовательно, топология сети последовательно соединена как следующим образом:

  • 2 входных слоя с одним входом либо для значения задачи, либо для значения действия
  • 2 встраиваемых слоя, связанных со слоем скалярного произведения
  • скалярное произведение слой
  • слой изменения формы
  • плотный слой для двоичного вывода

Я генерирую обучающие примеры для входного слоя 1 и входного слоя 2 и адекватно вывод с соответствующие метки (0 или 1)

, затем я пытаюсь подогнать модель с обучающими данными с помощью

await model.fit([x1, x2], y, { epochs: epochs, batchSize: 50 }

После этого я запрашиваю веса встраиваемых слоев по:

model.getLayer('taskEmbedding').getWeights()[0].print()
model.getLayer('actionEmbedding').getWeights()[0].print()

Я не получаю ошибок при выполнении всего. Есть идеи, что не так с моим кодом и что мне нужно изменить?

1 Ответ

0 голосов
/ 10 июля 2020

РЕДАКТИРОВАТЬ: После некоторого расследования я обнаружил ошибку в моем коде. Индекс измерения встраивания слова должен соответствовать длине индекса слоя встраивания. В моем случае я начал индекс словарного запаса с 1, а не с 0. Поэтому мне пришлось добавить +1 к переменной inputDim определения слоя встраивания. Альтернативный вариант - начать индекс словарного запаса с 0, тогда вы не должны добавлять +1 к переменной inputDim. Приведенный ниже пример кода необходим, если ваш словарный указатель слов начинается с 1. Словарь слов означает в этом контексте, что ваши слова индексируются, чтобы сделать их однозначно обрабатываемыми в сети:

const actionEmbedding = tf.layers.embedding({name: 'actionEmbedding', inputDim: actionIndexesLength + 1, outputDim: embeddingDimSize}).apply(actionInput)

и

const taskEmbedding = tf.layers.embedding({name: 'taskEmbedding', inputDim: taskIndexesLength + 1, outputDim: embeddingDimSize}).apply(taskInput)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...