#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’].
Что происходит не так?
Спасибо!