我正在尝试在Keras中实现全卷积神经网络,这要求该网络接受任意空间维度的输入。在某一时刻,我需要将两个不同层的输出加在一起,但是我不能,因为大多数时候输出具有不同的空间尺寸。所以我想做的是在添加输出之前裁剪输出以使其具有相同的大小,但是要知道裁剪多少,我需要知道空间尺寸之间的差异以作为参数传递给Cropping2D,我不知道如何获得,因为尺寸是动态的。我该怎么办?
这是我尝试裁剪图层的方式,但是由于Tensorflow告诉我无法比较两个张量,所以我陷入了困境:
vector()
这是我网络中的相关部分(o和o2是前两个keras层的输出):
from keras.models import Model
from keras.layers import Conv2D, MaxPooling2D, Conv2DTranspose
from keras.layers import Lambda, Add, Input, Dropout, Activation
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import CSVLogger, ModelCheckpoint
import os
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
from keras import backend as K
def crop(layers):
o1, o2 = layers
output_height1, output_width1 = K.shape(o1)[1], K.shape(o2)[2]
output_height2, output_width2 = K.shape(o2)[1], K.shape(o2)[2]
cx = abs( output_width1 - output_width2 )
cy = abs( output_height2 - output_height1 )
if output_width1 > output_width2:
o1 = Cropping2D( cropping=((0,0) , ( 0 , cx )))(o1)
else:
o2 = Cropping2D( cropping=((0,0) , ( 0 , cx )))(o2)
if output_height1 > output_height2 :
o1 = Cropping2D( cropping=((0,cy) , ( 0 , 0 )))(o1)
else:
o2 = Cropping2D( cropping=((0, cy ) , ( 0 , 0 )))(o2)
return o1 , o2