我有一个分类问题,具有8个输入和1个输出。我创建了以下模型:
const hidden = tf.layers.dense({ units: 8, inputShape: [58, 8, 8], activation: 'sigmoid'});const output = tf.layers.dense({ units: 1, activation: 'softmax'});var model = tf.sequential({ layers: [ hidden, output ]});
现在当我进行预测时
const prediction = model.predict(inputTensor);prediction.print();
我期望预测结果只有1个输出值,但实际得到了更多,这是怎么回事?
这些是形状
console.log(input.shape) // [1, 58, 8, 8]console.log(prediction.shape) // [1, 58, 8, 1]
输出看起来像这样:
[[[[0.8124214], [0.8544047], [0.6427221], [0.5753598], [0.5 ], [0.5 ], [0.5 ], [0.5 ]], [[0.7638108], [0.642349 ], [0.5315424], [0.6282103], [0.5 ], [0.5 ], [0.5 ], [0.5 ]], ... 共58个这样的
回答:
input.shape
[1, 58, 8, 8] 对应以下内容:
- 1 是批次大小。关于批次大小更多信息
- 58, 8, 8 是网络入口处指定的输入形状
同样,output.shape
[1, 58, 8, 1] 对应以下内容:
- 1 仍然是批次大小
- 58, 8 匹配输入形状的内层维度
- 1 是网络最后的单位值
如果只期望得到单位值,即形状为 [1, 1] 的层,可以通过使用 tf.layers.flatten()
来移除内层维度。
const model = tf.sequential();model.add(tf.layers.dense({units: 4, inputShape: [58, 8, 8]}));model.add(tf.layers.flatten())model.add(tf.layers.dense({units: 1}));model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});model.fit(tf.randomNormal([1, 58, 8, 8]), tf.randomNormal([1, 1]))model.predict(tf.randomNormal([1, 58, 8, 8])).print()// 检查模型输出的推断形状,等于// `[null, 1]`。第一个维度是未确定的批次维度;第二个// 是模型最后一层的输出大小。console.log(JSON.stringify(model.outputs[0].shape));
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/[email protected]/dist/tf.min.js"></script>