Skip to content

Commit 93ad881

Browse files
Add UpdateLambda, different optimizer for encoder
1 parent 058c9d0 commit 93ad881

File tree

16 files changed

+244
-119
lines changed

16 files changed

+244
-119
lines changed

adapt/base.py

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -889,7 +889,7 @@ def fit(self, X, y=None, Xt=None, yt=None, domains=None, **fit_params):
889889
Returns
890890
-------
891891
self : returns an instance of self
892-
"""
892+
"""
893893
set_random_seed(self.random_state)
894894

895895
# 1. Initialize networks
@@ -906,7 +906,6 @@ def fit(self, X, y=None, Xt=None, yt=None, domains=None, **fit_params):
906906
shape = first_elem[0].shape
907907
else:
908908
shape = X.shape[1:]
909-
print(shape)
910909
self._initialize_weights(shape)
911910

912911
# 2. Get Fit params
@@ -984,9 +983,9 @@ def fit(self, X, y=None, Xt=None, yt=None, domains=None, **fit_params):
984983
self._save_validation_data(X, Xt)
985984

986985
# 4. Get validation data
987-
validation_data = self._check_validation_data(validation_data,
988-
validation_batch_size,
989-
shuffle)
986+
# validation_data = self._check_validation_data(validation_data,
987+
# validation_batch_size,
988+
# shuffle)
990989

991990
if validation_data is None and validation_split>0.:
992991
if shuffle:
@@ -1053,20 +1052,20 @@ def fit(self, X, y=None, Xt=None, yt=None, domains=None, **fit_params):
10531052

10541053
self._initialize_pretain_networks()
10551054

1056-
# 6. Training
1055+
# 6. Compile
10571056
if (not self._is_compiled) or (self.pretrain_):
10581057
self.compile()
10591058

10601059
if not hasattr(self, "history_"):
10611060
self.history_ = {}
10621061

1062+
# .7 Training
10631063
if shuffle:
10641064
dataset = tf.data.Dataset.zip((dataset_src, dataset_tgt)).shuffle(buffer_size=1024).batch(batch_size)
10651065
else:
10661066
dataset = tf.data.Dataset.zip((dataset_src, dataset_tgt)).batch(batch_size)
1067-
1067+
10681068
self.pretrain_ = False
1069-
self.steps_ = tf.Variable(0.)
10701069

10711070
hist = super().fit(dataset, validation_data=validation_data, **fit_params)
10721071

