Tensorflow将张量数组转换为单张量

时间:2016-06-15 02:39:39

标签: python machine-learning neural-network artificial-intelligence tensorflow

我正在构建一个带有Tensorflow的LSTM RNN,它可以执行按像素分类(或者,更好的方法是使用像素方式预测?)

在解释标题时请耐心等待。

网络如下图所示......

enter image description here

这个想法是这样的......大小(200,200)的输入图像是大小为(200,200,200)的LSTM RNN的输入。从LSTM张量向量(LSTM RNN中的粉红色框)输出的每个序列被馈送到MLP,然后MLP进行单个输出预测 - ergo 像素预测(你可以看到)一个输入像素如何生成一个输出“像素”

代码看起来像这样(不是所有代码,只需要部分代码):

...
n_input_x = 200
n_input_y = 200

x = tf.placeholder("float", [None, n_input_x, n_input_y])
y = tf.placeholder("float", [None, n_input_x, n_input_y])

def RNN(x):
    x = tf.transpose(x, [1, 0, 2])
    x = tf.reshape(x, [-1, n_input_x])
    x = tf.split(0, n_steps, x)

    lstm_cell = rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0, state_is_tuple=True)
    outputs, states = rnn.rnn(lstm_cell, x, dtype=tf.float32)

    output_matrix = []
    for i in xrange(200):
        temp_vector = []
        for j in xrange(200):
            lstm_vector = outputs[j]
            pixel_pred = multilayer_perceptron(lstm_vector, mlp_weights, mlp_biases)
            temp_vector.append(pixel_pred)
        output_matrix.append(temp_vector)
        print i

    return output_matrix

temp = RNN(x)
pred = tf.placeholder(temp, [None, n_input_x, n_input_y])
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
...

我已确认RNN的输出 - 即temp中存储的内容是<tf.Tensor 'Softmax_39999:0' shape=(?, 1) dtype=float32>的200x200数组

正如您所看到的,我将temp放置在相同形状的tf.placeholder中(批量大小为None ...或者我需要这个吗?)......该程序就像它完成运行一样退出。理想情况下,当我调试和打印pred时,我希望看到的内容类似于<tf.Tensor shape=(200,200)>

当我调试时,第一次执行pred = tf.placeholder(temp, [None, n_input_x, n_input_y])时,我得到TypeError: TypeErro...32>]].",),然后returns,然后我再试一次,它说Exception AttributeError: "'NoneType' object has no attribute 'path'" in <function _remove at 0x7f1ab77c26e0> ignored

编辑我现在也意识到我需要放置行

lstm_cell = rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0, state_is_tuple=True)
outputs, states = rnn.rnn(lstm_cell, x, dtype=tf.float32)

在第一个循环中生成新的2D​​ LSTM RNN,但是我收到有关变量重用的错误ValueError: Variable RNN/BasicLSTMCell/Linear/Matrix does not exist, disallowed. Did you mean to set reuse=None in VarScope?

换句话说,是不是自动递增RNN张量名称?

1 个答案:

答案 0 :(得分:0)

报告形状的更方便的方法是使用tf.shape()。在你的情况下:

size1 = tf.shape(temp)
sess = tf.Session()
size1_fetched = sess.run(size1, feed_dict = your_feed_dict)

这样,size1_fetched就像你从NumPy得到的东西。此外,还给出了特定feed_dict的大小。例如,你的[无,200,200] Tensor将是[64,200,200]

另一个问题:为什么在流程图之间有占位符?您以后会提供预定义的图像特征映射吗?