我正在学习tensorflow.js,并试图创建一个模型来预测两个“团队”之间基于其“玩家”的随机比赛/比赛的获胜者。
const rawMatches = [
{
t1: [2, 99, 3, 5, 7],
t2: [4, 75, 48, 23, 6],
winner: 0
},
{
t1: [2, 99, 48, 5, 7],
t2: [4, 75, 3, 23, 6],
winner: 1
},
{
t1: [2, 83, 3, 4, 23],
t2: [4, 75, 58, 25, 78],
winner: 0
},
{
t1: [26, 77, 11, 5, 7],
t2: [3, 43, 48, 23, 9],
winner: 1
},
{
t1: [2, 99, 3, 5, 7],
t2: [6, 65, 28, 23, 6],
winner: 0
}
];
const train = async () => {
// [
// [[2, 99, 3, 5, 7], [4, 75, 48, 23, 6]],
// [[2, 99, 48, 5, 7], [4, 75, 3, 23, 6]],
// [[2, 99, 3, 5, 7], [4, 75, 48, 23, 6]]
// ];
const xs = tf.tensor3d(
rawMatches.map((match, index) => [match.t1, match.t2])
);
// [[1, 0], [0, 1], [1, 0]];
const labelsTensor = tf.tensor1d(
rawMatches.map(match => (match.winner === 1 ? 1 : 0)),
"int32"
);
const ys = tf.oneHot(labelsTensor, 2);
xs.print();
ys.print();
let model = tf.sequential();
const hiddenLayer = tf.layers.dense({
units: 15,
activation: "sigmoid",
inputShape: [5, 2, 5]
});
const outputLayer = tf.layers.dense({
units: 2,
activation: "softmax"
});
model.add(hiddenLayer);
model.add(outputLayer);
const optimizer = tf.train.sgd(0.2);
model.compile({
optimizer,
loss: "categoricalCrossentropy"
});
model.fit(xs, ys, { epochs: 1 });
};
train();
<html>
<head>
<!-- Load TensorFlow.js -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.13.0"> </script>
</head>
<body>
</body>
</html>
尝试拟合模型后,会发生以下错误:
Error when checking input: expected dense_Dense11_input to have 4 dimension(s). but got array with shape 5,2,5
答案 0 :(得分:1)
此模型有两个问题:
首先,传递给方法fit
的输入x的维数。 xs
应该比第一个inputShape
高一个维度。因为xs
是一个包含形状为inputShape
的数据的数组,所以inputShape应该为[2, 5]
。
第二,由于输入和输出的维度不匹配,因此您需要使用tf.flatten来更改数据的维度。这两个维度不匹配,因为输入数据形状为[2, 5] (size = 2)
,而输出数据形状为[2] (size = 1)
const rawMatches = [
{
t1: [2, 99, 3, 5, 7],
t2: [4, 75, 48, 23, 6],
winner: 0
},
{
t1: [2, 99, 48, 5, 7],
t2: [4, 75, 3, 23, 6],
winner: 1
},
{
t1: [2, 83, 3, 4, 23],
t2: [4, 75, 58, 25, 78],
winner: 0
},
{
t1: [26, 77, 11, 5, 7],
t2: [3, 43, 48, 23, 9],
winner: 1
},
{
t1: [2, 99, 3, 5, 7],
t2: [6, 65, 28, 23, 6],
winner: 0
}
];
const train = () => {
const xs = tf.tensor3d(
rawMatches.map((match, index) => [match.t1, match.t2])
);
const labelsTensor = tf.tensor1d(
rawMatches.map(match => (match.winner === 1 ? 1 : 0)),
"int32"
);
const ys = tf.oneHot(labelsTensor, 2);
xs.print();
ys.print();
let model = tf.sequential();
const hiddenLayer = tf.layers.dense({
units: 15,
activation: "sigmoid",
inputShape: [2, 5]
});
const outputLayer = tf.layers.dense({
units: 2,
activation: "softmax"
});
model.add(hiddenLayer);
model.add(tf.layers.flatten())
model.add(outputLayer);
const optimizer = tf.train.sgd(0.2);
model.compile({
optimizer,
loss: "categoricalCrossentropy"
});
model.fit(xs, ys, { epochs: 1 });
};
train();
<html>
<head>
<!-- Load TensorFlow.js -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.13.0"> </script>
</head>
<body>
</body>
</html>