Тензор потока Две структуры не имеют одинаковой вложенной структуры в while_loop, хотя loop_vars и аргументы body одинаковы - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь реализовать контрастную дивергенцию в тензорном потоке, но я получаю эту ошибку, и я не знаю, как ее решить.

Вот мой код:

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

Любая помощь в этом?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...