def _build(self,input_shape):
dim = np.prod(input_shape) // 2
print("{} latent bits".format(dim))
M, N = self.parameters['M'], self.parameters['N']
x = Input(shape=input_shape)
_pre = tf.slice(x, [0,0], [-1,dim])
_suc = tf.slice(x, [0,dim], [-1,dim])
pre = wrap(x,_pre,name="pre")
suc = wrap(x,_suc,name="suc")
print("encoder")
_encoder = self.build_encoder([dim])
action_logit = ConditionalSequential(_encoder, pre, axis=1)(suc)
gs = self.build_gs()
action = gs(action_logit)
print("decoder")
_decoder = self.build_decoder([dim])
suc_reconstruction = ConditionalSequential(_decoder, pre, axis=1)(flatten(action))
y = Concatenate(axis=1)([pre,suc_reconstruction])
action2 = Input(shape=(N,M))
pre2 = Input(shape=(dim,))
suc_reconstruction2 = ConditionalSequential(_decoder, pre2, axis=1)(flatten(action2))
y2 = Concatenate(axis=1)([pre2,suc_reconstruction2])
def rec(x, y):
return bce(K.reshape(x,(K.shape(x)[0],dim*2,)),
K.reshape(y,(K.shape(x)[0],dim*2,)))
def loss(x, y):
kl_loss = gs.loss()
reconstruction_loss = rec(x, y)
return reconstruction_loss + kl_loss
self.metrics.append(rec)
self.callbacks.append(LambdaCallback(on_epoch_end=gs.cool))
self.custom_log_functions['tau'] = lambda: K.get_value(gs.tau)
self.loss = loss
self.encoder = Model(x, [pre,action])
self.decoder = Model([pre2,action2], y2)
self.net = Model(x, y)
self.autoencoder = self.net
评论列表
文章目录