Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 同一测试数据集在评估时生成不同的精度_Python_Tensorflow_Machine Learning_Deep Learning - Fatal编程技术网

Python 同一测试数据集在评估时生成不同的精度

Python 同一测试数据集在评估时生成不同的精度,python,tensorflow,machine-learning,deep-learning,Python,Tensorflow,Machine Learning,Deep Learning,当相同的测试数据集被输入到经过训练的模型中以执行评估时。 每次都返回不同的精度。原因是什么? 有解决办法吗 directory is shown as below ,each class has 200-300 images dataset |_ class1 |_ class2 |_ class3 ...... 代码如下所示 #import dataset dataset_path = '<directory>' DIR = pathlib.Path(datas

相同的测试数据集被输入到经过训练的模型中以执行评估时。 每次都返回不同的精度。原因是什么? 有解决办法吗

directory is shown as below ,each class has 200-300 images
dataset
  |_ class1
  |_ class2
  |_ class3
   ......
代码如下所示

#import dataset
dataset_path = '<directory>'
DIR = pathlib.Path(dataset_path)

#validation set
validation_set = tf.keras.preprocessing.image_dataset_from_directory(
  DIR,
  validation_split=0.2,
  subset="validation",
  seed=123,
  image_size=(150, 150),
  batch_size=32)
  
#test set
val_batches = tf.data.experimental.cardinality(validation_set)
test_set = validation_set.take(val_batches // 5)
validation_set = validation_set.skip(val_batches // 5)

#build model and train model
#......
#At the end of the training
#accuracy:0.9047  val_accuracy:0.8942

#evaluate model
loss, accuracy = model.evaluate(test_set)
#I run this line of code several times and each time it returns different accuracy 
#Says, the accuracies may range from 0.902 to 0.934
导入数据集 数据集路径=“” DIR=pathlib.Path(数据集路径) #验证集 验证\u集=来自\u目录的tf.keras.preprocessing.image\u数据集\u( 局长, 验证_分割=0.2, subset=“验证”, 种子=123, 图像大小=(150150), 批次(单位尺寸=32) #测试集 val\u batches=tf.data.experimental.cardinality(验证集) 测试集=验证集。获取(val\u批次//5) 验证集=验证集。跳过(val\u批次//5) #建立模型和训练模型 #...... #训练结束时 #精度:0.9047瓦卢精度:0.8942 #评价模型 损失,精度=模型评估(测试集) #我多次运行这行代码,每次都返回不同的精度 #表示,精度可能在0.902到0.934之间
您的模型在哪里定义?如果使用随机初始化定义模型(即,不指定初始化),并且每次启动脚本时都会创建模型,则获得不同的精度是正常的


初始化起着一定作用:如果你从两个不同初始化的模型开始,经过训练后,你通常会得到两个相似但仍然不同的模型

你说得对,我成功地重现了你的结果。只有在使用GPU时才会出现问题,因为某些GPU操作是不确定的。尝试设置:

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"

或者,如果您使用google colab,Runtime>Change Runtime Type>Hardware accelerator>None

虽然不能完全保证确定性输出,但您可以设置种子值
tf.random.set_seed(0)
@yudhiesh Ok。我会试试,然后告诉你它是否有效。谢谢。@yudhiesh很遗憾,它仍然没有按预期工作。但不管怎样,我还是很感激你的建议。结果有多不同?@yudhiesh Same。最低值可能在0.90左右。最高可达0.96。我真的不知道为什么会这样。一切似乎都很好,除了这部分……我已经纠正了错误。谢谢你的提醒。我相信这和随机初始化的事情没有多大关系。因为模型是经过训练的,所以问题在于每次我运行这个特定单元时,即使使用相同的测试数据集,
model.evaluate(test\u set)
也会生成不同的图形。我不明白为什么初始化会起作用:如果从两个不同的初始化模型开始,通常会得到两个相似但仍然不同的训练模型。这就是代码中实际发生的情况:您得到的模型每次都具有相似但不相等的精度(+1表示答案)@Sunnday:如果在训练模型时指定一个特定的随机种子,那么每次训练的模型都将是相同的,测试集上的性能也将是相同的。您还可以尝试在培训后将模型保存到文件中,并在测试时始终重复使用相同的模型文件。您说得对,我成功地复制了您的结果。只有在使用GPU时才会出现问题,因为某些GPU操作是不确定的。尝试设置:导入os.environ[“CUDA_VISIBLE_DEVICES”]=“-1”,或者,如果您使用google colab,运行时间>更改运行时间类型>硬件加速器>NoneI-see…但是如果没有GPU,将永远无法完成培训哈哈。谢谢你给我一些线索。我会在一段时间内解决这个问题:我试图处理GPU的不确定性,但问题没有解决。然后我提出了另一个解决方案,即将测试数据集移动到单独的文件中,而不是使用
.take()
.skip()
方法。无论如何,我感谢你的努力