在 Theano TensorVariable 上应用元素条件函数


如果

可能的话,最简单的事情可能是发布我尝试直接在 Theano 中执行的 numpy 代码:

tensor = shared(np.random.randn(7, 16, 16)).eval()
tensor2 = tensor[0,:,:].eval()
tensor2[tensor2 < 1] = 0.0
tensor2[tensor2 > 0] = 1.0
new_tensor = [tensor2]
for i in range(1, tensor.shape[0]):
    new_tensor.append(np.multiply(tensor2, tensor[i,:,:].eval()))
output = np.array(new_tensor).reshape(7,16,16)

如果不是很明显,我试图做的是使用由 7 个不同矩阵组成的张量的一个矩阵的值,并将其应用于张量中的其他矩阵。

实际上,我正在解决的问题是在 Keras 中为完全卷积网络的目标函数中执行条件语句。基本上,某些特征图值的损失的计算(并随后加权)将与其他特征图不同,具体取决于其中一个特征图中的某些值。

您可以使用switch语句轻松实现条件。

这将是等效代码:

import theano
from theano import tensor as T
import numpy as np

def _check_new(var):
    shape =  var.shape[0]
    t_1, t_2 = T.split(var, [1, shape-1], 2, axis=0)
    ones = T.ones_like(t_1)
    cond = T.gt(t_1, ones)
    mask = T.repeat(cond, t_2.shape[0], axis=0)
    out  = T.switch(mask, t_2, T.zeros_like(t_2))
    output = T.join(0, cond, out)
    return output
def _check_old(var):
    tensor = var.eval()
    tensor2 = tensor[0,:,:]
    tensor2[tensor2 < 1] = 0.0
    tensor2[tensor2 > 0] = 1.0
    new_tensor = [tensor2]
    for i in range(1, tensor.shape[0]):
        new_tensor.append(np.multiply(tensor2, tensor[i,:,:]))
    output = theano.shared(np.array(new_tensor).reshape(7,16,16))
    return output

tensor = theano.shared(np.random.randn(7, 16, 16))
out1 =  _check_new(tensor).eval() 
out2 =  _check_old(tensor).eval()
print out1
print '----------------'
print ((out1-out2) ** 2).mean()

注意:由于您在第一个过滤器上屏蔽了,我需要使用splitjoin操作。

相关内容

  • 没有找到相关文章

最新更新