def __build_weakly_clamped_phase(self):
n_iterations = T.iscalar('n_iterations')
epsilon = T.fscalar('epsilon')
beta = T.fscalar('beta')
alphas = [T.fscalar("alpha_W"+str(r+1)) for r in range(len(self.weights))]
def step(*layers):
F_sum = T.sum(self.__total_energy(layers, beta))
layers_dot = T.grad(-F_sum, list(layers)) # temporal derivative of the state (weakly clamped trajectory)
layers_new = [layers[0]]+[T.clip(layer+epsilon*dot,0.,1.) for layer,dot in zip(layers,layers_dot)][1:]
return layers_new
( layers, updates ) = theano.scan(
step,
outputs_info=self.layers,
n_steps=n_iterations
)
layers_weakly_clamped = [layer[-1] for layer in layers]
E_mean_free = T.mean(self.__energy(self.layers))
E_mean_weakly_clamped = T.mean(self.__energy(layers_weakly_clamped))
biases_dot = T.grad( (E_mean_weakly_clamped-E_mean_free) / beta, self.biases, consider_constant=layers_weakly_clamped)
weights_dot = T.grad( (E_mean_weakly_clamped-E_mean_free) / beta, self.weights, consider_constant=layers_weakly_clamped)
biases_new = [b - alpha * dot for b,alpha,dot in zip(self.biases[1:],alphas,biases_dot[1:])]
weights_new = [W - alpha * dot for W,alpha,dot in zip(self.weights, alphas,weights_dot)]
Delta_log = [T.sqrt( ((W_new - W) ** 2).mean() ) / T.sqrt( (W ** 2).mean() ) for W,W_new in zip(self.weights,weights_new)]
for bias, bias_new in zip(self.biases[1:],biases_new):
updates[bias]=bias_new
for weight, weight_new in zip(self.weights,weights_new):
updates[weight]=weight_new
weakly_clamped_phase = theano.function(
inputs=[n_iterations, epsilon, beta]+alphas,
outputs=Delta_log,
updates=updates
)
return weakly_clamped_phase
model.py 文件源码
python
阅读 20
收藏 0
点赞 0
评论 0
评论列表
文章目录