基于TensorfFlow中占位符的动态形状和层数

时间:2017-02-24 09:45:55

标签: tensorflow

是否可以根据占位符创建形状?

我有2个用例:

size = tf.placeholder(tf.int32, name="size")
x = tf.placeholder(tf.float32, [None, size], name="x")

shapes = tf.placeholder(tf.int32, [None], name="shapes")
tf.contrib.layers.fully_connected(
    inputs=x, 
    num_outputs=shapes[-1]
)

第一个我想我可以用[None, None]“修复”(在这种情况下不确定性能惩罚)。

对于第二个我不知道?

原因:我想使用Python构建和导出Graph,然后使用Java API读取它以进行训练/预测。我不想为每个隐藏的图层组合准备一个文件,因此我只想导出一个“模板”图形,如下所示:

def fc(x, shape):
    return tf.contrib.layers.fully_connected(inputs=x, num_outputs=shape[-1])

def body(x, hidden_layers, i):
    # create a FC layer with shape=[hidden_layer[i], hidden_layer[i+1]]
    out = fc(x, [tf.slice(hidden_layers, [i], [1]), tf.slice(hidden_layers, [i+1], [1])])
    out = tf.tanh(out)

    return out, hidden_layers, i + 1

def condition(x, hidden_layers, i):
    return i < (len(hidden_layers) - 1)

# i.e. [200,200] or [50,50,50] etc.
hidden_layers = tf.placeholder(tf.int32, [None], "hidden_layers")   
# loop counter
i = tf.constant(0, dtype='int32')    
# loop creating the network
out = tf.while_loop(condition, body, [x, hidden_layers, i])

然后Java用户只需feed一个隐藏网络配置的数组。但是在尝试生成图表时,我得到ValueError: ('num_outputs should be int or long, got %s.', <tf.Tensor 'while/fc/Slice_1:0' shape=(1,) dtype=int32>)

1 个答案:

答案 0 :(得分:0)

不幸的是,我不认为你想要什么是可能的。动态数量的隐藏层会发生什么?随机产生额外(未经训练)的层不是神经网络常见的东西。

也许澄清你的问题会奏效。例如:假设你想要有两个或三个隐藏层,有一些可能性。你可以有两组不同的权重,从第二层到第十层,或从第二层到第三层到第十层。如果你想要这样的东西,请在这个页面上检查tf.cond:https://www.tensorflow.org/api_guides/python/control_flow_ops

祝你好运!