TensorFlow:“NotImplementedError:当子类化`Model` 类时,你应该实现一个`call` 方法”

如何解决TensorFlow:“NotImplementedError:当子类化`Model` 类时,你应该实现一个`call` 方法”

在“PWCDCNet.py”中,我定义了以下人工神经网络:

class Conv2D(tfk.layers.Layer):
    def __init__(self,filters,kernel_size,strides,name=None,padding=1,dilation_rate=1):
    super(Conv2D,self).__init__(name=name)
    
    self.conv_out = tfk.layers.Conv2D(filters=filters,kernel_size=kernel_size,strides=strides,padding='same',kernel_initializer='he_normal',dilation_rate=dilation_rate,activation=tfk.layers.LeakyReLU(0.1))

    def call(self,inputs):
        return self.conv_out(inputs)

class DeConv2D(tfk.layers.Layer):
    def __init__(self,kernel_size=4,strides=2,name=None):
        super(DeConv2D,self).__init__(name=name)
    
    self.deconv_out = tfk.layers.Conv2DTranspose(filters=filters,name=name)

    def call(self,inputs):
        return self.deconv_out(inputs)


def CostVolumn(c1,warp,search_range,name='cost_volumn'):

    padded_lvl = tf.pad(warp,[[0,0],[search_range,search_range],[0,0]])
    _,h,w,_ = tf.unstack(tf.shape(c1))
    max_offset = search_range * 2 + 1

    cost_vol = []
    for y in range(0,max_offset):
        for x in range(0,max_offset):
            slice = tf.slice(padded_lvl,y,x,[-1,-1])
            cost = tf.reduce_mean(c1 * slice,axis=3,keepdims=True)
            cost_vol.append(cost)
    cost_vol = tf.concat(cost_vol,axis=3)
    cost_vol = tf.nn.leaky_relu(cost_vol,alpha=0.1,name=name)

    return cost_vol

class PredictFlow(tfk.layers.Layer):
    def __init__(self,name=None):
        super(PredictFlow,self).__init__()

        self.conv_out = tfk.layers.Conv2D(filters=2,kernel_size=3,strides=1,name=name,padding='same')

    def call(self,inputs):
        return self.conv_out(inputs)

