Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4e4f7a6

Browse files
committed
v0
1 parent 5fe6950 commit 4e4f7a6

File tree

7 files changed

+176
-145
lines changed

7 files changed

+176
-145
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Code for ["HashGAN: Deep Learning to Hash with Pair Conditional Wasserstein GAN"
66

77
## Prerequisites
88

9-
- Python3, NumPy, TensorFlow, SciPy, Matplotlib
9+
- Python3, NumPy, TensorFlow-gpu, SciPy, Matplotlib, easydict, yacs
1010
- A recent NVIDIA GPU
1111

1212
## Data Preparation

config_yaml/cifar_step_1.yaml

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,18 @@
11
MODEL:
2-
ARCHITECTURE: "NORM"
2+
G_ARCHITECTURE: "NORM"
3+
D_ARCHITECTURE: "NORM"
4+
G_PRETRAINED_MODEL_PATH: ''
5+
D_PRETRAINED_MODEL_PATH: ''
36
DATA:
47
USE_DATASET: "cifar10" # "cifar10", "nuswide81", "coco"
58
LABEL_DIM: 10
69
DB_SIZE: 54000
710
TEST_SIZE: 1000
811
WIDTH_HEIGHT: 32
9-
OUTPUT_DIM: 3072 # Number of pixels (32*32*3)
1012
MAP_R: 54000
1113
LIST_ROOT: "./data_list/cifar10"
1214
DATA_ROOT: "./data/cifar10"
13-
OUTPUT_DIR: "./output/cifar10_step_1"
14-
IMAGE_DIR: "./output/cifar10_step_1/images"
15-
MODEL_DIR: "./output/cifar10_step_1/models"
16-
LOG_DIR: "./output/cifar10_step_1/logs"
17-
15+
OUTPUT_DIR: "./output/cifar10_step_1_ACGAN_SCALE_G_10.0"
1816
TRAIN:
1917
BATCH_SIZE: 64
2018
ITERS: 100000
@@ -24,7 +22,8 @@ TRAIN:
2422
DECAY: True # Whether to decay LR over learning
2523
N_CRITIC: 5 # Critic steps per generator steps
2624
EVAL_FREQUENCY: 20000 # How frequently to evaluate and save model
25+
CHECKPOINT_FREQUENCY: 1000
2726
ACGAN_SCALE: 1.0
28-
ACGAN_SCALE_G: 0.1
27+
ACGAN_SCALE_G: 10.0
2928
WGAN_SCALE: 1.0
3029
WGAN_SCALE_G: 1.0

config_yaml/cifar_step_2.yaml

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,32 @@
11
MODEL:
2-
ARCHITECTURE: "ALEXNET"
3-
PRETRAINED_MODEL_PATH: "output/cifar10_step_1/models/iteration_79999.ckpt"
4-
ALEXNET_PRETRAINED_MODEL_PATH: "pretrained_models/reference_pretrain.npy"
2+
G_ARCHITECTURE: "NORM"
3+
D_ARCHITECTURE: "ALEXNET"
4+
G_PRETRAINED_MODEL_PATH: ""
5+
D_PRETRAINED_MODEL_PATH: "pretrained_models/reference_pretrain.npy"
56
DATA:
67
USE_DATASET: "cifar10" # "cifar10", "nuswide81", "coco"
78
LABEL_DIM: 10
89
DB_SIZE: 54000
910
TEST_SIZE: 1000
1011
WIDTH_HEIGHT: 32
11-
OUTPUT_DIM: 3072 # Number of pixels (32*32*3)
1212
MAP_R: 54000
1313
LIST_ROOT: "./data_list/cifar10"
1414
DATA_ROOT: "./data/cifar10"
15-
OUTPUT_DIR: "./output/cifar10_finetune"
16-
IMAGE_DIR: "./output/cifar10_finetune/images"
17-
MODEL_DIR: "./output/cifar10_finetune/models"
18-
LOG_DIR: "./output/cifar10_finetune/logs"
15+
OUTPUT_DIR: "./output/cifar10_finetune_acgan_scale_fake_0"
1916

2017
TRAIN:
2118
BATCH_SIZE: 128
2219
ITERS: 10000
23-
CROSS_ENTROPY_ALPHA: 5
20+
CROSS_ENTROPY_ALPHA: 10
2421
LR: 1e-4 # Initial learning rate
2522
G_LR: 0.0 # 1e-4
2623
DECAY: True # Whether to decay LR over learning
2724
N_CRITIC: 1 # Critic steps per generator steps
28-
EVAL_FREQUENCY: 2000 # How frequently to save model
25+
EVAL_FREQUENCY: 2000
26+
SAMPLE_FREQUENCY: 1
2927
ACGAN_SCALE: 1.0
30-
ACGAN_SCALE_G: 0.0
28+
ACGAN_SCALE_FAKE: 0.0 # 1.0
3129
WGAN_SCALE: 0.0
32-
WGAN_SCALE_G: 0.0
30+
WGAN_SCALE_GP: 10.0
31+
ACGAN_SCALE_G: 0.1
32+
WGAN_SCALE_G: 1.0

lib/architecture.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ def good_discriminator(inputs, cfg):
202202

203203
def alexnet_discriminator(inputs, cfg, stage="train"):
204204
# noinspection PyTypeChecker
205+
# TODO: don't load imagenet pretrained model when D_PRETRAINED_MODEL_PATH is given
205206
net_data = dict(np.load(cfg.MODEL.ALEXNET_PRETRAINED_MODEL_PATH, encoding='latin1').item())
206207

207208
if inputs.shape[1] != 256:
@@ -399,16 +400,16 @@ def convolve(i, k): return tf.nn.conv2d(i, k, [1, 1, 1, 1], padding='SAME')
399400

400401

401402
def generator(n_samples, labels, cfg, noise=None):
402-
if cfg.MODEL.ARCHITECTURE == "GOOD":
403+
if cfg.MODEL.G_ARCHITECTURE == "GOOD":
403404
return good_generator(n_samples, labels, noise=noise, cfg=cfg)
404405
else:
405406
return old_generator(n_samples, labels, noise=noise, cfg=cfg)
406407

407408

408409
def discriminator(inputs, cfg, stage="train"):
409-
if cfg.MODEL.ARCHITECTURE == "GOOD":
410+
if cfg.MODEL.D_ARCHITECTURE == "GOOD":
410411
return good_discriminator(inputs, cfg=cfg)
411-
elif cfg.MODEL.ARCHITECTURE == "ALEXNET":
412+
elif cfg.MODEL.D_ARCHITECTURE == "ALEXNET":
412413
return alexnet_discriminator(inputs, stage=stage, cfg=cfg)
413414
else:
414415
return old_discriminator(inputs, cfg=cfg)

lib/config.py

Lines changed: 68 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,69 @@
11
from yacs.config import CfgNode
2-
import os.path as osp
3-
4-
_C = CfgNode()
5-
6-
_C.MODEL = CfgNode()
7-
_C.MODEL.ARCHITECTURE = "NORM" # GOOD, NORM
8-
_C.MODEL.DIM_G = 128 # generator dimensionality
9-
_C.MODEL.DIM_D = 128 # Critic dimensionality
10-
_C.MODEL.DIM = 64 # DIM for good generator and discriminator
11-
_C.MODEL.HASH_DIM = 64
12-
_C.MODEL.PRETRAINED_MODEL_PATH = ""
13-
_C.MODEL.ALEXNET_PRETRAINED_MODEL_PATH = "pretrained_models/reference_pretrain.npy"
14-
15-
_C.DATA = CfgNode()
16-
_C.DATA.USE_DATASET = "cifar10" # "cifar10", "nuswide81", "coco"
17-
_C.DATA.LIST_ROOT = "./data/cifar10"
18-
_C.DATA.DATA_ROOT = "./data_list/cifar10"
19-
_C.DATA.LABEL_DIM = 10
20-
_C.DATA.DB_SIZE = 54000
21-
_C.DATA.TEST_SIZE = 1000
22-
_C.DATA.WIDTH_HEIGHT = 32
23-
_C.DATA.OUTPUT_DIM = 32 * 32 * 3 # Number of pixels (32*32*3)
24-
_C.DATA.MAP_R = 54000
25-
26-
_C.DATA.OUTPUT_DIR = "./output/cifar10_step_1"
27-
_C.DATA.IMAGE_DIR = osp.join(_C.DATA.OUTPUT_DIR, "images")
28-
_C.DATA.MODEL_DIR = osp.join(_C.DATA.OUTPUT_DIR, "models")
29-
_C.DATA.LOG_DIR = osp.join(_C.DATA.OUTPUT_DIR, "logs")
30-
31-
_C.TRAIN = CfgNode()
32-
_C.TRAIN.BATCH_SIZE = 64
33-
_C.TRAIN.ITERS = 100000
34-
_C.TRAIN.CROSS_ENTROPY_ALPHA = 5
35-
_C.TRAIN.LR = 1e-4 # Initial learning rate
36-
_C.TRAIN.G_LR = 1e-4 # 1e-4
37-
_C.TRAIN.DECAY = True # Whether to decay LR over learning
38-
_C.TRAIN.N_CRITIC = 5 # Critic steps per generator steps
39-
_C.TRAIN.EVAL_FREQUENCY = 20000 # How frequently to evaluate and save model
40-
_C.TRAIN.RUNTIME_MEASURE_FREQUENCY = 20 # How frequently to evaluate and save model
41-
_C.TRAIN.SAMPLE_FREQUENCY = 1000 # How frequently to evaluate and save model
42-
_C.TRAIN.ACGAN_SCALE = 1.0
43-
_C.TRAIN.ACGAN_SCALE_G = 0.1
44-
_C.TRAIN.WGAN_SCALE = 1.0
45-
_C.TRAIN.WGAN_SCALE_G = 1.0
46-
_C.TRAIN.NORMED_CROSS_ENTROPY = True
47-
_C.TRAIN.FAKE_RATIO = 1.0
48-
49-
config = _C
2+
import os
3+
4+
config = CfgNode()
5+
6+
config.MODEL = CfgNode()
7+
config.MODEL.DIM_G = 128 # generator dimensionality
8+
config.MODEL.DIM_D = 128 # Critic dimensionality
9+
config.MODEL.DIM = 64 # DIM for good generator and discriminator
10+
config.MODEL.HASH_DIM = 64
11+
config.MODEL.G_ARCHITECTURE = "NORM" # GOOD, NORM
12+
config.MODEL.D_ARCHITECTURE = "NORM" # GOOD, NORM, ALEXNET
13+
config.MODEL.G_PRETRAINED_MODEL_PATH = ""
14+
config.MODEL.D_PRETRAINED_MODEL_PATH = ""
15+
# TODO: merge ALEXNET_PRETRAINED_MODEL_PATH and D_PRETRAINED_MODEL_PATH
16+
config.MODEL.ALEXNET_PRETRAINED_MODEL_PATH = "./pretrained_models/reference_pretrain.npy"
17+
18+
config.DATA = CfgNode()
19+
config.DATA.USE_DATASET = "cifar10" # "cifar10", "nuswide81", "coco"
20+
config.DATA.LIST_ROOT = "./data/cifar10"
21+
config.DATA.DATA_ROOT = "./data_list/cifar10"
22+
config.DATA.LABEL_DIM = 10
23+
config.DATA.DB_SIZE = 54000
24+
config.DATA.TEST_SIZE = 1000
25+
config.DATA.WIDTH_HEIGHT = 32
26+
config.DATA.OUTPUT_DIM = 3 * (config.DATA.WIDTH_HEIGHT ** 2) # Number of pixels (32*32*3)
27+
config.DATA.MAP_R = 54000
28+
config.DATA.OUTPUT_DIR = "./output/cifar10_step_1"
29+
config.DATA.IMAGE_DIR = os.path.join(config.DATA.OUTPUT_DIR, "images")
30+
config.DATA.MODEL_DIR = os.path.join(config.DATA.OUTPUT_DIR, "models")
31+
config.DATA.LOG_DIR = os.path.join(config.DATA.OUTPUT_DIR, "logs")
32+
33+
config.TRAIN = CfgNode()
34+
config.TRAIN.EVALUATE_MODE = False
35+
config.TRAIN.BATCH_SIZE = 64
36+
config.TRAIN.ITERS = 100000
37+
config.TRAIN.CROSS_ENTROPY_ALPHA = 5
38+
config.TRAIN.LR = 1e-4 # Initial learning rate
39+
config.TRAIN.G_LR = 1e-4 # 1e-4
40+
config.TRAIN.DECAY = True # Whether to decay LR over learning
41+
config.TRAIN.N_CRITIC = 5 # Critic steps per generator steps
42+
config.TRAIN.EVAL_FREQUENCY = 20000 # How frequently to evaluate and save model
43+
config.TRAIN.CHECKPOINT_FREQUENCY = 2000 # How frequently to evaluate and save model
44+
config.TRAIN.RUNTIME_MEASURE_FREQUENCY = 200 # How frequently to evaluate and save model
45+
config.TRAIN.SAMPLE_FREQUENCY = 1000 # How frequently to evaluate and save model
46+
config.TRAIN.ACGAN_SCALE = 1.0
47+
config.TRAIN.ACGAN_SCALE_FAKE = 1.0
48+
config.TRAIN.WGAN_SCALE = 1.0
49+
config.TRAIN.WGAN_SCALE_GP = 10.0
50+
config.TRAIN.ACGAN_SCALE_G = 0.1
51+
config.TRAIN.WGAN_SCALE_G = 1.0
52+
config.TRAIN.NORMED_CROSS_ENTROPY = True
53+
config.TRAIN.FAKE_RATIO = 1.0
54+
55+
56+
def update_and_inference_config(cfg_file):
57+
config.merge_from_file(cfg_file)
58+
59+
config.DATA.IMAGE_DIR = os.path.join(config.DATA.OUTPUT_DIR, "images")
60+
config.DATA.MODEL_DIR = os.path.join(config.DATA.OUTPUT_DIR, "models")
61+
config.DATA.LOG_DIR = os.path.join(config.DATA.OUTPUT_DIR, "logs")
62+
config.DATA.OUTPUT_DIM = 3 * (config.DATA.WIDTH_HEIGHT ** 2) # Number of pixels (32*32*3)
63+
64+
os.makedirs(config.DATA.IMAGE_DIR, exist_ok=True)
65+
os.makedirs(config.DATA.MODEL_DIR, exist_ok=True)
66+
os.makedirs(config.DATA.LOG_DIR, exist_ok=True)
67+
68+
config.freeze()
69+
return config

lib/metric.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ def get_maps_by_feature(self, database, query):
1313
ips = np.dot(query.output, database.output.T)
1414
ids = np.argsort(-ips, 1)
1515
apx = []
16-
print("#calc mAPs# calculating mAPs")
1716
for i in range(ips.shape[0]):
1817
label = query.label[i, :].copy()
1918
label[label == 0] = -1
@@ -22,5 +21,4 @@ def get_maps_by_feature(self, database, query):
2221
px = np.cumsum(imatch).astype(float) / np.arange(1, self.R + 1, 1)
2322
if rel != 0:
2423
apx.append(np.sum(px * imatch) / rel)
25-
print("mAPs: ", np.mean(np.array(apx)))
2624
return np.mean(np.array(apx))

0 commit comments

Comments
 (0)