将tf.keras.utils.multi_gpu_model与模型类API一起使用是否存在问题



我正在尝试使用tensorflow.keras训练卷积自动编码器。这里,我有一个模型类API(我认为这就是它的名称(,它使用单个GPU(不实现multi_GPU_Model(工作。然而,当我在一台有4个GPU的机器上转换到这个模式时,我在定义多GPU模型(这里称为parallel_autoencoder(时会出错。我过去使用Keras Model API做过这件事,这种语法运行得很好。

我相信这个问题源于模型类API的使用,但我不完全确定。以下是我收到的相关代码和错误消息。我只想尝试使用带有tensorflow.keras的Model API,但我无法使用Flatten层,因为我得到错误";TypeError:"Flatten"类型的对象没有len(("。

我真的在寻找关于multi_gpu_model问题的建议,但如果有人知道Flatten问题的解决方法,我也会很感激。

import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Conv3D, BatchNormalization, MaxPooling3D
from tensorflow.keras.layers import Dense, Flatten, Reshape, UpSampling3D
latent_dim = 100
class Autoencoder(tf.keras.Model):
def __init__(self, latent_dim):
super(Autoencoder, self).__init__()
self.latent_dim = latent_dim
self.encoder = tf.keras.Sequential([
tf.keras.layers.Input(shape=(4096,4096,3,1)),
tf.keras.layers.Conv3D(4, (3, 3, 3), activation='sigmoid', padding='same'), #72 x 32 x 2 x 16
tf.keras.layers.MaxPooling3D(pool_size=(8, 8, 1)),
tf.keras.layers.Conv3D(8, (3, 3, 3), activation='sigmoid', padding='same'),
tf.keras.layers.MaxPooling3D(pool_size=(8, 8, 3)),
tf.keras.layers.Conv3D(16, (3, 3, 3), activation='sigmoid', padding='same'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(latent_dim,activation='sigmoid')
])
self.encoder.summary()
self.decoder = tf.keras.Sequential([
tf.keras.layers.Input(shape=(latent_dim,)),
tf.keras.layers.Dense(16*64*64, activation='sigmoid'),
tf.keras.layers.Reshape((64,64,1,16)),
tf.keras.layers.Conv3D(8, (3, 3, 3), activation='sigmoid', padding='same'),
tf.keras.layers.UpSampling3D((8, 8, 3)),
tf.keras.layers.Conv3D(4, (3, 3, 3), activation='sigmoid', padding='same'),
tf.keras.layers.UpSampling3D((8, 8, 1)),
tf.keras.layers.Conv3D(1, (3, 3, 3), activation='sigmoid', padding='same')
])
self.decoder.summary()
def call(self, x):
encoded = self.encoder(x)
decoded = self.decoder(encoded)
return decoded
model = Autoencoder(latent_dim)
parallel_autoencoder = tf.keras.utils.multi_gpu_model(model, gpus=4)
parallel_autoencoder.compile(loss='mse', optimizer='adadelta')

追踪(最近一次通话(:文件";"SDO_ TFR_;,第102行,inparallel_autoencoder=keras.utils.multi_gpu_model(模型,gpus=4(文件"/usr/lib/python3/dist-packages/keras/utils/multi_gpu_utils.py";,第150行,在multi_gpu_model中可用设备=_get_available_devices((文件"/usr/lib/python3/dist-packages/keras/utils/multi_gpu_utils.py";,第16行,在_get_available_devices中return K.tensorflow_backend.get_available_gpus((+['/cpu:0']文件"//usr/lib/python3/dist-packages/keras/backend/tensorflow_backend.py";,第506行,在_get_available_gpus中_LOCAL_DEVICES=tf.config.experial_list_DEVICES((AttributeError:模块'tensorflow_api.v2.config"没有属性"experial_list_devices">

不,问题不在于Model()API的使用。

问题是tensorflow.keras和普通keras的兼容性存在一些问题,我的直觉告诉我(根据您发布的错误(multi_gpu功能存在问题,因为它无法正确检测可用的设备。

毫不奇怪,因为TensorFlow官方文档明确指出:

警告:此函数已弃用。它将在2020-04-01.更新说明:使用改为tf.distribute.MirroredStrategy。

这里有人遇到了类似的问题:{AttributeError:module';tensorflow_core.api.v2.config';没有属性';experial_list_devices';}我该如何解决此错误?

如果你想在multi_gpus上训练模型,我强烈建议你改用MirroredStrategy()。你不仅可以避免这样的问题,而且在可预见的未来,这也是推荐的方法。

最新更新