【发布时间】:2020-10-31 04:50:12
【问题描述】:
我是 tensorflow (tfjs) 编程的新手,我想为任务和相关操作训练嵌入。这个想法是有 2 个嵌入层(一个用于任务,一个用于相应的操作)。我感兴趣的是获得两个嵌入层的训练权重。然而,在执行 model.fit(...) 方法后,嵌入层的所有权重都是 NaN。我不知道,我做错了什么。
使用下面的代码sn-p,我创建了合适的tensorflow网络:
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()
执行所有操作时都没有错误。 任何想法,我的代码出了什么问题以及我必须改变什么?
【问题讨论】:
标签: javascript tensorflow machine-learning deep-learning