Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有效地将函数应用于神经元输出,然后求和,而不是将函数应用于求和_Python_Numpy_Tensorflow - Fatal编程技术网

Python 有效地将函数应用于神经元输出,然后求和,而不是将函数应用于求和

Python 有效地将函数应用于神经元输出,然后求和,而不是将函数应用于求和,python,numpy,tensorflow,Python,Numpy,Tensorflow,我想对神经元的单个输入应用非线性,然后对结果求和,而不是对单个输入求和,然后应用非线性。我当前的实现速度很慢 我有一个大小为D的输入层,批量大小为B。下一层是N神经元宽度,因此权重矩阵W=dxn。调用我的非线性f 在符号中,对于神经元n,我想要f(w_{1n}x_1)+…+f(w{Dn}x{ud)而不是我们通常使用的f(w{1n}x{u1+…+w{Dn}x{D) 我对这个过程的矢量化很慢。目前,它利用广播,我想知道是否有一个更快的方式来获得我想要的 train = tf.placeholder(

我想对神经元的单个输入应用非线性,然后对结果求和,而不是对单个输入求和,然后应用非线性。我当前的实现速度很慢

我有一个大小为D的输入层,批量大小为B。下一层是
N
神经元宽度,因此权重矩阵
W=dxn
。调用我的非线性
f

在符号中,对于神经元n,我想要
f(w_{1n}x_1)+…+f(w{Dn}x{ud)
而不是我们通常使用的
f(w{1n}x{u1+…+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])
然后,我继续将其送入下一层。这样做几次很慢。我想知道是否有某种方法可以提高效率或以不同的方式进行计算。

(只是为了检查我们是否在同一页上:重新说明您要求的方法是能够应用函数f(x)将矩阵中的每个标量元素*元素乘积相乘,然后将这些乘积相加以生成最终输出值。)


一个不令人满意的答案——也许有人能证明我是错的——是我认为最好不用编写内核来实现它。核心挑战是,如果没有自定义内核(或者实现块分解矩阵乘以原始操作,这听起来很不舒服),我想不出一种方法来获取使此操作快速进行所需的缓存位置。

您编写的应该是快速的,虽然我不知道你到底想做什么,因为你失去了所有的中间状态,只是把N个拷贝的和传播到下一层。你能详细说明一下“速度慢”吗?CPU或GPU?对于玩具3层NN,使用ReLU向前传递1000次是10秒(CPU)。对于此设置,只要不出现内存问题,则需要5分钟。N个副本不向前传递——BxNx1张量中的每个值都可能不同。我打算对中间值应用不同的非线性,但我选择了一个ReLU作为帖子,因为它不会分散我的注意力。啊,我明白你现在在做什么了-对不起,慢脑筋一天。现在正在研究一个真正的答案。