Keras-K.eval()的逆

Keras-K.eval()的逆,keras,keras-layer,Keras,Keras Layer,我正在尝试编写一个lambda层,它将输入张量转换为numpy数组,并在所述数组的切片上执行一组仿射变换。为了得到张量的基本numpy数组,我调用K.eval()。一旦我完成了对numpy数组的所有处理,我需要将它转换回keras张量,这样就可以返回它。keras后端是否有我可以使用的操作?或者我应该使用不同的后端函数更新原始输入张量吗 def apply_affine(x, y): # Get dimensions of main tensor dimens = K.int_s

我正在尝试编写一个lambda层,它将输入张量转换为numpy数组,并在所述数组的切片上执行一组仿射变换。为了得到张量的基本numpy数组,我调用K.eval()。一旦我完成了对numpy数组的所有处理,我需要将它转换回keras张量,这样就可以返回它。keras后端是否有我可以使用的操作?或者我应该使用不同的后端函数更新原始输入张量吗

def apply_affine(x, y):
    # Get dimensions of main tensor
    dimens = K.int_shape(x)
    # Get numpy array behind main tensor
    filter_arr = K.eval(x)
    if dimens[0] is not None:
        # Go through batch...
        for i in range(0, dimens[0]):
            # Get the correpsonding affine transformation in the form of a numpy array
            affine = K.eval(y)[i, :, :]
            # Create an skimage affine transform from the numpy array
            transform = AffineTransform(matrix=affine)
            # Loop through each filter output from the previous layer of the CNN
            for j in range(0, dims[1]):
                # Warp each filter output according to the corresponding affine transform
                warp(filter_arr[i, j, :, :], transform)
    # Need to convert filter array back to a keras tensor HERE before return
    return None

transformed_twin = Lambda(function=lambda x: apply_affine(x[0], x[1]))([twin1, transformInput])
编辑:添加了一些上下文

仿射变换:

扭曲:

我试图在“通过因子化空间嵌入的对象地标无监督学习”中重新实现CNN
filter\u arr
是包含10个滤波器的卷积层的输出。我想对所有过滤器输出应用相同的仿射变换。每个数据输入都有一个仿射变换。每个数据输入的仿射变换作为张量传递到神经网络,并作为第二个输入传递到lambda层
transformInput
。我在下面留下了我当前网络的结构

twin = Sequential()
twin.add(Conv2D(20, (3, 3), activation=None, input_shape=(28, 28, 1)))

# print(twin.output_shape)
# twin.add(BatchNormalization(axis=1, momentum=0.99, epsilon=0.001, center=True))
twin.add(Activation('relu'))
twin.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'))
# print(twin.output_shape)

twin.add(Conv2D(48, (3, 3), activation=None))

# print(twin.output_shape)
twin.add(BatchNormalization(axis=1, momentum=0.99, epsilon=0.001, center=True))
twin.add(Activation('relu'))

twin.add(Conv2D(64, (3, 3), activation=None))
twin.add(BatchNormalization(axis=1, momentum=0.99, epsilon=0.001, center=True))
twin.add(Activation('relu'))
# print(twin.output_shape)

twin.add(Conv2D(80, (3, 3), activation=None))
twin.add(BatchNormalization(axis=1, momentum=0.99, epsilon=0.001, center=True))
twin.add(Activation('relu'))
# print(twin.output_shape)

twin.add(Conv2D(256, (3, 3), activation=None))
twin.add(BatchNormalization(axis=1, momentum=0.99, epsilon=0.001, center=True))
twin.add(Activation('relu'))
# print(twin.output_shape)

twin.add(Conv2D(no_filters, (3, 3), activation=None))
twin.add(BatchNormalization(axis=1, momentum=0.99, epsilon=0.001, center=True))
twin.add(Activation('relu'))
# print(twin.output_shape)


# Reshape the image outputs to a 1D list so softmax can be used on them
finalDims = twin.layers[-1].output_shape

twin.add(Reshape((finalDims[1], finalDims[2]*finalDims[3])))
twin.add(Activation('softmax'))
twin.add(Reshape(finalDims[1:]))

originalInput = Input(shape=(28, 28, 1))
warpedInput = Input(shape=(28, 28, 1))
transformInput = Input(shape=(3, 3))

twin1 = twin(originalInput)


def apply_affine(x, y):
    # Get dimensions of main tensor
    dimens = K.int_shape(x)
    # Get numpy array behind main tensor
    filter_arr = K.eval(x)
    if dimens[0] is not None:
        # Go through batch...
        for i in range(0, dimens[0]):
            # Get the correpsonding affine transformation in the form of a numpy array
            affine = K.eval(y)[i, :, :]
            # Create an skimage affine transform from the numpy array
            transform = AffineTransform(matrix=affine)
            # Loop through each filter output from the previous layer of the CNN
            for j in range(0, dims[1]):
                # Warp each filter output according to the corresponding affine transform
                warp(filter_arr[i, j, :, :], transform)
    # Need to convert filter array back to a keras tensor
    return None

