这里记录论文END-TO-END OPTIMIZED IMAGE COMPRESSION相关代码报错的记录(我这里运行的tensorflow1.15版本对应的代码)
github:https://github.com/tensorflow/compression
数据集用的是imagenet的验证集
前言
一些命令的记录
(1)运行python文件的训练模型命令(只针对当前代码)
python bls2017.py --verbose train --train_glob="/home/ll/END-TO-END-OPTIMIZED-IMAGE-COMPRESSION/image/*JPEG"
(2)linux下的数据集压缩包解压
tar
tar -xvf ILSVRC2012_img_val.tar -C image
zip
unzip kodak.zip
(3)screen
screen -S <作业名称> 创建新的页
screen -ls 查询已经存在的页面
screen -r <作业名称/作业编号> 进入页面
Ctrl+a+d 离开页面,页面进入后台
screen -X -S xxx quit 删除对应编号screen
进入页面后 exit 退出页面
快键键Ctrl+a+d实现分离
详细教程可以参考screen基本操作
1、cuda设备问题
tensorflow.python.framework.errors_impl.InvalidArgumentError: Invalid device ordinal value (1). Valid range is [0, 0].
while setting up XLA_GPU_JIT device number 1
解决方法
最后在命令前面加上CUDA_VISIBLE_DEVICE:
CUDA_VISIBLE_DEVICES=0 python bls2017.py --verbose train --train_glob="/home/ll/END-TO-END-OPTIMIZED-IMAGE-COMPRESSION/image/*JPEG"
或者在代码中加入
import os
os.environ['CUDA_VISIBLE_DEVICES']='0'
2、参数范围错误(实际解决问题,参见问题3)
tensorflow.python.framework.errors_impl.InvalidArgumentError: {
{
function_node __inference_Dataset_map_<lambda>_122}} assertion failed: [Need value.shape >= size, got ] [230 170 3] [256 256 3]
[[{
{
node random_crop/Assert/Assert}}]]
[[IteratorGetNext]]
这个问题一般是由于设置的参数范围错误的问题
tf.random_crop随机地将张量裁剪为给定的大小,以一致选择的偏移量将一个形状 size 部分从 value 中切出,需要的条件:value.shape >= size.
而这里实际剪裁的图片没有最后剪裁的大小大
这里我自己的做法是(有更好的欢迎补充):
''' 添加获取原图片进行剪裁的方法,以免原图片小于剪裁后的大小'''
def getXValue (x, args):
x_shape = tf.shape(x)
if x_shape[0] > args.patchsize:
x_value = tf.random_crop(x, (args.patchsize, args.patchsize, 3))
else:
x_value = x
return x_value
# 这里会出现图片小于剪裁之后的图像大小情况
train_dataset = train_dataset.map(
# tf.random_crop随机地将张量裁剪为给定的大小.以一致选择的偏移量将一个形状 size 部分从 value 中切出.需要的条件:value.shape >= size.
# lambda x
# lambda本质上是个函数功能,是个匿名的函数,表达形式和用法均与一般函数有所不同。普通的函数可以写简单的也可以写复杂的,但lambda函数一般在一行内实现,是个非常简单的函数功能体。
# 那么,什么时候需要将函数写成lambda形式?
# 函数功能简单,一句话就可以实现
# 偶而性使用,不需要考虑复用
# lambda x: tf.random_crop(x, (args.patchsize, args.patchsize, 3)))
lambda x: getXValue(x, args))