Python 将代码从Keras 1转换为Keras 2:TypeError:uu调用uuu()缺少1个必需的位置参数:';形状';

Python 将代码从Keras 1转换为Keras 2:TypeError:uu调用uuu()缺少1个必需的位置参数:';形状';,python,tensorflow,keras,keras-2,Python,Tensorflow,Keras,Keras 2,我正在尝试将在keras1中编写的V-net代码转换为keras2。我似乎对以下课程有意见: class Deconv3D(Layer): def __init__(self, nb_filter, kernel_dims, output_shape, strides): assert K.backend() == 'tensorflow' self.nb_filter = nb_filter self.kernel_dims = kern

我正在尝试将在keras1中编写的V-net代码转换为keras2。我似乎对以下课程有意见:

class Deconv3D(Layer):
    def __init__(self, nb_filter, kernel_dims, output_shape, strides):
        assert K.backend() == 'tensorflow'
        self.nb_filter = nb_filter
        self.kernel_dims = kernel_dims
        self.strides = (1,) + strides + (1,)
        self.output_shape_ = output_shape
        super(Deconv3D, self).__init__()

    def build(self, input_shape):
        assert len(input_shape) == 5
        self.input_shape_ = input_shape
        W_shape = self.kernel_dims + (self.nb_filter, input_shape[4], )
        self.W = self.add_weight(W_shape, initializer=functools.partial(initializers.glorot_uniform), name='{}_W'.format(self.name))
        self.b = self.add_weight((1,1,1,self.nb_filter,), initializer='zero', name='{}_b'.format(self.name))
        self.built = True

    def get_output_shape_for(self, input_shape):
        return (None, ) + self.output_shape_[1:]

    def call(self, x, mask=None):
        return tf.nn.conv3d_transpose(x, self.W, output_shape=self.output_shape_, strides=self.strides, padding='same', name=self.name) + self.b
当我尝试使用
Deconv3D(128,(2,2,2),(1,16,16,8,128),(2,2,2))()
调用它时,我得到了以下我不理解的错误:

Traceback (most recent call last):
File "V-net.py", line 118, in <module>
downsample_5 = Deconv3D(128, (2, 2, 2), (1, 16, 16, 8, 128), (2, 2, 2))(prelu_5_1) # Check the 8
File "/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/keras/engine/topology.py", line 569, in __call__
self.build(input_shapes[0])
File "V-net.py", line 35, in build
self.W = self.add_weight(W_shape, initializer=functools.partial(initializers.glorot_uniform), name='{}_W'.format(self.name))
File "/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/keras/legacy/interfaces.py", line 87, in wrapper
return func(*args, **kwargs)
File "/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/keras/engine/topology.py", line 391, in add_weight
weight = K.variable(initializer(shape), dtype=dtype, name=name)
File "/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py", line 321, in variable
v = tf.Variable(value, dtype=_convert_string_dtype(dtype), name=name)
File "/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tensorflow/python/ops/variables.py", line 200, in __init__
expected_shape=expected_shape)
File "/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tensorflow/python/ops/variables.py", line 278, in _init_from_args
initial_value(), name="initial_value", dtype=dtype)
TypeError: __call__() missing 1 required positional argument: 'shape'
回溯(最近一次呼叫最后一次):
文件“V-net.py”,第118行,在
下样本5=Deconv3D(128,(2,2,2),(1,16,16,8,128),(2,2,2))(预样本5,1)#检查8
文件“/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/keras/engine/topology.py”,第569行,在调用中__
自我构建(输入形状[0])
文件“V-net.py”,第35行,内部版本
self.W=self.add_-weight(W_-shape,initializer=functools.partial(initializers.glorot_-uniform),name='{}}W'.格式(self.name))
文件“/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/keras/legacy/interfaces.py”,第87行,在包装器中
返回函数(*args,**kwargs)
文件“/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/keras/engine/topology.py”,第391行,在add_-weight中
weight=K.variable(初始值设定项(形状),dtype=dtype,name=name)
文件“/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/keras/backend/tensorflow_backend.py”,第321行,在变量中
变量(值,数据类型=\u转换\u字符串\u数据类型(数据类型),名称=名称)
文件“/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/tensorflow/Python/ops/variables.py”,第200行,在__
预期形状=预期形状)
文件“/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/tensorflow/Python/ops/variables.py”,第278行,在参数的_init_中
初始值(),name=“初始值”,dtype=dtype)
TypeError:\调用\缺少1个必需的位置参数:“形状”

我做错了什么?

类Deconv3D必须与Keras 2架构相匹配

class Deconvolution3D(Layer):

    def __init__(self, nb_filter, kernel_dims, output_shape, subsample, **kwargs):
        self.nb_filter = nb_filter
        self.kernel_dims = kernel_dims
        self.strides = (1, ) + subsample + (1, )
        self.output_shape_ = output_shape
        assert K.backend() == 'tensorflow'
        super(Deconvolution3D, self).__init__(**kwargs)

    def build(self, input_shape):
        assert len(input_shape) == 5
        self.W = self.add_weight(shape=self.kernel_dims + (self.nb_filter, input_shape[4], ),
                             initializer='glorot_uniform',
                             name='{}_W'.format(self.name),
                             trainable=True)
        self.b = self.add_weight(shape=(1, 1, 1, self.nb_filter,), 
                             initializer='zero', 
                             name='{}_b'.format(self.name),
                             trainable=True)
        super(Deconvolution3D, self).build(input_shape) 

    def call(self, x, mask=None):
        return tf.nn.conv3d_transpose(x, self.W, output_shape=self.output_shape_,
                                  strides=self.strides, padding='SAME', name=self.name) + self.b

    def compute_output_shape(self, input_shape):
        return (input_shape[0], ) + self.output_shape_[1:]