Я пытаюсь воспроизвести сеть, в которой необходимо обновлять точки во встроенном пространстве (автоматического кодера) между каждой партией, используя Keras с бэкэндом Theano. Чтобы сеть работала, она должна выполнять обновления весов сети между каждым пакетом. Функция потерь взята из статьи «К K-значит дружественные пространства».
Поскольку мне приходится обновлять вес сети между каждым пакетом, я делаю это для каждого пакета (обновляет сеть для одного пакета, затем обновляет встроенное пространство перед следующим пакетом):
loss = self.model.train_on_batch(x=self.images[index * self.batch_size:(index + 1) * self.batch_size],
y = [self.images[index * self.batch_size:(index + 1) * self.batch_size]])
self.latent_features = self.model.get_layer(name='embedding').output
self._cluster_distsqs = K.sum(K.square(self.latent_features - self.centroids), axis=2)
self._assigns = K.argmin(self._cluster_distsqs, axis=1)
for i in range(batch_size):
assign = self._assigns[i]
count = self.centroid_counts[assign]
centroid = self.centroids[assign]
feature = self.latent_features[i]
if cnt>1:
new_centroid = centroid - (1.0 / cnt) * (centroid - feature)
self.centroids[:,assign,:] = new_centroid
else:
self.centroid_counts[assign] = cnt+1
По сути, мне нужно получить значения тензоров в разных точках, и это нужно сделать с помощью индексации. Я пробовал K.get_value (назначить), K.eval (назначить), K.print_tensor (назначить), но, похоже, ничто не позволяет мне получить доступ к фактическому значению тензора. Я пробовал это и для других тензоров, и я всегда получаю TensorVariable, Subtensor (Int64) .0 или что-то в этом роде. Может ли кто-нибудь помочь мне выполнить это, если его путем преобразования в numpy массивов или преобразования всех в тензоры или другой метод все вместе? Большое спасибо!