transformed_twin = Lambda(function=lambda x: apply_affine(x[0], x[1]))([twin1, transformInput])

twin2 = twin(warpedInput)


siamese = Model([originalInput, warpedInput, transformInput], [transformed_twin, twin2])
编辑:使用K.variable()时的回溯

回溯(最近一次呼叫最后一次):
文件“C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\client\session.py”,第1039行,在\u do\u调用中
返回fn(*args)
文件“C:\Users\nickb\Anaconda3\envs\py35\lib\site packages\tensorflow\python\client\session.py”,第1021行,在\u run\u fn中
状态,运行(元数据)
文件“C:\Users\nickb\Anaconda3\envs\py35\lib\contextlib.py”,第66行,在退出时__
下一个(self.gen)
文件“C:\Users\nickb\Anaconda3\envs\py35\lib\site packages\tensorflow\python\framework\errors\u impl.py”,第466行,处于raise\u exception\u on\u not\u ok\u状态
pywrap_tensorflow.TF_GetCode(状态))
tensorflow.python.framework.errors\u impl.InvalidArgumentError:必须为带有数据类型bool的占位符tensor“批处理规范化”1/keras\u学习阶段”提供一个值
[[Node:batch\u normalization\u 1/keras\u learning\u phase=占位符[dtype=DT\u BOOL,shape=[],[u device=“/job:localhost/replica:0/task:0/cpu:0”]()]
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
回溯(最近一次呼叫最后一次):
文件“C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\client\session.py”,第1039行,在\u do\u调用中
返回fn(*args)
文件“C:\Users\nickb\Anaconda3\envs\py35\lib\site packages\tensorflow\python\client\session.py”,第1021行,在\u run\u fn中
状态,运行(元数据)
文件“C:\Users\nickb\Anaconda3\envs\py35\lib\contextlib.py”,第66行,在退出时__
下一个(self.gen)
文件“C:\Users\nickb\Anaconda3\envs\py35\lib\site packages\tensorflow\python\framework\errors\u impl.py”,第466行,处于raise\u exception\u on\u not\u ok\u状态
pywrap_tensorflow.TF_GetCode(状态))
tensorflow.python.framework.errors\u impl.InvalidArgumentError:必须为带有数据类型bool的占位符tensor“批处理规范化”1/keras\u学习阶段”提供一个值
[[Node:batch\u normalization\u 1/keras\u learning\u phase=占位符[dtype=DT\u BOOL,shape=[],[u device=“/job:localhost/replica:0/task:0/cpu:0”]()]
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“C:/Users/nickb/PycharmProjects/testing/MNIST_implementation.py”,第96行,在
已转换的_twin=Lambda(函数=Lambda x:apply_仿射(x[0],x[1])([twin1,transformInput])
文件“C:\Users\nickb\Anaconda3\envs\py35\lib\site packages\keras\engine\topology.py”,第585行,在调用中__
输出=自调用(输入,**kwargs)
调用中的第659行文件“C:\Users\nickb\Anaconda3\envs\py35\lib\site packages\keras\layers\core.py”
返回self.function(输入,**参数)
文件“C:/Users/nickb/PycharmProjects/testing/MNIST_implementation.py”,第96行,在
已转换的_twin=Lambda(函数=Lambda x:apply_仿射(x[0],x[1])([twin1,transformInput])
文件“C:/Users/nickb/PycharmProjects/testing/MNIST_implementation.py”,第81行,应用仿射
过滤器arr=K.eval(x)
文件“C:\Users\nickb\Anaconda3\envs\py35\lib\site packages\keras\backend\tensorflow\u backend.py”,第533行,评估中
返回到_dense(x).eval(session=get_session())
文件“C:\Users\nickb\Anaconda3\envs\py35\lib\site packages\tensorflow\python\framework\ops.py”,第569行,在eval中
使用默认会话返回评估会话(self、feed、dict、self.graph、session)
文件“C:\Users\nickb\Anaconda3\envs\py35\lib\site packages\tensorflow\python\framework\ops.py”,第3741行,使用默认会话进行评估
返回会话。运行(张量、提要)
文件“C:\Users\nickb\Anaconda3\envs\py35\lib\site packages\tensorflow\python\client\session.py”,第778行,正在运行
运行_元数据_ptr)
文件“C:\Users\nickb\Anaconda3\envs\py35\lib\site packages\tensorflow\python\client\session.py”,第982行,正在运行
提要(dict字符串、选项、运行元数据)
文件“C:\Users\nickb\Anaconda3\envs\py35\lib\site packages\tensorflow\python\client\session.py”,第1032行,在运行中
目标\u列表、选项、运行\u元数据)
文件“C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\client\session.py”,第1052行,在调用中
提升类型(e)(节点定义、操作、消息)
tensorflow.python.framework.errors\u impl.InvalidArgumentError:必须为带有数据类型bool的占位符tensor“批处理规范化”1/keras\u学习阶段”提供一个值
[[Node:batch\u normalization\u 1/keras\u learning\u phase=占位符[dtype=DT\u BOOL,shape=[],[u device=“/job:localhost/replica:0/task:0/cpu:0”]()]
由op“批量标准化阶段/keras学习阶段”引起,定义为:
文件“C:/Users/nickb/PycharmProjects/testing/MNIST_implementation.py”,第36行,在
twin.add(批次归一化(轴=1,动量=0.99,ε=0.001,中心=True))
文件“C:\Users\nickb\Anaconda3\envs\py35\lib\site packages\keras\models.py”,第466行,添加
输出张量=层(自输出[0])
文件“C:\Users\nic”
Traceback (most recent call last):
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\client\session.py", line 1039, in _do_call
    return fn(*args)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\client\session.py", line 1021, in _run_fn
    status, run_metadata)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\contextlib.py", line 66, in __exit__
    next(self.gen)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\framework\errors_impl.py", line 466, in raise_exception_on_not_ok_status
    pywrap_tensorflow.TF_GetCode(status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'batch_normalization_1/keras_learning_phase' with dtype bool
     [[Node: batch_normalization_1/keras_learning_phase = Placeholder[dtype=DT_BOOL, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

 Traceback (most recent call last):
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\client\session.py", line 1039, in _do_call
    return fn(*args)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\client\session.py", line 1021, in _run_fn
    status, run_metadata)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\contextlib.py", line 66, in __exit__
    next(self.gen)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\framework\errors_impl.py", line 466, in raise_exception_on_not_ok_status
    pywrap_tensorflow.TF_GetCode(status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'batch_normalization_1/keras_learning_phase' with dtype bool
     [[Node: batch_normalization_1/keras_learning_phase = Placeholder[dtype=DT_BOOL, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/nickb/PycharmProjects/testing/MNIST_implementation.py", line 96, in <module>
    transformed_twin = Lambda(function=lambda x: apply_affine(x[0], x[1]))([twin1, transformInput])
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\keras\engine\topology.py", line 585, in __call__
    output = self.call(inputs, **kwargs)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\keras\layers\core.py", line 659, in call
    return self.function(inputs, **arguments)
  File "C:/Users/nickb/PycharmProjects/testing/MNIST_implementation.py", line 96, in <lambda>
    transformed_twin = Lambda(function=lambda x: apply_affine(x[0], x[1]))([twin1, transformInput])
  File "C:/Users/nickb/PycharmProjects/testing/MNIST_implementation.py", line 81, in apply_affine
    filter_arr = K.eval(x)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\keras\backend\tensorflow_backend.py", line 533, in eval
    return to_dense(x).eval(session=get_session())
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\framework\ops.py", line 569, in eval
    return _eval_using_default_session(self, feed_dict, self.graph, session)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\framework\ops.py", line 3741, in _eval_using_default_session
    return session.run(tensors, feed_dict)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\client\session.py", line 778, in run
    run_metadata_ptr)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\client\session.py", line 982, in _run
    feed_dict_string, options, run_metadata)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\client\session.py", line 1032, in _do_run
    target_list, options, run_metadata)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\client\session.py", line 1052, in _do_call
    raise type(e)(node_def, op, message)
tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'batch_normalization_1/keras_learning_phase' with dtype bool
     [[Node: batch_normalization_1/keras_learning_phase = Placeholder[dtype=DT_BOOL, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

Caused by op 'batch_normalization_1/keras_learning_phase', defined at:
  File "C:/Users/nickb/PycharmProjects/testing/MNIST_implementation.py", line 36, in <module>
    twin.add(BatchNormalization(axis=1, momentum=0.99, epsilon=0.001, center=True))
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\keras\models.py", line 466, in add
    output_tensor = layer(self.outputs[0])
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\keras\engine\topology.py", line 585, in __call__
    output = self.call(inputs, **kwargs)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\keras\layers\normalization.py", line 190, in call
    training=training)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\keras\backend\tensorflow_backend.py", line 2559, in in_train_phase
    training = learning_phase()
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\keras\backend\tensorflow_backend.py", line 112, in learning_phase
    name='keras_learning_phase')
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\ops\array_ops.py", line 1507, in placeholder
    name=name)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\ops\gen_array_ops.py", line 1997, in _placeholder
    name=name)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 768, in apply_op
    op_def=op_def)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\framework\ops.py", line 2336, in create_op
    original_op=self._default_original_op, op_def=op_def)
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\framework\ops.py", line 1228, in __init__
    self._traceback = _extract_stack()

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'batch_normalization_1/keras_learning_phase' with dtype bool
     [[Node: batch_normalization_1/keras_learning_phase = Placeholder[dtype=DT_BOOL, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

Exception ignored in: <bound method BaseSession.__del__ of <tensorflow.python.client.session.Session object at 0x0000023AB66D9C88>>
Traceback (most recent call last):
  File "C:\Users\nickb\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\client\session.py", line 587, in __del__
AttributeError: 'NoneType' object has no attribute 'TF_NewStatus'

Process finished with exit code 1
def apply_affine(x):
       import tensorflow as tf
       return tf.contrib.image.transform(x[0], x[1])

def apply_affine_output_shape(input_shapes):
       return input_shapes[0]