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
Python Tensorflow 2.0 Keras的训练速度比2.0估计器慢4倍_Python_Tensorflow_Keras_Tensorflow Estimator_Tensorflow2.0 - Fatal编程技术网

Python Tensorflow 2.0 Keras的训练速度比2.0估计器慢4倍

Python Tensorflow 2.0 Keras的训练速度比2.0估计器慢4倍,python,tensorflow,keras,tensorflow-estimator,tensorflow2.0,Python,Tensorflow,Keras,Tensorflow Estimator,Tensorflow2.0,我们最近在TF 2.0上使用了Keras,但当我们将其与2.0上的DNNClassifier估计器进行比较时,我们发现Keras的速度大约慢了4倍。但我一辈子都搞不懂为什么会发生这种事。这两者的其余代码是相同的,使用返回相同tf.data.Dataset的输入_fn(),并使用相同的feature_列。我已经为这个问题挣扎了好几天了。任何帮助都将不胜感激。多谢各位 估算器代码: estimator = tf.estimator.DNNClassifier( feature_col

我们最近在TF 2.0上使用了Keras,但当我们将其与2.0上的DNNClassifier估计器进行比较时,我们发现Keras的速度大约慢了4倍。但我一辈子都搞不懂为什么会发生这种事。这两者的其余代码是相同的,使用返回相同tf.data.Dataset的输入_fn(),并使用相同的feature_列。我已经为这个问题挣扎了好几天了。任何帮助都将不胜感激。多谢各位

估算器代码:

estimator = tf.estimator.DNNClassifier(
        feature_columns = feature_columns,
        hidden_units = [64,64],
        activation_fn = tf.nn.relu,
        optimizer = 'Adagrad',
        dropout = 0.4,
        n_classes = len(vocab),
        model_dir = model_dir,
        batch_norm = false)

estimator.train(input_fn=train_input_fn, steps=400)
Keras代码:

feature_layer = tf.keras.layers.DenseFeatures(feature_columns);

model = tf.keras.Sequential([
        feature_layer,
        layers.Dense(64, input_shape = (len(vocab),), activation = tf.nn.relu),
        layers.Dropout(0.4),
        layers.Dense(64, activation = tf.nn.relu),
        layers.Dropout(0.4),
        layers.Dense(len(vocab), activation = 'softmax')]);

model.compile(
        loss = 'sparse_categorical_crossentropy',
        optimizer = 'Adagrad'
        distribute = None)

model.fit(x = train_input_fn(),
          epochs = 1,
          steps_per_epoch = 400,
          shuffle = True)
更新:为了进一步测试,我编写了一个自定义子类模型(见:),它比Keras运行得更快,但比估计器运行得慢。如果估计器以100秒的时间进行训练,自定义模型大约需要180秒,而Keras大约需要350秒。一个有趣的注意事项是,使用Adam()时,估计器的运行速度比使用Adagrad()时慢,而使用Keras时,估计器的运行速度似乎更快。使用Adam()时,Keras所用的时间不到DNNClassier的两倍。假设我没有弄乱自定义代码,我开始认为DNNClasifier只是有很多后端优化/效率,使它比Keras运行得更快

自定义代码:

class MyModel(Model):
  def __init__(self):
    super(MyModel, self).__init__()
    self.features = layers.DenseFeatures(feature_columns, trainable=False)
    self.dense = layers.Dense(64, activation = 'relu')
    self.dropout = layers.Dropout(0.4)
    self.dense2 = layers.Dense(64, activation = 'relu')
    self.dropout2 = layers.Dropout(0.4)
    self.softmax = layers.Dense(len(vocab_of_codes), activation = 'softmax')

  def call(self, x):
    x = self.features(x)
    x = self.dense(x)
    x = self.dropout(x)
    x = self.dense2(x)
    x = self.dropout2(x)
    return self.softmax(x)

model = MyModel()
loss_object = tf.keras.losses.SparseCategoricalCrossentropy()
optimizer = tf.keras.optimizers.Adagrad()

@tf.function
def train_step(features, label):
  with tf.GradientTape() as tape:
    predictions = model(features)
    loss = loss_object(label, predictions)
  gradients = tape.gradient(loss, model.trainable_variables)
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))

itera = iter(train_input_fn())
for i in range(400):
  features, labels = next(itera)
  train_step(features, labels)

更新:它可能是数据集。当我在train_input_fn()中打印一行数据集时,在估计器中,它打印出非急切张量定义。在Keras中,它打印出渴望的值。通过Keras后端代码,当它接收到一个tf.data.dataset作为输入时,它会急切地(而且只是急切地)处理它,这就是为什么每当我在train_input_fn()上使用tf.function时,它都会崩溃的原因。基本上,我猜DNNClasifier的训练速度比Keras快,因为它在图形模式下运行更多的数据集代码。将发布任何更新/发现。

我认为速度较慢,因为它没有在图形上执行。为了在TF2中的图上执行,需要使用tf.function decorator修饰函数。查看有关如何重构代码的想法。

对于那些(像我一样)发现这个问题并使用Keras嵌入层的人:

即使存在GPU,但启用了急切执行,嵌入层也总是放在CPU上,从而导致大量的速度减慢


请参阅,其中还包含一个解决方法。

感谢您的回复。^我同意这是最有可能导致经济放缓的原因。我只是不确定,因为我假设Google/TF团队已经编写了Keras的fit()和Estimator的train(),以便在后端实现中自动使用TF.function或图形代码。一天中的大部分时间我都在尝试以图形模式运行代码,使用tf.function或tf.compat.v1.disable\u eager\u execution()。在图形模式下,估计器训练正确,但Keras在DenseFeatures()层中经历了大量奇怪的错误。我会继续挖掘并发布更新。多谢各位^^深入研究发现:“Keras层/模型继承自tf.train.Checkpointable,并与@tf.function集成,这使得直接检查点或从Keras对象导出保存的模型成为可能。”()因此我假设代码已经使用了图形模式。我唯一的线索是我们的feature列基本上是一个100万词汇指标列(Category列(…)。我在想也许Keras在这个尺寸和类型上要慢得多。我会继续挖掘并公布任何发现。