输入训练数据时,Keras似乎比张量流慢

时间:2018-09-14 06:29:00

标签: python tensorflow keras

我目前正在将一个项目从tensorflow转换为keras。

一切似乎都很好,使用keras构建模型的简易性让我印象深刻。但是,使用Keras进行培训的速度要慢得多,因为我的GPU使用率大大降低。

我正在使用Tensorflow generator Dataset来加载训练数据。幸运的是,喀拉拉邦似乎毫无疑问地接受了这一点。

问题

但是在使用tensorflow训练数据集时,我认为平均GPU利用率约为70%。当我使用Keras使用相同的数据集生成器训练相同的网络时,我仅归档了约35%的GPU利用率

问题似乎是我有一个非常简单的网络,因此与实际进行反向传播相比,我需要尽可能快地将数据馈送到GPU,因为这里花费了很多时间。

使用张量流,这里的关键似乎是使用提要-dict,而是使用我的数据集中的张量作为图形的输入。基本上,可以减少到

x, y = iterator.get_next()                     # Get the dataset tensors
loss = tf.reduce_sum(tf.square(y - model_out)) # Use the y tensor directly for loss
# Use x as the input layer in my model <- Implememntation omitted

我想用keras实现相同的效果,因此我做了类似的事情,其中​​我将x设置为输入,将y设置为目标张量。 (我能以某种方式摆脱将y放入目标张量的列表中的方法吗?)

x, y = iterator.get_next()                                    # Get the dataset tensors

model_input = keras.Input(tensor=x)
# Build model with model_input as input layer and something as output layer. <- Implememntation omitted
model = tf.keras.Model(inputs=model_input, outputs=something) # Insert the dataset tensor directly as input

model.compile(loss='mean_squared_error',                                                                                                                   
              optimizer=#something,
              metrics=['accuracy'],                                                                                                                        
              target_tensors=[y]) # Input the dataset y tensor directly for use in the loss calculation

基本上,应该将x设置为输入张量,将y设置为直接用于损失的张量,就像在tensorflow版本中一样。现在,我可以在不显式提供x和y参数的情况下校准model.fit,因为它们直接在图形中使用

model.fit(validation_data=validation_iterator,
          steps_per_epoch=5000,
          validation_steps=1)

在我看来,我现在正在使用keras和tensorflow进行相同的操作,但是,仅使用纯tensorflow实现的一半GPU使用率,keras的运行速度要慢得多 我在这里做错什么了吗?或者,如果我想使用keras,我应该接受这种减速吗?

0 个答案:

没有答案