当前位置: 代码迷 >> 综合 >> tensorflow-deeplab-resnet-master之npy2ckpt.py【.npy如何转.ckpt】
  详细解决方案

tensorflow-deeplab-resnet-master之npy2ckpt.py【.npy如何转.ckpt】

热度:74   发布时间:2023-12-14 20:46:47.0

tensorflow-deeplab-resnet-master【.npy如何转.ckpt】

  • 准备工作
    • 代码
  • 一、代码理解
    • (一)程序实现过程
      • 1、参数设置
      • 2、搭建网络结构
    • (二)核心脚本network.py结构
  • 二、代码调试
    • (一)修改代码,设置所需文件及输出文件相关参数
    • (二)错误1-获得的输入图像的色彩通道数c_i格式不正确
      • 1、报错
      • 2、原因分析
      • 3、解决方案
    • (三)错误2-使用len()函数获取map型数据的长度
      • 1、报错
      • 2、原因分析
      • 3、解决方案
    • (四)错误3-参数值传递出错
      • 1、报错
      • 2、原因分析
      • 3、解决方案
    • (五)错误4-字典对象不具有'iteritems'属性
      • 1、报错
      • 2、原因分析
      • 3、解决方案
    • (六)错误5-生成的zfnet的参数格式与.npy中参数格式不一致
      • 1、报错
      • 2、原因分析
      • 3、解决方案
  • 三、运行结果
  • 参考

准备工作

代码

github地址:https://github.com/DrSleep/tensorflow-deeplab-resnet

一、代码理解

(一)程序实现过程

在这里插入图片描述

1、参数设置

在这里插入图片描述

2、搭建网络结构

在这里插入图片描述

(二)核心脚本network.py结构

在这里插入图片描述

二、代码调试

(一)修改代码,设置所需文件及输出文件相关参数

在这里插入图片描述
在这里插入图片描述

(二)错误1-获得的输入图像的色彩通道数c_i格式不正确

1、报错

【TypeError: unsupported operand type(s) for /: ‘Dimension’ and ‘int’】
在这里插入图片描述

2、原因分析

  • 获得输入图像色彩通道数的代码:
    在这里插入图片描述
  • 输出c_i的类型及其中存储的数值:
    在这里插入图片描述
  • 我们需要的是一个int型的数值,但是得到的却是bimension,所以我们需要对取得的TensorShape做一定修改,将其转换成list型,然后再从中取得色彩通道数。

3、解决方案

  • 将代码修改为:
    在这里插入图片描述
  • 得到的c_i:
    在这里插入图片描述
    参考:[TensorFlow笔记] 获取Tensor的维度(tf.shape(x)、x.shape和x.get_shape()的区别)

(三)错误2-使用len()函数获取map型数据的长度

1、报错

【TypeError: object of type ‘map’ has no len()】
在这里插入图片描述

2、原因分析

变量类型为map,无法通过len()函数获取其长度

3、解决方案

  • 查看后续代码,修改input_shape的类型并不会对代码造成影响,故我直接将其转换为list型数据:
    在这里插入图片描述

(四)错误3-参数值传递出错

1、报错

【TypeError: not all arguments converted during string formatting】
在这里插入图片描述

2、原因分析

  • 出错位置:
  • 出错原因:参数设置错误
    在未使用参数名传参时,会将参数值传递给函数中对应位置的参数,按照原始语句【return tf.nn.softmax(input, name)】会导致函数【tf.nn.softmax()】中,参数axis的值为变量name的值,导致后续错误
    在这里插入图片描述

3、解决方案

  • 加上参数名传值
    在这里插入图片描述

(五)错误4-字典对象不具有’iteritems’属性

1、报错

【AttributeError: ‘dict’ object has no attribute ‘iteritems’】
在这里插入图片描述

2、原因分析

  • 查找出错点:
    在这里插入图片描述
  • 分析:在python3.5中:iteritems变为items

3、解决方案

  • 对代码做如下修改:
    在这里插入图片描述

(六)错误5-生成的zfnet的参数格式与.npy中参数格式不一致

1、报错

  • 【tensorflow.python.framework.errors_impl.InvalidArgumentError: Dimension 0 in both shapes must be equal, but are 6400 and 9216. Shapes are [6400,4096] and [9216,4096]. for ‘fc6_1/Assign’ (op: ‘Assign’) with input shapes: [6400,4096], [9216,4096].】
  • 【ValueError: Dimension 0 in both shapes must be equal, but are 6400 and 9216. Shapes are [6400,4096] and [9216,4096]. for ‘fc6_1/Assign’ (op: ‘Assign’) with input shapes: [6400,4096], [9216,4096].】
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2、原因分析

  • 直接使用caffe model转tensorflow model得到的zf.py文件中的padding设置为’VALID’和’SAME’两种值之一,但在计算输出的图像的width和height时采用上采样,无法得到原始定义的ZFNet网络参数格式。

3、解决方案

将定义ZFNet的脚本修改成下列形式:

class DeepLabZFNetModel(Network):def setup(self, is_training, num_classes):(self.feed('data').conv(7, 7, 96, 2, 2, padding='VALID', name='conv1').lrn(1, 1.666666624563125e-05, 0.75, name='norm1').max_pool(3, 3, 2, 2, padding='SAME', name='pool1').conv(5, 5, 256, 2, 2, padding='VALID', name='conv2').lrn(1, 1.666666624563125e-05, 0.75, name='norm2').max_pool(3, 3, 2, 2, padding='SAME', name='pool2').conv(3, 3, 384, 1, 1, padding='SAME', name='conv3').conv(3, 3, 384, 1, 1, padding='SAME', name='conv4').conv(3, 3, 256, 1, 1, padding='SAME', name='conv5').max_pool(3, 3, 2, 2, padding='VALID', name='pool5').fc(4096, name='fc6').fc(4096, name='fc7').fc(1000, relu=False, name='fc8').softmax(name='prob'))

三、运行结果

  • 生成.ckpt文件
    在这里插入图片描述

参考

  • 代码github地址
  • [TensorFlow笔记] 获取Tensor的维度(tf.shape(x)、x.shape和x.get_shape()的区别)
  相关解决方案