IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> END-TO-END OPTIMIZED IMAGE COMPRESSION代码报错记录 -> 正文阅读

[人工智能]END-TO-END OPTIMIZED IMAGE COMPRESSION代码报错记录

这里记录论文END-TO-END OPTIMIZED IMAGE COMPRESSION相关代码报错的记录(我这里运行的tensorflow1.15版本对应的代码)
github:https://github.com/tensorflow/compression
数据集用的是imagenet的验证集

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))

3、层名称与层不兼容问题

在这里插入图片描述

ValueError: in converted code:

    bls2017.py:97 call  *
        tensor = layer(tensor)
    /home/ll/.conda/envs/TF115GPU/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/base_layer.py:819 __call__
        self.name)
    /home/ll/.conda/envs/TF115GPU/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/input_spec.py:165 assert_input_compatibility
        layer_name + ' is incompatible with the layer: '

ValueError: Input 0 of layer layer_0 is incompatible with the layer: its rank is undefined, but the layer requires a defined rank.

在这里插入图片描述
在这里插入图片描述
出现这个问题发现问题2不能这样解决,我们在预处理的裁剪过程中必须保证图片尺寸固定256256,所以必须挑选出图片尺寸大于256256的图片进行操作

4、将图片反向排序,取后8000个

在这里插入图片描述

# 按照尺寸大小排序
    size_files = sorted(glob.glob(args.train_glob), key=os.path.getsize)
    print(len(size_files), 'len(size_files)')
    # 逆向取8000个(最大尺寸的8000张图片)
    reversed_files = size_files[len(size_files)-8000:len(size_files)]

    train_dataset = tf.data.Dataset.from_tensor_slices(reversed_files)
    train_dataset = train_dataset.shuffle(buffer_size=len(reversed_files)).repeat()
    train_dataset = train_dataset.map(
        read_png, num_parallel_calls=args.preprocess_threads)

    # 这里会出现图片小于剪裁之后的图像大小情况
    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)) #ll
    train_dataset = train_dataset.batch(args.batchsize)
    train_dataset = train_dataset.prefetch(32)

5、重新改造问题2、3、4

峰回路转,倒序取8000个还是有图片尺寸不达标,如果再减少取得数量,可能导致损失函数不收敛,而且治标不治本,所以我打算过滤出达标的图片。

虽然想的很简单,但是博主从来没接触过过tensorflow,一步步来吧
(1)首先我们从目标文件路径读取到了以文件路径表示的list:train_files在这里插入图片描述

train_files = glob.glob(args.train_glob) # args.train_glob路径字符串,类型list
    if not train_files:
      raise RuntimeError(
          "No training images found with glob '{}'.".format(args.train_glob))

(2)截取排序后的8000个元素组成的list
在这里插入图片描述

 # 按照尺寸大小排序
    size_files = sorted(glob.glob(args.train_glob), key=os.path.getsize)
    # 逆向取8000个(最大尺寸的8000张图片)
    reversed_files = size_files[len(size_files)-8000:len(size_files)] # list

这里顺便验证一下排序
按大小降序,第一个文件对应我们排序后的list的最后一个元素
在这里插入图片描述
(3)通过tf.data.Dataset.from_tensor_slices创建dataset
这里部分基础知识可以通过tensorflow理解

# 创建dataset
    train_dataset = tf.data.Dataset.from_tensor_slices(reversed_files) # from_tensor_slices(从tensor切片读取)
    train_dataset = train_dataset.shuffle(buffer_size=len(reversed_files)).repeat()
    train_dataset = train_dataset.map(read_png, num_parallel_calls=args.preprocess_threads)

因为不知道转换后的dataset中的元素是什么样的,所以我们进行读取(每个读取1个元素)

# 读取datasets中的数据
    iterator = train_dataset.make_one_shot_iterator()
    one_element = iterator.get_next()
    with tf.Session() as sess:
      for i in range(1):
        print(sess.run(one_element))

经过(1)

 train_dataset = tf.data.Dataset.from_tensor_slices(reversed_files) # from_tensor_slices(从tensor切片读取)

在这里插入图片描述
经过(2)
是一个重复的操作
在这里插入图片描述

经过(3)

train_dataset = train_dataset.map(read_png, num_parallel_calls=args.preprocess_threads)
# 读取datasets中的数据
    iterator = train_dataset.make_one_shot_iterator()
    one_element = iterator.get_next()
    with tf.Session() as sess:
      for i in range(1):
        print(sess.run(one_element), '3333333333')
        print(tf.shape(sess.run(one_element)), 'shape11111')
        print(len(sess.run(one_element)), 'sess.run(one_element).len')

在这里插入图片描述
也就是说这个张量的最外维度的长度对应图片的长,每一层维度的长对应宽图片的宽。

(4)添加一个过滤函数(在裁剪之前)

# 过滤图片大小不合格的
    train_dataset = train_dataset.filter(lambda x: filterImg(x, args))
def filterImg (x, args):
    x_shape = tf.shape(x)
    print(x_shape, 'x_shape')
    print(len(x), 'x.len')

这里我们先看看打印的数据类型,在进行修改
在这里插入图片描述
这里进来的x好像和之前打印的张量不一样,具体看看dataset.filter这个方法

未解之谜:
通过在dataset.filter调用函数,根本没有办法拿到x的值,显示属性为空,但是如果直接在dataset.filter中使用判断就可以了,有没有大神看到可以解答一下,感激不尽

train_dataset = train_dataset.filter(lambda x: len(x) > args.patchsize)
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:31:54  更:2022-03-15 22:34:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 15:59:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码