У графического процессора закончилась память. Как вызвать сборщик мусора для очистки памяти графического процессора при ⇐ Python
У графического процессора закончилась память. Как вызвать сборщик мусора для очистки памяти графического процессора при
Я обучаю свою модель на удаленном сервере, используя API GridSearchCV для настройки некоторых гиперпараметров, таких как epochs, l_rate, пакетный_размер и терпение. К сожалению, при их настройке после нескольких итераций я получаю следующую ошибку:
Не удалось скопировать входной тензор из /job:localhost/replica:0/task:0/device:CPU:0 в /job:localhost/replica:0/task:0/device:GPU:0 для запуска _EagerConst: тензор Dst не инициализирован. Похоже, что памяти графического процессора сервера недостаточно, и эта ошибка возникает, когда память графического процессора заполнена, и рекомендуется уменьшить размер набора данных и/или batch_size.
Сначала я уменьшил batch_size до 2, 4, 8 и 16 но ошибка сохраняется, так как я получаю:
W tensorflow/tsl/framework/bfc_allocator.cc:485] Распределитель (GPU_0_bfc) запущен недостаточно памяти при попытке выделить 1,17 ГБ (округлено до 1258291200) запрошено автор: _EagerConst Если причиной является фрагментация памяти, возможно, переменная среды 'TF_GPU_ALLOCATOR=cuda_malloc_async' улучшит ситуацию Затем я установил os.environ['TF_GPU_ALLOCATOR'] = 'cuda_malloc_async', как было предложено, но проблемы остались.
Тем не менее, проблема кажется решенной, если я уменьшу размер набора данных, но Мне придется использовать весь набор данных (я не могу тратить данные зря).
Чтобы решить эту проблему, мои ключевые идеи таковы:
[*]
Предотвращение повторного создания новой модели и связанных с ней объектов для управления потерями и обучением. Это было бы оптимальным решением, поскольку оно всегда будет использовать одну и ту же модель (очевидно, гарантируя, что она «сбрасывается» при каждой новой комбинации гиперпараметров) с относительными потерями и обучением. Это решение, пожалуй, самое сложное, поскольку я не знаю, позволяют ли его библиотеки, которые я выбрал.
[*]
Убедитесь, что та же проблема не вызвана данными, а не моделью (т. е. я бы не хотел, чтобы одни и те же данные перераспределялись для каждой комбинации гиперпараметров, оставляя старые в памяти). Это также может быть причиной и решение, которое, по моему мнению, проще, чем предыдущее или подобное, но я считаю его менее вероятным, чем причина. В любом случае проверьте, чтобы этого не произошло.
[*]
Сбрасывайте память для каждой комбинации гиперпараметров, вызывая сборщик мусора (я не знаю, работает ли он и на графическом процессоре). Это самое простое решение и, возможно, первое, что я бы попробовал, но оно не обязательно работает, потому что, если используемые библиотеки сохраняют ссылки на объекты в памяти (даже если они больше не используются), они не удаляются сборщик мусора.
Кроме того, с помощью бэкэнда tensorflow текущая модель не уничтожается, поэтому мне нужно очистить сеанс.
Если у вас есть какие-либо дополнительные мысли или идеи, поделитесь ими со мной. Вот задействованные функции:
defgrid_search_vae(x_train,latent_dimension): param_grid = { 'эпохи': [2500], 'l_rate': [10**-4, 10**-5, 10**-6, 10**-7], 'batch_size': [32, 64], # [2, 4, 8, 16] не решит проблему. 'терпение': [30] } ssim_scorer = make_scorer(my_ssim, more_is_better=True) сетка = GridSearchCV( VAEWrapper(энкодер=Кодировщик(latent_dimension), декодер=Декодер()), param_grid, скоринг=ssim_scorer, cv=5, refit=False ) Grid.fit(x_train, x_train) обратная сетка def refit(fitted_grid, x_train, y_train, latent_dimension): best_epochs = fit_grid.best_params_["эпохи"] best_l_rate = fit_grid.best_params_["l_rate"] best_batch_size = fit_grid.best_params_["batch_size"] best_patience = fit_grid.best_params_["терпение"] x_train, x_val, y_train, y_val = train_test_split(x_train, y_train, test_size=0.2) кодировщик = кодировщик (латентное_размерность) декодер = Декодер() vae = VAE(кодер, декодер, best_epochs, best_l_rate, best_batch_size) vae.compile(Адам(best_l_rate)) Early_stopping = EarlyStopping("val_loss", терпение=best_patience) история = vae.fit(x_train, x_train, best_batch_size, best_epochs, validation_data=(x_val, x_val), обратные вызовы=[early_stopping]) история возврата, ваэ Пока это основной код:
if __name__ == '__main__': x_train, x_test, y_train, y_test = load_data("данные", "метки") # Уменьшение размера набора данных решит проблему # новый_размер = 200 # x_train, y_train = уменьшить_размер(x_train, y_train, new_size) # x_test, y_test = уменьшить_размер(x_test, y_test, new_size) latent_dimension = 25 сетка =grid_search_vae(x_train,latent_dimension) история, vae = refit(grid, x_train, y_train, latent_dimension) Можете ли вы мне помочь?
Если вам нужна эта информация, вот графические процессоры:
2023-09-18 11:21:25.628286: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1639] Создано устройство /job:localhost/replica:0/task:0/device:GPU :0 с памятью 7347 МБ: -> устройство: 0, имя: NVIDIA GeForce GTX 1080, идентификатор шины PCI: 0000:02:00.0, вычислительная мощность: 6.1 2023-09-18 11:21:25.629120: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1639] Создано устройство /job:localhost/replica:0/task:0/device:GPU:1 с памятью 7371 МБ : -> устройство: 1, имя: NVIDIA GeForce GTX 1080, идентификатор шины PCI: 0000:03:00.0, вычислительная мощность: 6.1 2023-09-18 11:21:31.911969: I tensorflow/compiler/xla/stream_executor/cuda/cuda_dnn.cc:432] Загружен cuDNN версии 8600 и я использую tensorflow в качестве бэкэнда keras, то есть:
из бэкэнда импорта keras как K K.backend() # 'тензорный поток' Я также пытался добавить:
gpus = tf.config.experimental.list_physical_devices('GPU') для графического процессора в графическом процессоре: tf.config.experimental.set_memory_growth(GPU, True) в коде main (как первые инструкции), но это не помогло.
Если вам нужен код для моделей, вот он:
импортировать numpy как np импортировать тензорный поток как tf из keras.initializers импортируйте he_uniform из keras.layers импортировать Conv2DTranspose, BatchNormalization, Reshape, Dense, Conv2D, Flatten из keras.optimizers.legacy импортировать Адама из keras.src.callbacks импорт EarlyStopping из Skimage.metrics импортируйте структурное_сходство как ssim из sklearn.base импортировать BaseEstimator из sklearn.metrics импортируйтеmean_absolute_error, make_scorer из sklearn.model_selection import train_test_split, GridSearchCV из тензорного потока импорта кераса класс VAEWrapper: def __init__(self, **kwargs): self.vae = VAE(**kwargs) self.vae.compile(Адам()) def fit(self, x, y, **kwargs): self.vae.fit(x, y, **kwargs) защита get_config (сам): вернуть self.vae.get_config() def get_params(self, deep): вернуть self.vae.get_params(глубокий) def set_params(self, **params): вернуть self.vae.set_params(**params) класс VAE(keras.Model, BaseEstimator): def __init__(self, encoder, decoder, epochs=None, l_rate=None, patch_size=None, терпение=None, **kwargs): супер().__init__(**kwargs) self.encoder = кодер self.decoder = декодер self.epochs = epochs # Для поиска по сетке self.l_rate = l_rate # Для поиска по сетке self.batch_size = пакетный_размер # Для поиска по сетке self.patience = терпение # Для поиска по сетке self.total_loss_tracker = keras.metrics.Mean(name="total_loss") self.reconstruction_loss_tracker = keras.metrics.Mean(name="reconstruction_loss") self.kl_loss_tracker = keras.metrics.Mean(name="kl_loss") def call(self, inputs, Training=None, Mask=None): _, _, z = self.encoder(входы) выходы = self.decoder(z) возврат выходов @свойство метрики определения (собственные): возвращаться [ self.total_loss_tracker, self.reconstruction_loss_tracker, self.kl_loss_tracker, ] Защиту train_step (я, данные): данные, метки = данные с tf.GradientTape() в качестве ленты: # Пас вперед z_mean, z_log_var, z = self.encoder(данные) реконструкция = self.decoder(z) # Вычисление потерь реконструкция_потеря = tf.reduce_mean( tf.reduce_sum( keras.losses.binary_crossentropy(данные, реконструкция), ось=(1, 2) ) ) kl_loss = -0,5 * (1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var)) kl_loss = tf.reduce_mean(tf.reduce_sum(kl_loss, axis=1)) total_loss = потеря_восстановления + kl_loss # Вычисление градиента grads = Tape.gradient(total_loss, self.trainable_weights) # Обновить веса self.optimizer.apply_gradients(zip(grads, self.trainable_weights)) # Обновить метрики self.total_loss_tracker.update_state(total_loss) self.reconstruction_loss_tracker.update_state(reconstruction_loss) self.kl_loss_tracker.update_state(kl_loss) возвращаться { «потеря»: self.total_loss_tracker.result(), «reconstruction_loss»: self.reconstruction_loss_tracker.result(), "kl_loss": self.kl_loss_tracker.result(), } Защиту test_step (я, данные): данные, метки = данные # Пас вперед z_mean, z_log_var, z = self.encoder(данные) реконструкция = self.decoder(z) # Вычисление потерь реконструкция_потеря = tf.reduce_mean( tf.reduce_sum( keras.losses.binary_crossentropy(данные, реконструкция), ось=(1, 2) ) ) kl_loss = -0,5 * (1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var)) kl_loss = tf.reduce_mean(tf.reduce_sum(kl_loss, axis=1)) total_loss = потеря_восстановления + kl_loss # Обновить метрики self.total_loss_tracker.update_state(total_loss) self.reconstruction_loss_tracker.update_state(reconstruction_loss) self.kl_loss_tracker.update_state(kl_loss) возвращаться { «потеря»: self.total_loss_tracker.result(), «reconstruction_loss»: self.reconstruction_loss_tracker.result(), "kl_loss": self.kl_loss_tracker.result(), } @keras.saving.register_keras_serializable() класс Encoder(keras.layers.Layer): def __init__(self, latent_dimension): супер(Кодировщик, сам).__init__() self.latent_dim = скрытый_размерность семя = 42 self.conv1 = Conv2D(filters=64, kernel_size=3, active="relu", strides=2, padding="same", kernel_initializer = he_uniform (семя)) self.bn1 = Пакетная нормализация() self.conv2 = Conv2D(filters=128, kernel_size=3, active="relu", strides=2, padding="same", kernel_initializer = he_uniform (семя)) self.bn2 = Пакетная нормализация() self.conv3 = Conv2D(filters=256, kernel_size=3, active="relu", strides=2, padding="same", kernel_initializer = he_uniform (семя)) self.bn3 = Пакетная нормализация() self.flatten = Сгладить() self.dense = Плотность(единицы=100, активация="relu") self.z_mean = Плотный(latent_dimension, name="z_mean") self.z_log_var = Плотный(latent_dimension, name="z_log_var") self.sampling = образец def call(self, inputs, Training=None, Mask=None): x = self.conv1(входные данные) х = self.bn1(x) х = self.conv2(x) х = self.bn2(x) х = self.conv3(x) х = self.bn3(x) х = сам.сгладить(х) x = self.dense(x) z_mean = self.z_mean(x) z_log_var = self.z_log_var(x) z = self.sampling(z_mean, z_log_var) вернуть z_mean, z_log_var, z @keras.saving.register_keras_serializable() Декодер класса (keras.layers.Layer): защита __init__(сам): супер(Декодер, сам).__init__() self.dense1 = Плотный (единицы = 4096, активация = "relu") self.bn1 = Пакетная нормализация() self.dense2 = Плотность(единицы=1024, активация="relu") self.bn2 = Пакетная нормализация() self.dense3 = Плотность (единицы = 4096, активация = "relu") self.bn3 = Пакетная нормализация() семя = 42 self.reshape = Изменить форму((4, 4, 256)) self.deconv1 = Conv2DTranspose(filters=256, kernel_size=3, active="relu", strides=2, padding="same", kernel_initializer = he_uniform (семя)) self.bn4 = Пакетная нормализация() self.deconv2 = Conv2DTranspose(filters=128, kernel_size=3, active="relu", strides=1, padding="same", kernel_initializer = he_uniform (семя)) self.bn5 = Пакетная нормализация() self.deconv3 = Conv2DTranspose(filters=128, kernel_size=3, active="relu", strides=2, padding="valid", kernel_initializer = he_uniform (семя)) self.bn6 = Пакетная нормализация() self.deconv4 = Conv2DTranspose(filters=64, kernel_size=3, active="relu", strides=1, padding="valid", kernel_initializer = he_uniform (семя)) self.bn7 = Пакетная нормализация() self.deconv5 = Conv2DTranspose(filters=64, kernel_size=3, active="relu", strides=2, padding="valid", kernel_initializer = he_uniform (семя)) self.bn8 = Пакетная нормализация() self.deconv6 = Conv2DTranspose(filters=1, kernel_size=2, active="sigmoid", дополнение="valid", kernel_initializer = he_uniform (семя)) def call(self, inputs, Training=None, Mask=None): x = self.dense1(входы) х = self.bn1(x) x = self.dense2(x) х = self.bn2(x) x = self.dense3(x) х = self.bn3(x) x = self.reshape(x) х = self.deconv1(x) х = self.bn4(x) х = self.deconv2(x) х = self.bn5(x) х = self.deconv3(x) х = self.bn6(x) х = self.deconv4(x) х = self.bn7(x) х = self.deconv5(x) х = self.bn8(x) decoder_outputs = self.deconv6(x) вернуть decoder_outputs
Я обучаю свою модель на удаленном сервере, используя API GridSearchCV для настройки некоторых гиперпараметров, таких как epochs, l_rate, пакетный_размер и терпение. К сожалению, при их настройке после нескольких итераций я получаю следующую ошибку:
Не удалось скопировать входной тензор из /job:localhost/replica:0/task:0/device:CPU:0 в /job:localhost/replica:0/task:0/device:GPU:0 для запуска _EagerConst: тензор Dst не инициализирован. Похоже, что памяти графического процессора сервера недостаточно, и эта ошибка возникает, когда память графического процессора заполнена, и рекомендуется уменьшить размер набора данных и/или batch_size.
Сначала я уменьшил batch_size до 2, 4, 8 и 16 но ошибка сохраняется, так как я получаю:
W tensorflow/tsl/framework/bfc_allocator.cc:485] Распределитель (GPU_0_bfc) запущен недостаточно памяти при попытке выделить 1,17 ГБ (округлено до 1258291200) запрошено автор: _EagerConst Если причиной является фрагментация памяти, возможно, переменная среды 'TF_GPU_ALLOCATOR=cuda_malloc_async' улучшит ситуацию Затем я установил os.environ['TF_GPU_ALLOCATOR'] = 'cuda_malloc_async', как было предложено, но проблемы остались.
Тем не менее, проблема кажется решенной, если я уменьшу размер набора данных, но Мне придется использовать весь набор данных (я не могу тратить данные зря).
Чтобы решить эту проблему, мои ключевые идеи таковы:
[*]
Предотвращение повторного создания новой модели и связанных с ней объектов для управления потерями и обучением. Это было бы оптимальным решением, поскольку оно всегда будет использовать одну и ту же модель (очевидно, гарантируя, что она «сбрасывается» при каждой новой комбинации гиперпараметров) с относительными потерями и обучением. Это решение, пожалуй, самое сложное, поскольку я не знаю, позволяют ли его библиотеки, которые я выбрал.
[*]
Убедитесь, что та же проблема не вызвана данными, а не моделью (т. е. я бы не хотел, чтобы одни и те же данные перераспределялись для каждой комбинации гиперпараметров, оставляя старые в памяти). Это также может быть причиной и решение, которое, по моему мнению, проще, чем предыдущее или подобное, но я считаю его менее вероятным, чем причина. В любом случае проверьте, чтобы этого не произошло.
[*]
Сбрасывайте память для каждой комбинации гиперпараметров, вызывая сборщик мусора (я не знаю, работает ли он и на графическом процессоре). Это самое простое решение и, возможно, первое, что я бы попробовал, но оно не обязательно работает, потому что, если используемые библиотеки сохраняют ссылки на объекты в памяти (даже если они больше не используются), они не удаляются сборщик мусора.
Кроме того, с помощью бэкэнда tensorflow текущая модель не уничтожается, поэтому мне нужно очистить сеанс.
Если у вас есть какие-либо дополнительные мысли или идеи, поделитесь ими со мной. Вот задействованные функции:
defgrid_search_vae(x_train,latent_dimension): param_grid = { 'эпохи': [2500], 'l_rate': [10**-4, 10**-5, 10**-6, 10**-7], 'batch_size': [32, 64], # [2, 4, 8, 16] не решит проблему. 'терпение': [30] } ssim_scorer = make_scorer(my_ssim, more_is_better=True) сетка = GridSearchCV( VAEWrapper(энкодер=Кодировщик(latent_dimension), декодер=Декодер()), param_grid, скоринг=ssim_scorer, cv=5, refit=False ) Grid.fit(x_train, x_train) обратная сетка def refit(fitted_grid, x_train, y_train, latent_dimension): best_epochs = fit_grid.best_params_["эпохи"] best_l_rate = fit_grid.best_params_["l_rate"] best_batch_size = fit_grid.best_params_["batch_size"] best_patience = fit_grid.best_params_["терпение"] x_train, x_val, y_train, y_val = train_test_split(x_train, y_train, test_size=0.2) кодировщик = кодировщик (латентное_размерность) декодер = Декодер() vae = VAE(кодер, декодер, best_epochs, best_l_rate, best_batch_size) vae.compile(Адам(best_l_rate)) Early_stopping = EarlyStopping("val_loss", терпение=best_patience) история = vae.fit(x_train, x_train, best_batch_size, best_epochs, validation_data=(x_val, x_val), обратные вызовы=[early_stopping]) история возврата, ваэ Пока это основной код:
if __name__ == '__main__': x_train, x_test, y_train, y_test = load_data("данные", "метки") # Уменьшение размера набора данных решит проблему # новый_размер = 200 # x_train, y_train = уменьшить_размер(x_train, y_train, new_size) # x_test, y_test = уменьшить_размер(x_test, y_test, new_size) latent_dimension = 25 сетка =grid_search_vae(x_train,latent_dimension) история, vae = refit(grid, x_train, y_train, latent_dimension) Можете ли вы мне помочь?
Если вам нужна эта информация, вот графические процессоры:
2023-09-18 11:21:25.628286: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1639] Создано устройство /job:localhost/replica:0/task:0/device:GPU :0 с памятью 7347 МБ: -> устройство: 0, имя: NVIDIA GeForce GTX 1080, идентификатор шины PCI: 0000:02:00.0, вычислительная мощность: 6.1 2023-09-18 11:21:25.629120: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1639] Создано устройство /job:localhost/replica:0/task:0/device:GPU:1 с памятью 7371 МБ : -> устройство: 1, имя: NVIDIA GeForce GTX 1080, идентификатор шины PCI: 0000:03:00.0, вычислительная мощность: 6.1 2023-09-18 11:21:31.911969: I tensorflow/compiler/xla/stream_executor/cuda/cuda_dnn.cc:432] Загружен cuDNN версии 8600 и я использую tensorflow в качестве бэкэнда keras, то есть:
из бэкэнда импорта keras как K K.backend() # 'тензорный поток' Я также пытался добавить:
gpus = tf.config.experimental.list_physical_devices('GPU') для графического процессора в графическом процессоре: tf.config.experimental.set_memory_growth(GPU, True) в коде main (как первые инструкции), но это не помогло.
Если вам нужен код для моделей, вот он:
импортировать numpy как np импортировать тензорный поток как tf из keras.initializers импортируйте he_uniform из keras.layers импортировать Conv2DTranspose, BatchNormalization, Reshape, Dense, Conv2D, Flatten из keras.optimizers.legacy импортировать Адама из keras.src.callbacks импорт EarlyStopping из Skimage.metrics импортируйте структурное_сходство как ssim из sklearn.base импортировать BaseEstimator из sklearn.metrics импортируйтеmean_absolute_error, make_scorer из sklearn.model_selection import train_test_split, GridSearchCV из тензорного потока импорта кераса класс VAEWrapper: def __init__(self, **kwargs): self.vae = VAE(**kwargs) self.vae.compile(Адам()) def fit(self, x, y, **kwargs): self.vae.fit(x, y, **kwargs) защита get_config (сам): вернуть self.vae.get_config() def get_params(self, deep): вернуть self.vae.get_params(глубокий) def set_params(self, **params): вернуть self.vae.set_params(**params) класс VAE(keras.Model, BaseEstimator): def __init__(self, encoder, decoder, epochs=None, l_rate=None, patch_size=None, терпение=None, **kwargs): супер().__init__(**kwargs) self.encoder = кодер self.decoder = декодер self.epochs = epochs # Для поиска по сетке self.l_rate = l_rate # Для поиска по сетке self.batch_size = пакетный_размер # Для поиска по сетке self.patience = терпение # Для поиска по сетке self.total_loss_tracker = keras.metrics.Mean(name="total_loss") self.reconstruction_loss_tracker = keras.metrics.Mean(name="reconstruction_loss") self.kl_loss_tracker = keras.metrics.Mean(name="kl_loss") def call(self, inputs, Training=None, Mask=None): _, _, z = self.encoder(входы) выходы = self.decoder(z) возврат выходов @свойство метрики определения (собственные): возвращаться [ self.total_loss_tracker, self.reconstruction_loss_tracker, self.kl_loss_tracker, ] Защиту train_step (я, данные): данные, метки = данные с tf.GradientTape() в качестве ленты: # Пас вперед z_mean, z_log_var, z = self.encoder(данные) реконструкция = self.decoder(z) # Вычисление потерь реконструкция_потеря = tf.reduce_mean( tf.reduce_sum( keras.losses.binary_crossentropy(данные, реконструкция), ось=(1, 2) ) ) kl_loss = -0,5 * (1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var)) kl_loss = tf.reduce_mean(tf.reduce_sum(kl_loss, axis=1)) total_loss = потеря_восстановления + kl_loss # Вычисление градиента grads = Tape.gradient(total_loss, self.trainable_weights) # Обновить веса self.optimizer.apply_gradients(zip(grads, self.trainable_weights)) # Обновить метрики self.total_loss_tracker.update_state(total_loss) self.reconstruction_loss_tracker.update_state(reconstruction_loss) self.kl_loss_tracker.update_state(kl_loss) возвращаться { «потеря»: self.total_loss_tracker.result(), «reconstruction_loss»: self.reconstruction_loss_tracker.result(), "kl_loss": self.kl_loss_tracker.result(), } Защиту test_step (я, данные): данные, метки = данные # Пас вперед z_mean, z_log_var, z = self.encoder(данные) реконструкция = self.decoder(z) # Вычисление потерь реконструкция_потеря = tf.reduce_mean( tf.reduce_sum( keras.losses.binary_crossentropy(данные, реконструкция), ось=(1, 2) ) ) kl_loss = -0,5 * (1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var)) kl_loss = tf.reduce_mean(tf.reduce_sum(kl_loss, axis=1)) total_loss = потеря_восстановления + kl_loss # Обновить метрики self.total_loss_tracker.update_state(total_loss) self.reconstruction_loss_tracker.update_state(reconstruction_loss) self.kl_loss_tracker.update_state(kl_loss) возвращаться { «потеря»: self.total_loss_tracker.result(), «reconstruction_loss»: self.reconstruction_loss_tracker.result(), "kl_loss": self.kl_loss_tracker.result(), } @keras.saving.register_keras_serializable() класс Encoder(keras.layers.Layer): def __init__(self, latent_dimension): супер(Кодировщик, сам).__init__() self.latent_dim = скрытый_размерность семя = 42 self.conv1 = Conv2D(filters=64, kernel_size=3, active="relu", strides=2, padding="same", kernel_initializer = he_uniform (семя)) self.bn1 = Пакетная нормализация() self.conv2 = Conv2D(filters=128, kernel_size=3, active="relu", strides=2, padding="same", kernel_initializer = he_uniform (семя)) self.bn2 = Пакетная нормализация() self.conv3 = Conv2D(filters=256, kernel_size=3, active="relu", strides=2, padding="same", kernel_initializer = he_uniform (семя)) self.bn3 = Пакетная нормализация() self.flatten = Сгладить() self.dense = Плотность(единицы=100, активация="relu") self.z_mean = Плотный(latent_dimension, name="z_mean") self.z_log_var = Плотный(latent_dimension, name="z_log_var") self.sampling = образец def call(self, inputs, Training=None, Mask=None): x = self.conv1(входные данные) х = self.bn1(x) х = self.conv2(x) х = self.bn2(x) х = self.conv3(x) х = self.bn3(x) х = сам.сгладить(х) x = self.dense(x) z_mean = self.z_mean(x) z_log_var = self.z_log_var(x) z = self.sampling(z_mean, z_log_var) вернуть z_mean, z_log_var, z @keras.saving.register_keras_serializable() Декодер класса (keras.layers.Layer): защита __init__(сам): супер(Декодер, сам).__init__() self.dense1 = Плотный (единицы = 4096, активация = "relu") self.bn1 = Пакетная нормализация() self.dense2 = Плотность(единицы=1024, активация="relu") self.bn2 = Пакетная нормализация() self.dense3 = Плотность (единицы = 4096, активация = "relu") self.bn3 = Пакетная нормализация() семя = 42 self.reshape = Изменить форму((4, 4, 256)) self.deconv1 = Conv2DTranspose(filters=256, kernel_size=3, active="relu", strides=2, padding="same", kernel_initializer = he_uniform (семя)) self.bn4 = Пакетная нормализация() self.deconv2 = Conv2DTranspose(filters=128, kernel_size=3, active="relu", strides=1, padding="same", kernel_initializer = he_uniform (семя)) self.bn5 = Пакетная нормализация() self.deconv3 = Conv2DTranspose(filters=128, kernel_size=3, active="relu", strides=2, padding="valid", kernel_initializer = he_uniform (семя)) self.bn6 = Пакетная нормализация() self.deconv4 = Conv2DTranspose(filters=64, kernel_size=3, active="relu", strides=1, padding="valid", kernel_initializer = he_uniform (семя)) self.bn7 = Пакетная нормализация() self.deconv5 = Conv2DTranspose(filters=64, kernel_size=3, active="relu", strides=2, padding="valid", kernel_initializer = he_uniform (семя)) self.bn8 = Пакетная нормализация() self.deconv6 = Conv2DTranspose(filters=1, kernel_size=2, active="sigmoid", дополнение="valid", kernel_initializer = he_uniform (семя)) def call(self, inputs, Training=None, Mask=None): x = self.dense1(входы) х = self.bn1(x) x = self.dense2(x) х = self.bn2(x) x = self.dense3(x) х = self.bn3(x) x = self.reshape(x) х = self.deconv1(x) х = self.bn4(x) х = self.deconv2(x) х = self.bn5(x) х = self.deconv3(x) х = self.bn6(x) х = self.deconv4(x) х = self.bn7(x) х = self.deconv5(x) х = self.bn8(x) decoder_outputs = self.deconv6(x) вернуть decoder_outputs
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как сборщик мусора Боема освобождает память, не создавая отдельный поток для GC?
Anonymous » » в форуме C++ - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Tensorflow потребляет память как графического процессора, так и процессора.
Anonymous » » в форуме Python - 0 Ответы
- 31 Просмотры
-
Последнее сообщение Anonymous
-