我正在使用tfjs和一些(伪造的)医学数据(乳腺癌)进行一个概念验证脚本。数据看起来像这样:
[206, 293, 140, 126, 117, 27, 35, 152, 239, 79],结果(ys)是[1],其中1表示恶性,0表示良性。
脚本似乎在训练,但准确率/损失从未改变,无论数据如何,结果都相同。我已经验证了数据/格式。脚本如下:
const transformedData = _.shuffle(data).map(util.transformRow);// 定义模型const model = tf.sequential();// 设置网络层model.add(tf.layers.dense({units: 10, activation: 'relu', inputShape: [10]}));model.add(tf.layers.dense({units: 150, activation: 'relu'}));model.add(tf.layers.dense({units: 250, activation: 'relu'}));model.add(tf.layers.dense({units: 250, activation: 'relu'}));model.add(tf.layers.dense({units: 250, activation: 'relu'}));model.add(tf.layers.dense({units: 1, activation: 'softmax', outputShape: [1]}));// 定义优化器const optimizer = tf.train.adam(LEARNING_RATE);// 初始化模型model.compile({ optimizer: optimizer, loss: 'meanSquaredError', metrics: ['accuracy'],}); const ys = transformedData.map(d => [d.ys]); const xs = transformedData.map(d => d.xs); let xTrain = tf.tensor2d(xs.slice(0,500), [xs.slice(0,500).length, 10]); // [[123,234,345...], [...]...] let yTrain = tf.tensor2d(ys.slice(0,500), [ys.slice(0,500).length, 1]); // [[1], [0]...] console.log('ready to start training model'); const history = await model.fit(xTrain, yTrain, { epochs: EPOCHS, validationData: [xTrain, yTrain], })
需要明确的是,我现在不关心结果的超高准确性或优化,我只希望脚本能够真正训练模型。
回答:
两个问题:
-
由于您处于二分类设置中,您应该使用
loss: 'binaryCrossentropy'
(MSE用于回归问题)。 -
在这种设置中,输出层的
softmax
激活没有任何意义;将其更改为sigmoid
。
另外,您没有分享LEARNING_RATE
的实际值;尝试完全删除该参数 – Adam以其默认学习率通常(非常)有效而闻名。