所以我试图在Keras(Tensorflow后端)中使用Lambda图层实现自定义函数。
我想将输入Tensor转换为numpy数组来执行我的功能。但是,我无法运行tensor.eval(),因为它会抛出错误:
InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'input_1' with dtype float and shape [?,960,960,1]
这是我的代码:
def tensor2np(tensor):
return tensor.eval(session=K.get_session())
def np2tensor(np):
return tf.convert_to_tensor(np.reshape((1,480,480,3)))
def calculate_dwt1(tensor):
np_input = tensor2np(tensor)
coeff = pywt.wavedec2((np_input[0,:,:,0]), 'db1', level=1)
return np2tensor(np.dstack((coeff[1][0],coeff[1][1],coeff[1][2])))
def network():
input = Input(shape=(960,960,1), dtype='float32')
conv1 = Convolution2D(64, (3,3), activation='relu', padding='same')(input)
conv1 = Convolution2D(64, (3,3), activation='relu', padding='same')(conv1)
pool1 = MaxPooling2D((2,2), strides=(2,2))(conv1)
conv2 = Convolution2D(128, (3, 3), activation='relu', padding='same')(pool1)
conv2 = Convolution2D(128, (3, 3), activation='relu', padding='same')(conv2)
lambda1 = Lambda(calculate_dwt1)(input)
me = merge((lambda1, conv2),mode='concat', concat_axis=3)
..
..
或者无论如何我可以在运行时获得自定义函数的结果并转换为Tensor并将其提供给我的网络?
答案 0 :(得分:2)
实际上,您要求您的网络通过a)数组 - >反向传播。张量变换和b)在数组上运行的黑盒函数。显然,它无法做到这一点并不奇怪。您需要使用标准(或自定义)TF / K操作重写自定义函数,并将其应用于张量对象。然后,只有这样它才能向后传播渐变并向前传播值。
答案 1 :(得分:0)
如果要将纯python函数用作TensorFlow操作,可以使用tf.py_func。
在您的情况下,您需要使用自定义python函数作为损失函数而不是内置操作。 TensorFlow的内置操作在执行之前是符号和编译的。然后,TensorFlow通过使用其渐变来优化给定的成本函数。由于您的自定义丢失函数的渐变未知,因此TensorFlow无法优化您的自定义丢失函数。
您有两种选择。您可以以更具象征性的方式定义自定义函数,以便利用TF的自动区分,或者您需要在外部提供纯python函数的渐变,如this。