class PWCDCNet(tf.keras.Model):
    def __init__(self,max_displacement=4):
        super(PWCDCNet,self).__init__()

        self.conv1a  = Conv2D( 16,name='conv1a')
        self.conv1aa = Conv2D( 16,name='conv1aa')
        self.conv1b  = Conv2D( 16,name='conv1b')
        self.conv2a  = Conv2D( 32,name='conv2a')
        self.conv2aa = Conv2D( 32,name='conv2aa')
        self.conv2b  = Conv2D( 32,name='conv2b')
        self.conv3a  = Conv2D( 64,name='conv3a')
        self.conv3aa = Conv2D( 64,name='conv3aa')
        self.conv3b  = Conv2D( 64,name='conv3b')
        self.conv4a  = Conv2D( 96,name='conv4a')
        self.conv4aa = Conv2D( 96,name='conv4aa')
        self.conv4b  = Conv2D( 96,name='conv4b')
        self.conv5a  = Conv2D(128,name='conv5a')
        self.conv5aa = Conv2D(128,name='conv5aa')
        self.conv5b  = Conv2D(128,name='conv5b')
        self.conv6aa = Conv2D(196,name='conv6aa')
        self.conv6a  = Conv2D(196,name='conv6a')
        self.conv6b  = Conv2D(196,name='conv6b')

        self.LeakyReLU = tfk.layers.LeakyReLU(0.1,name='LeakyReLU')

        self.conv6_0 = Conv2D(128,name='conv6_0')
        self.conv6_1 = Conv2D(128,name='conv6_1')
        self.conv6_2 = Conv2D(96,name='conv6_2')
        self.conv6_3 = Conv2D(64,name='conv6_3')
        self.conv6_4 = Conv2D(32,name='conv6_4')
        self.deconv6 = DeConv2D(2,name='deconv_6')
        self.upfeat6 = DeConv2D(2,name='upfeat_6')

        self.conv5_0 = Conv2D(128,name='conv5_0')
        self.conv5_1 = Conv2D(128,name='conv5_1')
        self.conv5_2 = Conv2D(96,name='conv5_2')
        self.conv5_3 = Conv2D(64,name='conv5_3')
        self.conv5_4 = Conv2D(32,name='conv5_4')
        self.deconv5 = DeConv2D(2,name='deconv_5')
        self.upfeat5 = DeConv2D(2,name='upfeat_5')

        self.conv4_0 = Conv2D(128,name='conv4_0')
        self.conv4_1 = Conv2D(128,name='conv4_1')
        self.conv4_2 = Conv2D(96,name='conv4_2')
        self.conv4_3 = Conv2D(64,name='conv4_3')
        self.conv4_4 = Conv2D(32,name='conv4_4')
        self.deconv4 = DeConv2D(2,name='deconv4')
        self.upfeat4 = DeConv2D(2,name='upfeat4')

        self.conv3_0 = Conv2D(128,name='conv3_0')
        self.conv3_1 = Conv2D(128,name='conv3_1')
        self.conv3_2 = Conv2D(96,name='conv3_2')
        self.conv3_3 = Conv2D(64,name='conv3_3')
        self.conv3_4 = Conv2D(32,name='conv3_4')
        self.deconv3 = DeConv2D(2,name='deconv3')
        self.upfeat3 = DeConv2D(2,name='upfeat3')

        self.conv2_0 = Conv2D(128,name='conv2_0')
        self.conv2_1 = Conv2D(128,name='conv2_1')
        self.conv2_2 = Conv2D(96,name='conv2_2')
        self.conv2_3 = Conv2D(64,name='conv2_3')
        self.conv2_4 = Conv2D(32,name='conv2_4')
        self.deconv2 = DeConv2D(2,name='deconv2')

        self.dc_conv1 = Conv2D(128,dilation_rate=1,name='dc_conv1')
        self.dc_conv2 = Conv2D(128,padding=2,dilation_rate=2,name='dc_conv2')
        self.dc_conv3 = Conv2D(128,padding=4,dilation_rate=4,name='dc_conv3')
        self.dc_conv4 = Conv2D(96,padding=8,dilation_rate=8,name='dc_conv4')
        self.dc_conv5 = Conv2D(64,padding=16,dilation_rate=16,name='dc_conv5')
        self.dc_conv6 = Conv2D(32,name='dc_conv6')

        self.predict_flow6 = PredictFlow(name='predict_flow6')
        self.predict_flow5 = PredictFlow(name='predict_flow5')
        self.predict_flow4 = PredictFlow(name='predict_flow4')
        self.predict_flow3 = PredictFlow(name='predict_flow3')
        self.predict_flow2 = PredictFlow(name='predict_flow2')
        self.dc_conv7 = PredictFlow(name='dc_conv7')

    def call(self,inputs):
        im1 = inputs[:,:,:3]
        im2 = inputs[:,3:]
        c11 = self.conv1b(self.conv1aa(self.conv1a(im1)))
        c21 = self.conv1b(self.conv1aa(self.conv1a(im2)))
        c12 = self.conv2b(self.conv2aa(self.conv2a(c11)))
        c22 = self.conv2b(self.conv2aa(self.conv2a(c21)))
        c13 = self.conv3b(self.conv3aa(self.conv3a(c12)))
        c23 = self.conv3b(self.conv3aa(self.conv3a(c22)))
        c14 = self.conv4b(self.conv4aa(self.conv4a(c13)))
        c24 = self.conv4b(self.conv4aa(self.conv4a(c23)))
        c15 = self.conv5b(self.conv5aa(self.conv5a(c14)))
        c25 = self.conv5b(self.conv5aa(self.conv5a(c24)))
        c16 = self.conv6b(self.conv6a(self.conv6aa(c15)))
        c26 = self.conv6b(self.conv6a(self.conv6aa(c25)))

        ### 6th flow    
        corr6 = CostVolumn(c1=c16,warp=c26,search_range=4)
        x = tf.concat([self.conv6_0(corr6),corr6],3)
        x = tf.concat([self.conv6_1(x),x],3)
        x = tf.concat([self.conv6_2(x),3)
        x = tf.concat([self.conv6_3(x),3)
        x = tf.concat([self.conv6_4(x),3)
    
        flow6 = self.predict_flow6(x)
        up_flow6 = self.deconv6(flow6)
        up_feat6 = self.upfeat6(x)    

        ### 5th flow
        warp5 = bilinear_warp(c25,up_flow6*0.625)
        corr5 = CostVolumn(c1=c15,warp=warp5,search_range=4)

        x = tf.concat([corr5,c15,up_flow6,up_feat6],3)
        x = tf.concat([self.conv5_0(x),3)
        x = tf.concat([self.conv5_1(x),3)
        x = tf.concat([self.conv5_2(x),3)
        x = tf.concat([self.conv5_3(x),3)
        x = tf.concat([self.conv5_4(x),3)
        flow5 = self.predict_flow5(x)
        up_flow5 = self.deconv5(flow5)
        up_feat5 = self.upfeat5(x)

        ### 4th flow
        warp4 = bilinear_warp(c24,up_flow5*1.25)
        corr4 = CostVolumn(c1=c14,warp=warp4,search_range=4)

        x = tf.concat([corr4,c14,up_flow5,up_feat5],3)
        x = tf.concat([self.conv4_0(x),3)
        x = tf.concat([self.conv4_1(x),3)
        x = tf.concat([self.conv4_2(x),3)
        x = tf.concat([self.conv4_3(x),3)
        x = tf.concat([self.conv4_4(x),3)
        flow4 = self.predict_flow4(x)
        up_flow4 = self.deconv4(flow4)
        up_feat4 = self.upfeat4(x)

        ### 3rd flow
        warp3 = bilinear_warp(c23,up_flow4*2.5)
        corr3 = CostVolumn(c1=c13,warp=warp3,search_range=4)
    
        x = tf.concat([corr3,c13,up_flow4,up_feat4],3)
        x = tf.concat([self.conv3_0(x),3)
        x = tf.concat([self.conv3_1(x),3)
        x = tf.concat([self.conv3_2(x),3)
        x = tf.concat([self.conv3_3(x),3)
        x = tf.concat([self.conv3_4(x),3)
        flow3 = self.predict_flow3(x)
        up_flow3 = self.deconv3(flow3)
        up_feat3 = self.upfeat3(x)

        # 2nd flow
        warp2 = bilinear_warp(c22,up_flow3*5.0) 
        corr2 = CostVolumn(c1=c12,warp=warp2,search_range=4)

        x = tf.concat([corr2,c12,up_flow3,up_feat3],3)
        x = tf.concat([self.conv2_0(x),3)
        x = tf.concat([self.conv2_1(x),3)
        x = tf.concat([self.conv2_2(x),3)
        x = tf.concat([self.conv2_3(x),3)
        x = tf.concat([self.conv2_4(x),3)
        flow2 = self.predict_flow2(x)

        x = self.dc_conv4(self.dc_conv3(self.dc_conv2(self.dc_conv1(x))))
        flow2 = flow2 + self.dc_conv7(self.dc_conv6(self.dc_conv5(x)))

        return flow2

这个 ANN 被导入到另一个文件中:

from PWCNet_tf2.PWCDCNet import PWCDCNet
PWC_model = tf.keras.Model(PWCDCNet())
checkpoint = tf.train.Checkpoint(PWC_model)
save_path = checkpoint.save('/some_directories/PWCNet_tf2/checkpoints/0001/tf_ckpt')
checkpoint.restore(save_path)

但如果我尝试:

output =  PWC_model(input)

我收到错误:

NotImplementedError: When subclassing the `Model` class,you should implement a `call` method.

我想知道,因为每个层都实现了调用方法,而且整个 ANN 也实现了调用方法。是我导入模型的方式导致的错误吗?

先谢谢大家!

解决方法

错误是我调用的:

PWC_model = tf.keras.Model(PWCDCNet())

代替:

PWC_model = PWCDCNet()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res