Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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
为什么tensorflow在直接比较中的精确度比keras差?_Tensorflow_Machine Learning_Keras_Deep Learning_Image Recognition - Fatal编程技术网

为什么tensorflow在直接比较中的精确度比keras差?

为什么tensorflow在直接比较中的精确度比keras差?,tensorflow,machine-learning,keras,deep-learning,image-recognition,Tensorflow,Machine Learning,Keras,Deep Learning,Image Recognition,我用相同的参数和相同的数据集(MNIST)直接比较了TensorFlow和Keras 奇怪的是,Keras在10个时期内实现了96%的性能,而TensorFlow在10个时期内实现了约70%的性能。我在同一个实例中多次运行此代码,这种不一致性总是发生 即使为TensorFlow设置50个纪元,最终性能也达到90% 代码: TensorFlow代码:(x_列、x_测试、y_列、y_测试与上述Keras代码的输入相同) 我在同一个实例中运行所有程序。有人能解释这种不一致吗 我认为是初始化造成的。例如

我用相同的参数和相同的数据集(MNIST)直接比较了TensorFlow和Keras

奇怪的是,Keras在10个时期内实现了96%的性能,而TensorFlow在10个时期内实现了约70%的性能。我在同一个实例中多次运行此代码,这种不一致性总是发生

即使为TensorFlow设置50个纪元,最终性能也达到90%

代码:

TensorFlow代码:(x_列、x_测试、y_列、y_测试与上述Keras代码的输入相同)


我在同一个实例中运行所有程序。有人能解释这种不一致吗

我认为是初始化造成的。例如,一个真正的区别是,在TF中使用
random_normal
初始化偏差,这不是最佳实践,事实上,Keras默认将偏差初始化为零,这是最佳实践。您不需要重写它,因为您只在Keras代码中设置了
kernel\u初始值设定项
,而没有设置
bias\u初始值设定项

此外,对于权重初始值设定者来说情况更糟。您正在对KERA使用
RandomNormal
,定义如下:

keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None)
但在TF中,您使用
TF.random.normal

tf.random.normal(shape, mean=0.0, stddev=1.0, dtype=tf.dtypes.float32,    seed=None, name=None)
我可以告诉您,使用标准偏差0.05进行初始化是合理的,但使用1.0则不然

我怀疑如果你改变这些参数,事情会变得更好。但如果他们不这样做,我建议把这两种模型的TensorFlow图都倒出来,用手检查一下,看看有什么不同。在这种情况下,图形足够小,可以进行双重检查

在某种程度上,这突出了Keras和TF在哲学上的差异。Keras努力为NN训练设置良好的默认值,以符合已知的工作方式。但是TensorFlow是完全不可知的——您必须了解这些实践,并明确地将它们编码进来。标准偏差就是一个很好的例子:当然,在数学函数中默认值应该是1,但是如果你知道它将用于初始化NN层,那么0.05是一个很好的值

keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None)
tf.random.normal(shape, mean=0.0, stddev=1.0, dtype=tf.dtypes.float32,    seed=None, name=None)