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