为什么每次在代码中运行TensorFlow模型时结果都在变化?

wmomyfyw  于 2023-06-06  发布在  其他
关注(0)|答案(2)|浏览(360)

这样的问题我写了这段代码,但是我不明白当我每次运行这段代码的时候,结果都发生了变化,那么:(1,0,0),(0,1,0),(1,1,1)等等,你能告诉我是什么问题吗?即使在训练模型的数据上,结果仍然不是预期的。谢谢

// Input data (genre, duration, lead actor)
const data = [
  [1, 1, 1],    // like it
  [0, 0, 1],    // doesn't like it
  [1, 0, 0],    // doesn't like it
  [0, 1, 0],    // doesn't like it
  [0, 1, 1],    // doesn't like it
  [1, 0, 1],    // doesn't like it
  [1, 1, 0],    // doesn't like it
];

// Tags (0 - Dislike, 1 - Like)
const labels = [
  1,    // like it
  0,    // doesn't like it
  0,    // doesn't like it
  0,    // doesn't like it
  0,    // doesn't like it
  0,    // doesn't like it
  0,    // doesn't like it
];

const model = tf.sequential();

model.add(tf.layers.dense({ inputShape: [3], units: 4, activation: 'relu' }));

model.add(tf.layers.dense({ units: 1, activation: 'sigmoid', }));

model.compile({ optimizer: 'adam', loss: 'binaryCrossentropy', metrics: ['accuracy'] });

const inputData = tf.tensor2d(data, [data.length, 3]);
const labelData = tf.tensor1d(labels);

model.fit(inputData, labelData, { epochs: 200 })
  .then(() => {
    // test model
    const testData = [
      [1, 1, 1],    // like it
      [0, 1, 0],    // Don't like it
      [0, 0, 1]     // Don't like it
    ];

    const predictions = model.predict(tf.tensor2d(testData));
    const predictedLabels = predictions.round().dataSync();

    console.log('result:', predictedLabels);
  });

结果必须为1,0,0

bq3bfh9z

bq3bfh9z1#

您编写的代码看起来很好,应该可以按预期工作。然而,不一致结果的一个可能原因是训练数据的相对较小的大小和模型权重的初始化中固有的随机性。
每次运行程序时,模型的初始权重都是随机分配的。由于这些模型的随机性,初始权重可以极大地影响模型的学习能力,特别是当数据量很小时。
最后,增加训练的epoch数量也可能有助于模型更好地学习,但它也可能导致过拟合,特别是对于小数据集。但是在这个测试中我觉得你也需要过度拟合。但是如果你的模型是很好的学习,不要考虑一致性。
但是如果你真的需要consistencym,seed参数会给予你一致性,但是你不能在Tf.js中使用。但在TensorFlow Python中,您可以为随机数生成器设置种子,然后保存并转换该模型以在TensorFlow.js中使用,模型在训练期间学习的权重将被保留。这意味着Python中的初始随机种子有效地影响了JavaScript中使用的最终模型。
你可以这样定义你的模型:

model.add(tf.keras.layers.Dense(units=1, 
                                activation='sigmoid', 
                                kernel_initializer=tf.keras.initializers.GlorotUniform(seed=0), 
                                bias_initializer=tf.keras.initializers.Zeros()))
hyrbngr7

hyrbngr72#

我解决了它,我在训练中添加了更多重复的数据,例如:[1,1,1]和其他类似的数组,有3个输入,重复~ 10次,最后我得到了我期望的结果

相关问题