【问题标题】:Tensorflow share weights across input placeholderTensorflow 在输入占位符之间共享权重
【发布时间】:2017-10-23 10:08:15
【问题描述】:

我正在尝试构建一个具有共享输入权重的神经网络。

给定pk 形式的X=[x_1, ..., x_p, v_1,...,v_p,z1,...,z_p,...] 输入和形状为(p, layer1_size) 的权重矩阵w,我希望将第一层定义为sum(w, x_.) + sum(w, v_.) + ...

换句话说,输入和第一层应该是完全连接的,其中权重在不同的输入组之间共享。 l = tf.matmul(X, W) 其中W 的每一行必须具有如下结构:(w1, ... ,wp, w1, ..., wp, ...)

我如何在张量流中做到这一点?

【问题讨论】:

    标签: python tensorflow neural-network


    【解决方案1】:

    一个简单的选择是复制W。如果原来的W 是,比如说p X q,你可以做l = tf.matmul(X, tf.tile(W, (k, 1)))

    【讨论】:

    • 我怀疑 Donbeo 正在寻找一种将 W 共享为 tf.Variable 的方法。如果你使用 tile,那么 W 会被复制,这意味着反向传播会以不同的方式优化 W 的每个实例。此处所需的解决方案只需要使用 W 的一个实例,该实例被优化为单个实体,即使它的影响分布在输入组中。
    • @AndrewMedlin 平铺一个变量的值不会产生它的多个实例。仍然只有一个变量,并且您多次使用它;在反向传播中,这些使用中的每一个都会有一个梯度,这有助于变量的总更新。 (请注意,我的建议是不要将W 替换为更大的变量k,这样会更类似于您所说的)
    • 我很抱歉,你是对的。为了澄清我的更正,tf.tile() 将多次使用 tiled 变量,但不会像 jdehesa 所说的那样多次使用。
    【解决方案2】:

    我认为tf.nn.conv1d 可以解决您的任务。看:tf.nn.conv1d documentation

    【讨论】:

    • 这是一个有效的解决方案,尽管它需要一些重塑和跨越k
    • 正确的使用方法是什么?如果输入是x_ = tf.placeholder(tf.float32, [None, p, k]) W 和 conv1d 参数应该如何定义?
    • X 在您的首要问题中具有形状[k * p],您可以通过tf.reshape 将其重塑为[None, k, p]p 是最后一个,因为X=[x_1, ..., x_p, v_1,...,v_p,z1,...,z_p,...])。您应该使用形状[k, p, layer1_size]stride=k 定义权重,并使用tf.nn.conv1d
    • 我不确定。 W 应该是从维度为p 的空间到维度为l1_size 的一个运算符。为什么k 也应该是 3 维的?
    • 我期待W.shape = (1, p, l1_size) 或类似的东西
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 2017-11-29
    • 1970-01-01
    • 2018-08-24
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多