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()的区别)