@@ -1247,6 +1246,12 @@ def compile(self,
12471246
super().compile(
12481247
**compile_params
12491248
)
1249+
1250+
# Set optimizer for encoder and discriminator
1251+
if not hasattr(self, "optimizer_enc"):
1252+
self.optimizer_enc = self.optimizer
1253+
if not hasattr(self, "optimizer_disc"):
1254+
self.optimizer_disc = self.optimizer
12501255

12511256

12521257
def call(self, inputs):
@@ -1431,7 +1436,7 @@ def score_estimator(self, X, y, sample_weight=None):
14311436
score : float
14321437
Score.
14331438
"""
1434-
if np.prod(X.shape) <= 10**8:
1439+
if hasattr(X, "shape") and np.prod(X.shape) <= 10**8:
14351440
score = self.evaluate(
14361441
X, y,
14371442
sample_weight=sample_weight,
@@ -1447,20 +1452,20 @@ def score_estimator(self, X, y, sample_weight=None):
14471452
return score
14481453

14491454

1450-
def _check_validation_data(self, validation_data, batch_size, shuffle):
1451-
if isinstance(validation_data, tuple):
1452-
X_val = validation_data[0]
1453-
y_val = validation_data[1]
1454-
1455-
validation_data = tf.data.Dataset.zip(
1456-
(tf.data.Dataset.from_tensor_slices(X_val),
1457-
tf.data.Dataset.from_tensor_slices(y_val))
1458-
)
1459-
if shuffle:
1460-
validation_data = validation_data.shuffle(buffer_size=1024).batch(batch_size)
1461-
else:
1462-
validation_data = validation_data.batch(batch_size)
1463-
return validation_data
1455+
# def _check_validation_data(self, validation_data, batch_size, shuffle):
1456+
# if isinstance(validation_data, tuple):
1457+
# X_val = validation_data[0]
1458+
# y_val = validation_data[1]
1459+
1460+
# validation_data = tf.data.Dataset.zip(
1461+
# (tf.data.Dataset.from_tensor_slices(X_val),
1462+
# tf.data.Dataset.from_tensor_slices(y_val))
1463+
# )
1464+
# if shuffle:
1465+
# validation_data = validation_data.shuffle(buffer_size=1024).batch(batch_size)
1466+
# else:
1467+
# validation_data = validation_data.batch(batch_size)
1468+
# return validation_data
14641469

14651470

14661471
def _get_legal_params(self, params):
@@ -1476,7 +1481,7 @@ def _get_legal_params(self, params):
14761481
if (optimizer is not None) and (not isinstance(optimizer, str)):
14771482
legal_params_fct.append(optimizer.__init__)
14781483

1479-
legal_params = ["domain", "val_sample_size"]
1484+
legal_params = ["domain", "val_sample_size", "optimizer_enc", "optimizer_disc"]
14801485
for func in legal_params_fct:
14811486
args = [
14821487
p.name

adapt/feature_based/_adda.py

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ def pretrain_step(self, data):
169169
Xs, Xt, ys, yt = self._unpack_data(data)
170170

171171
# loss
172-
with tf.GradientTape() as tape:
172+
with tf.GradientTape() as task_tape, tf.GradientTape() as enc_tape:
173173
# Forward pass
174174
Xs_enc = self.encoder_src_(Xs, training=True)
175175
ys_pred = self.task_(Xs_enc, training=True)
@@ -179,14 +179,19 @@ def pretrain_step(self, data):
179179

180180
# Compute the loss value
181181
loss = self.task_loss_(ys, ys_pred)
182-
loss += sum(self.task_.losses) + sum(self.encoder_src_.losses)
182+
task_loss = loss + sum(self.task_.losses)
183+
enc_loss = loss + sum(self.encoder_src_.losses)
183184

184185
# Compute gradients
185-
trainable_vars = self.task_.trainable_variables + self.encoder_src_.trainable_variables
186-
gradients = tape.gradient(loss, trainable_vars)
186+
trainable_vars_task = self.task_.trainable_variables
187+
trainable_vars_enc = self.encoder_src_.trainable_variables
188+
189+
gradients_task = task_tape.gradient(task_loss, trainable_vars_task)
190+
gradients_enc = enc_tape.gradient(enc_loss, trainable_vars_enc)
187191

188192
# Update weights
189-
self.optimizer.apply_gradients(zip(gradients, trainable_vars))
193+
self.optimizer.apply_gradients(zip(gradients_task, trainable_vars_task))
194+
self.optimizer_enc.apply_gradients(zip(gradients_enc, trainable_vars_enc))
190195

191196
# Update metrics
192197
self.compiled_metrics.update_state(ys, ys_pred)
@@ -206,55 +211,48 @@ def train_step(self, data):
206211
Xs, Xt, ys, yt = self._unpack_data(data)
207212

208213
# loss
209-
with tf.GradientTape() as task_tape, tf.GradientTape() as enc_tape, tf.GradientTape() as disc_tape:
214+
with tf.GradientTape() as enc_tape, tf.GradientTape() as disc_tape:
210215
# Forward pass
211-
Xs_enc = self.encoder_src_(Xs, training=True)
212-
ys_pred = self.task_(Xs_enc, training=True)
216+
if self.pretrain:
217+
Xs_enc = self.encoder_src_(Xs, training=False)
218+
else:
219+
# encoder src is not needed if pretrain=False
220+
Xs_enc = Xs
221+
213222
ys_disc = self.discriminator_(Xs_enc, training=True)
214223

215224
Xt_enc = self.encoder_(Xt, training=True)
216225
yt_disc = self.discriminator_(Xt_enc, training=True)
217226

218-
# Reshape
219-
ys_pred = tf.reshape(ys_pred, tf.shape(ys))
220-
221227
# Compute the loss value
222-
task_loss = self.task_loss_(ys, ys_pred)
223-
224228
disc_loss = (-tf.math.log(ys_disc + EPS)
225229
-tf.math.log(1-yt_disc + EPS))
226230

227231
enc_loss = -tf.math.log(yt_disc + EPS)
228232

229-
task_loss = tf.reduce_mean(task_loss)
230233
disc_loss = tf.reduce_mean(disc_loss)
231234
enc_loss = tf.reduce_mean(enc_loss)
232235

233-
task_loss += sum(self.task_.losses)
234236
disc_loss += sum(self.discriminator_.losses)
235237
enc_loss += sum(self.encoder_.losses)
236238

237239
# Compute gradients
238-
trainable_vars_task = self.task_.trainable_variables
239240
trainable_vars_enc = self.encoder_.trainable_variables
240241
trainable_vars_disc = self.discriminator_.trainable_variables
241242

242-
gradients_task = task_tape.gradient(task_loss, trainable_vars_task)
243243
gradients_enc = enc_tape.gradient(enc_loss, trainable_vars_enc)
244244
gradients_disc = disc_tape.gradient(disc_loss, trainable_vars_disc)
245245

246246
# Update weights
247-
self.optimizer.apply_gradients(zip(gradients_task, trainable_vars_task))
248-
self.optimizer.apply_gradients(zip(gradients_enc, trainable_vars_enc))
249-
self.optimizer.apply_gradients(zip(gradients_disc, trainable_vars_disc))
247+
self.optimizer_enc.apply_gradients(zip(gradients_enc, trainable_vars_enc))
248+
self.optimizer_disc.apply_gradients(zip(gradients_disc, trainable_vars_disc))
250249

251250
# Update metrics
252-
self.compiled_metrics.update_state(ys, ys_pred)
253-
self.compiled_loss(ys, ys_pred)
251+
# self.compiled_metrics.update_state(ys, ys_pred)
252+
# self.compiled_loss(ys, ys_pred)
254253
# Return a dict mapping metric names to current value
255-
logs = {m.name: m.result() for m in self.metrics}
256-
disc_metrics = self._get_disc_metrics(ys_disc, yt_disc)
257-
logs.update(disc_metrics)
254+
# logs = {m.name: m.result() for m in self.metrics}
255+
logs = self._get_disc_metrics(ys_disc, yt_disc)
258256
return logs
259257

260258

@@ -275,12 +273,14 @@ def _get_disc_metrics(self, ys_disc, yt_disc):
275273
def _initialize_weights(self, shape_X):
276274
# Init weights encoder
277275
self(np.zeros((1,) + shape_X))
278-
self.encoder_(np.zeros((1,) + shape_X))
279276

280277
# Set same weights to encoder_src
281-
self.encoder_src_ = check_network(self.encoder_,
282-
copy=True,
283-
name="encoder_src")
278+
if self.pretrain:
279+
# encoder src is not needed if pretrain=False
280+
self.encoder_(np.zeros((1,) + shape_X))
281+
self.encoder_src_ = check_network(self.encoder_,
282+
copy=True,
283+
name="encoder_src")
284284

285285

286286
def transform(self, X, domain="tgt"):

adapt/feature_based/_cdan.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,8 +255,8 @@ def train_step(self, data):
255255

256256
# Update weights
257257
self.optimizer.apply_gradients(zip(gradients_task, trainable_vars_task))
258-
self.optimizer.apply_gradients(zip(gradients_enc, trainable_vars_enc))
259-
self.optimizer.apply_gradients(zip(gradients_disc, trainable_vars_disc))
258+
self.optimizer_enc.apply_gradients(zip(gradients_enc, trainable_vars_enc))
259+
self.optimizer_disc.apply_gradients(zip(gradients_disc, trainable_vars_disc))
260260

261261
# Update metrics
262262
self.compiled_metrics.update_state(ys, ys_pred)

adapt/feature_based/_dann.py

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,8 @@ class DANN(BaseAdaptDeep):
5858
5959
Parameters
6060
----------
61-
lambda_ : float or None (default=0.1)
61+
lambda_ : float (default=0.1)
6262
Trade-off parameter.
63-
If ``None``, ``lambda_`` increases gradually
64-
according to the following formula:
65-
``lambda_`` = 2/(1 + exp(-``gamma`` * p)) - 1.
66-
With p growing from 0 to 1 during training.
6763
6864
gamma : float (default=10.0)
6965
Increase rate parameter.
@@ -137,24 +133,9 @@ def __init__(self,
137133
def train_step(self, data):
138134
# Unpack the data.
139135
Xs, Xt, ys, yt = self._unpack_data(data)
140-
141-
if self.lambda_ is None:
142-
_is_lambda_None = 1.
143-
lambda_ = 0.
144-
else:
145-
_is_lambda_None = 0.
146-
lambda_ = float(self.lambda_)
147136

148137
# loss
149-
with tf.GradientTape() as task_tape, tf.GradientTape() as enc_tape, tf.GradientTape() as disc_tape:
150-
151-
# Compute lambda
152-
self.steps_.assign_add(1.)
153-
progress = self.steps_ / self.total_steps_
154-
_lambda_ = 2. / (1. + tf.exp(-self.gamma * progress)) - 1.
155-
_lambda_ = (_is_lambda_None * _lambda_ +
156-
(1. - _is_lambda_None) * lambda_)
157-
138+
with tf.GradientTape() as task_tape, tf.GradientTape() as enc_tape, tf.GradientTape() as disc_tape:
158139
# Forward pass
159140
Xs_enc = self.encoder_(Xs, training=True)
160141
ys_pred = self.task_(Xs_enc, training=True)
@@ -175,7 +156,7 @@ def train_step(self, data):
175156
task_loss = tf.reduce_mean(task_loss)
176157
disc_loss = tf.reduce_mean(disc_loss)
177158

178-
enc_loss = task_loss - _lambda_ * disc_loss
159+
enc_loss = task_loss - self.lambda_ * disc_loss
179160

180161
task_loss += sum(self.task_.losses)
181162
disc_loss += sum(self.discriminator_.losses)
@@ -193,8 +174,8 @@ def train_step(self, data):
193174

194175
# Update weights
195176
self.optimizer.apply_gradients(zip(gradients_task, trainable_vars_task))
196-
self.optimizer.apply_gradients(zip(gradients_enc, trainable_vars_enc))
197-
self.optimizer.apply_gradients(zip(gradients_disc, trainable_vars_disc))
177+
self.optimizer_enc.apply_gradients(zip(gradients_enc, trainable_vars_enc))
178+
self.optimizer_disc.apply_gradients(zip(gradients_disc, trainable_vars_disc))
198179

199180
# Update metrics
200181
self.compiled_metrics.update_state(ys, ys_pred)

adapt/feature_based/_deepcoral.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ def train_step(self, data):
140140
_match_mean = 0.
141141

142142
# loss
143-
with tf.GradientTape() as tape:
143+
with tf.GradientTape() as task_tape, tf.GradientTape() as enc_tape:
144144

145145
# Forward pass
146146
Xs_enc = self.encoder_(Xs, training=True)
@@ -187,17 +187,19 @@ def train_step(self, data):
187187
disc_loss_mean = tf.reduce_mean(disc_loss_mean)
188188
disc_loss = self.lambda_ * (disc_loss_cov + _match_mean * disc_loss_mean)
189189

190-
loss = task_loss + disc_loss
191-
192-
loss += sum(self.task_.losses) + sum(self.encoder_.losses)
190+
task_loss += sum(self.task_.losses)
191+
disc_loss += sum(self.encoder_.losses)
193192

194193
# Compute gradients
195-
trainable_vars = self.task_.trainable_variables + self.encoder_.trainable_variables
194+
trainable_vars_task = self.task_.trainable_variables
195+
trainable_vars_enc = self.encoder_.trainable_variables
196196

197-
gradients = tape.gradient(loss, trainable_vars)
197+
gradients_task = task_tape.gradient(task_loss, trainable_vars_task)
198+
gradients_enc = enc_tape.gradient(disc_loss, trainable_vars_enc)
198199

199200
# Update weights
200-
self.optimizer.apply_gradients(zip(gradients, trainable_vars))
201+
self.optimizer.apply_gradients(zip(gradients_task, trainable_vars_task))
202+
self.optimizer_enc.apply_gradients(zip(gradients_enc, trainable_vars_enc))
201203

202204
# Update metrics
203205
self.compiled_metrics.update_state(ys, ys_pred)

0 commit comments

Comments
 (0)