in analogy_generation.py [0:0]
def do_generate(feats, labels, generator, max_per_label):
# generate till there are at least max_per_label examples for each label
unique_labels = np.unique(labels)
generations_needed = []
generator['concatenated_centroids'] = generator['concatenated_centroids'].numpy()
for k, lab in enumerate(unique_labels):
# for each label
idx = np.where(labels==lab)[0]
# generate this many examples:
num_to_gen = max(max_per_label - idx.size,0)
if num_to_gen>0:
# choose a random seed
seed = np.random.choice(idx, num_to_gen)
# and a random base class
base_class = np.random.choice(generator['num_base_classes'], num_to_gen)
# and two random centroids from this base class
c_c = np.random.choice(generator['num_clusters_per_class'], num_to_gen)
c_d = np.random.choice(generator['num_clusters_per_class'], num_to_gen)
centroid_ids_c = base_class*generator['num_clusters_per_class'] + c_c
centroid_ids_d = base_class*generator['num_clusters_per_class'] + c_d
# add to list of things to generate
generations_needed.append( np.concatenate((seed.reshape((-1,1)), centroid_ids_c.reshape((-1,1)), centroid_ids_d.reshape((-1,1))),axis=1))
if len(generations_needed)>0:
generations_needed = np.concatenate(generations_needed, axis=0)
gen_feats = np.zeros((generations_needed.shape[0],feats.shape[1]))
gen_labels = np.zeros(generations_needed.shape[0])
# batch up the generations
batchsize=1000
for start in range(0, generations_needed.shape[0], batchsize):
stop = min(start + batchsize, generations_needed.shape[0])
g_idx = generations_needed[start:stop,:]
A = Variable(torch.Tensor(feats[g_idx[:,0],:])).cuda()
C = Variable(torch.Tensor(generator['concatenated_centroids'][g_idx[:,1],:])).cuda()
D = Variable(torch.Tensor(generator['concatenated_centroids'][g_idx[:,2],:])).cuda()
F = generator['model'](A,C,D).cpu().data.numpy().copy()
gen_feats[start:stop,:] = F
print(np.linalg.norm(F-feats[g_idx[:,0],:]), np.linalg.norm(F), np.linalg.norm(feats[g_idx[:,0],:]))
gen_labels[start:stop] = labels[g_idx[:,0]]
return np.concatenate((feats, gen_feats), axis=0), np.concatenate((labels, gen_labels), axis=0)
else:
return feats, labels