Я пытаюсь реализовать контрастную дивергенцию в тензорном потоке, но я получаю эту ошибку, и я не знаю, как ее решить.
Вот мой код:
def gibbs_step(self, v_act, v_prob, v_mf, h_act, h_prob, h_mf):
h_mf = tf.matmul(v_act, self.w) + self.hidden_bias
h_prob = tf.nn.sigmoid(h_mf)
h_act = self.hidden_activation(h_mf, h_prob)
v_mf = tf.matmul(h_act, tf.transpose(self.w)) + self.visible_bias
v_prob = tf.nn.sigmoid(v_mf)
v_act = self.visible_activation(v_mf, v_prob)
return [v_act, v_prob, v_mf, h_act, h_prob, h_mf]
def contrastive_divergence(self, x):
v_act = tf.identity(x)#(tf.zeros([self.n_visibles]), dtype=tf.float32)
v_prob = tf.zeros_like(x)
v_mf = tf.zeros_like(x)
h_act = tf.zeros_like(self.h_mf)
h_prob = tf.zeros_like(self.h_mf)
h_mf = tf.zeros_like(self.h_mf)
def always_true(*kwargs):
return True
cond = always_true
loop_vars = [v_act, v_prob, v_mf, h_act, h_prob, h_mf]
return tf.while_loop(cond, self.gibbs_step, loop_vars, maximum_iterations = self.k)
Из журнала ошибок я вижу, что измерения верны, однако то, что в журнале ошибок называется «вторая структура», представляет собой кортеж вместо списка.Я предполагаю, что это является причиной ошибки, но мне не ясно, откуда она взялась, gibbs_step
возвращает список, а loop_vars
также является списком.
TypeError: The two structures don't have the same nested structure.
First structure: type=list str=[<tf.Tensor 'contrastive_divergence/while/Identity:0' shape=() dtype=int32>, [<tf.Tensor 'contrastive_divergence/while/Identity_1:0' shape=(?, 400) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/Identity_2:0' shape=(?, 400) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/Identity_3:0' shape=(?, 400) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/Identity_4:0' shape=(?, 150) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/Identity_5:0' shape=(?, 150) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/Identity_6:0' shape=(?, 150) dtype=float32>]]
Second structure: type=list str=[<tf.Tensor 'contrastive_divergence/while/add:0' shape=() dtype=int32>, (<tf.Tensor 'contrastive_divergence/while/random_normal_1:0' shape=(?, 400) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/Sigmoid_1:0' shape=(?, 400) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/add_2:0' shape=(?, 400) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/Relu:0' shape=(?, 150) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/Sigmoid:0' shape=(?, 150) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/add_1:0' shape=(?, 150) dtype=float32>)]
More specifically: The two namedtuples don't have the same sequence type. First structure type=list str=[<tf.Tensor 'contrastive_divergence/while/Identity_1:0' shape=(?, 400) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/Identity_2:0' shape=(?, 400) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/Identity_3:0' shape=(?, 400) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/Identity_4:0' shape=(?, 150) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/Identity_5:0' shape=(?, 150) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/Identity_6:0' shape=(?, 150) dtype=float32>] has type list, while second structure type=tuple str=(<tf.Tensor 'contrastive_divergence/while/random_normal_1:0' shape=(?, 400) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/Sigmoid_1:0' shape=(?, 400) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/add_2:0' shape=(?, 400) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/Relu:0' shape=(?, 150) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/Sigmoid:0' shape=(?, 150) dtype=float32>, <tf.Tensor 'contrastive_divergence/while/add_1:0' shape=(?, 150) dtype=float32>) has type tuple
Любая помощь в этом?
Спасибо!