246 lines (246 with data), 18.5 kB
B
k¯èaLe ã @ sª d dl Z d dlm mZ d dlZd dlmZ d dl Z d dl
mZ d dlm
Z
dd ZG dd deZG d d
d
eZG dd deZd
d Zdd Zdd Zdd ZdS )é N)ÚVariable)Úcalc_weight)Úevaluatec C s x| ¡ D ]}| |¡ q
W d S )N)Ú
parametersÚrequires_grad_)ÚmodelÚ
requires_gradÚp© r
ú1C:\Users\Xin\Desktop\mscETM\Demo code_BS\train.pyÚtoogle_grad
s r c @ sP e Zd Zdd Zdd Zdd Zdd Zd d
Zdd ZdddZ dddZ
dS )Ú
Trainer_moETMc C s || _ || _|| _|| _d S )N)Úencoder_mod1Úencoder_mod2ÚdecoderÚ optimizer)Úselfr r r r r
r
r Ú__init__ s zTrainer_moETM.__init__c C sº t | jd t | jd t | jd | j ¡ | j ¡ | j ¡ | j ¡ | |¡\}}| |¡\}}| jd|jd |jd fdd\} }
t j
| | d¡| d¡fdd}t j
|
| d¡| d¡fdd}| ||¡\}
}t
j| |
|¡dd}| ||¡\}}| | d¡ ¡ }| | d¡ ¡ }| |
|¡ ¡ }|| || }| ¡ t jj | j ¡ d¡ t jj | j ¡ d¡ t jj | j ¡ d¡ | j ¡ | ¡ | ¡ | ¡ | ¡ fS )NTé r )Úuse_cuda)Údiméÿÿÿÿé2 )r r r r Útrainr Ú zero_gradÚprior_expertÚshapeÚtorchÚcatÚ unsqueezeÚexpertsÚFÚsoftmaxÚreparameterizeÚsumÚmeanÚget_klÚbackwardÚnnÚutilsÚclip_grad_norm_r ÚstepÚitem)r Úx_mod1Úx_mod2Ú
batch_indicesÚ KL_weightÚmu_mod1Úlog_sigma_mod1Úmu_mod2Úlog_sigma_mod2Úmu_priorÚlogsigma_priorÚMuÚ Log_sigmaÚmuÚ log_sigmaÚThetaÚrecon_log_mod1Úrecon_log_mod2Únll_mod1Únll_mod2ÚKLÚLossr
r
r r s2
$
zTrainer_moETM.trainc C s t |¡}t |¡}|| | S )N)r ÚexpÚ
randn_like)r r9 r: ÚstdÚepsr
r
r r# @ s
zTrainer_moETM.reparameterizec C s, d| }dd| | d¡ | ¡ d¡ S )a0 Calculate KL(q||p) where q = Normal(mu, sigma and p = Normal(0, I).
Args:
mu: the mean of the q distribution.
logsigma: the log of the standard deviation of the q distribution.
Returns:
KL(q||p) where q = Normal(mu, sigma and p = Normal(0, I).
é g à¿r r )ÚpowrB r$ )r r9 Úlogsigmar
r
r r&