Lambda层中的自定义函数失败,无法将张量转换为numpy

时间:2018-03-30 06:31:58

标签: python tensorflow machine-learning neural-network keras

所以我试图在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并将其提供给我的网络?

基本上,我正在尝试实施此模型架构。 Model Architecture

2 个答案:

答案 0 :(得分:2)

实际上,您要求您的网络通过a)数组 - >反向传播。张量变换和b)在数组上运行的黑盒函数。显然,它无法做到这一点并不奇怪。您需要使用标准(或自定义)TF / K操作重写自定义函数,并将其应用于张量对象。然后,只有这样它才能向后传播渐变并向前传播值。

答案 1 :(得分:0)

如果要将纯python函数用作TensorFlow操作,可以使用tf.py_func

在您的情况下,您需要使用自定义python函数作为损失函数而不是内置操作。 TensorFlow的内置操作在执行之前是符号和编译的。然后,TensorFlow通过使用其渐变来优化给定的成本函数。由于您的自定义丢失函数的渐变未知,因此TensorFlow无法优化您的自定义丢失函数。

您有两种选择。您可以以更具象征性的方式定义自定义函数,以便利用TF的自动区分,或者您需要在外部提供纯python函数的渐变,如this