def initialize_layer(self, data, n_samples=10000):
"""
Initializes the layer using k-means (sigma is set to the mean pairwise distance)
:param data: data
:param n_samples: n_samples to keep for initializing the model
:return:
"""
if self.features_fn is None:
assert False
idx = np.arange(data.shape[0])
np.random.shuffle(idx)
features = []
for i in range(idx.shape[0]):
feats = self.features_fn([data[idx[i]]])
feats = feats.transpose((0, 2, 3, 1))
feats = feats.reshape((-1, feats.shape[-1]))
features.extend(feats)
if len(features) > n_samples:
break
features = np.asarray(features)
kmeans = KMeans(n_clusters=self.n_codewords, n_jobs=4, n_init=5)
kmeans.fit(features)
V = kmeans.cluster_centers_.copy()
# Initialize gamma
mean_distance = np.sum(pairwise_distances(V)) / (self.n_codewords * (self.n_codewords - 1))
self.gamma.set_value(self.gamma.get_value() * np.float32(mean_distance))
# Initialize codebook
V = V.reshape((V.shape[0], V.shape[1], 1, 1))
self.V.set_value(np.float32(V))
评论列表
文章目录