Автоэнкодер TensorFlow2 — Ошибка значения

#python #python-3.x #tensorflow2.0 #tensorflow-datasets

Вопрос:

Я пытаюсь обучить автоэнкодер с использованием TensorFlow2.5 и Python3.8 следующим образом: Изначально NetV3 использовался для извлечения объектов с использованием набора данных изображений, содержащего 289229 изображений. Конечным результатом начального NetV3 является вектор 2048-d. Я собрал их все в список Python3 и загрузил его вместе с именами файлов:

 # Read pickled Python3 list containing 2048-d extracted feature representation per image-
features_list = pickle.load(open("DeepFashion_features_inceptionnetv3.pickle", "rb"))

# Convert from Python3 list to numpy array-
features_list_np = np.asarray(features_list)

features_list_np.shape
# (289229, 2048)

del features_list

# Read pickled Python3 list containing abolute path and filenames-
filenames_list = pickle.load(open("DeepFashion_filenames_inceptionnetv3.pickle", "rb"))

len(features_list), len(filenames_list)
# (289229, 289229)

# Note that the absolute path contains Google colab path-
filenames_list[1]
# '/content/img/1981_Graphic_Ringer_Tee/img_00000002.jpg'

# Create 'tf.data.Dataset' using np array-
batch_size = 32
features_list_dataset = tf.data.Dataset.from_tensor_slices(features_list_np).batch(batch_size)

x = next(iter(features_list_dataset))
# 2021-06-28 13:10:00.229937: W tensorflow/core/kernels/data/model_dataset_op.cc:205] Optimization loop failed: Cancelled: Operation was cancelled

x.shape
# TensorShape([32, 2048])
 

Мой первый вопрос: почему появляется сообщение «Цикл оптимизации не удался»? Я использую Nvidia RTX 3080 с графическим процессором 16 ГБ. Обратите внимание, что, поскольку это автоэнкодер, для данных данных нет сопроводительных меток!

Есть ли какой-либо другой лучший способ подачи этого списка Python3 в качестве входных данных для нейронной сети TF2, которого мне не хватает?

Я проверяю наличие доступного графического процессора:

 num_gpus = len(tf.config.list_physical_devices('GPU'))
print(f"number of GPUs available = {num_gpus}")
# number of GPUs available = 1
 

Во — вторых, я закодировал автоэнкодер с архитектурой:

 class FeatureExtractor(Model):
    def __init__(self):
        super(FeatureExtractor, self).__init__()
        
        self.encoder = Sequential([
             Dense(
                units = 2048, activation = 'relu',
                kernel_initializer = tf.keras.initializers.glorot_normal(),
                input_shape = (2048,)
                ),
             Dense(
                units = 1024, activation = 'relu',
                kernel_initializer = tf.keras.initializers.glorot_normal()
                ),
            Dense(
                units = 512, activation = 'relu',
                kernel_initializer = tf.keras.initializers.glorot_normal()
                ),
            Dense(
                units = 256, activation = 'relu',
                kernel_initializer = tf.keras.initializers.glorot_normal()
                ),
            Dense(
                units = 100, activation = 'relu',
                kernel_initializer = tf.keras.initializers.glorot_normal()
                ),
        ]
        )
       
        self.decoder = Sequential([
            Dense(
                units = 256, activation = 'relu',
                kernel_initializer = tf.keras.initializers.glorot_normal()
                ),
            Dense(
                units = 512, activation = 'relu',
                kernel_initializer = tf.keras.initializers.glorot_normal()
                ),
            Dense(
                units = 1024, activation = 'relu',
                kernel_initializer = tf.keras.initializers.glorot_normal()
                ),
            Dense(
                units = 2048, activation = 'relu',
                kernel_initializer = tf.keras.initializers.glorot_normal()
                ),
        ]
        )
    
    def call(self, x):
        encoded = self.encoder(x)
        decoded = self.decoder(encoded)
        return decoded


# Initialize an instance of Autoencoder-
autoencoder = FeatureExtractor()


autoencoder.build(input_shape = (None, 2048))

# Compile model-
autoencoder.compile(
    optimizer = tf.keras.optimizers.Adam(learning_rate = 0.001),
    loss = tf.keras.losses.MeanSquaredError()
    )


# Sanity check-
autoencoder(x).shape
# TensorShape([32, 2048])

x.shape
# TensorShape([32, 2048])
 

But, when I try to train the model:

 # Train model-
history_autoencoder = autoencoder.fit(
    features_list_dataset, epochs = 20
    )
 

It gives me the error:

Ошибка значения: Для любой переменной не предусмотрено градиентов: [‘dense_10/ядро:0’, ‘dense_10/смещение:0’, ‘dense_11/ядро:0’, ‘dense_11/смещение:0’, ‘dense_12/ядро:0’, ‘dense_12/смещение:0’, ‘dense_13/ядро:0’, ‘dense_13/смещение:0’, ‘dense_14/ядро:0’, ‘dense_14/смещение:0’, ‘dense_15/ядро:0’, ‘dense_15/смещение:0’, ‘dense_16/ядро:0’, ‘dense_16/смещение:0’, ‘dense_17/ядро:0’, ‘dense_17/смещение:0’, ‘dense_18/ядро:0’, ‘dense_18/смещение:0’].

Что происходит не так?

Спасибо!