我想对神经元的各个输入应用非线性并对结果求和,而不是对各个输入求和并应用非线性。我目前的实施很慢。
我有一个大小为D的输入层,批量大小为B.下一层是N
个神经元宽,所以权重矩阵为W = D x N
。调用我的非线性f
。
在符号中,对于神经元n,我想要f(w_{1n}x_1) + ... + f(w_{Dn}x_D)
而不是像往常一样f(w_{1n}x_1 + ... + w_{Dn}x_D)
。
我对这个过程的矢量化很慢。目前,它利用广播,我想知道是否有更快的方式来获得我想要的东西。
train = tf.placeholder(tf.float32, shape=(B, D, 1))
w1 = tf.Variable(tf.truncated_normal([D, N]))
b1 = tf.Variable(tf.zeros([N]))
h1 = tf.reduce_sum(tf.nn.relu(tf.mul(train, w1)), 1) + b1
h1 = tf.reshape(h1, [B, N, 1])
然后我继续将其提供给下一层。这样做几次很慢。我想知道是否有某种方法可以让我更有效率或以不同方式计算。
答案 0 :(得分:1)
(只是为了理智检查我们在同一页面上:一种重述你要求的方法是能够将函数f(x)应用于矩阵中的每个标量元素*元素乘积,之前将这些产品相加以产生最终输出值。)
不满意 - 也许有人可以证明我错了 - 答案是我认为如果不编写内核来实现它,这是最好的。核心挑战是没有自定义内核(或实现块分解矩阵乘以原始操作,听起来不愉快),我想不出一种方法来获得快速进行此操作所需的缓存局部性。