如果有可能的话,最简单的方法就是发布我想直接在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的完全卷积网络的目标函数中进行条件语句。基本上,某些特征映射值的损失将根据其中一个特征映射中的某些值以不同于其他特征映射值的方式计算(并随后加权)。
答案 0 :(得分:1)
您可以使用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()
注意:由于您对第一个过滤器进行了屏蔽,因此我需要使用split
和join
操作。