基于Tensorflow批量数据的输入实现方式


Posted in Python onFebruary 05, 2020

基于Tensorflow下的批量数据的输入处理:

1.Tensor TFrecords格式

2.h5py的库的数组方法

在tensorflow的框架下写CNN代码,我在书写过程中,感觉不是框架内容难写, 更多的是我在对图像的预处理和输入这部分花了很多精神。

使用了两种方法:

方法一:

Tensor 以Tfrecords的格式存储数据,如果对数据进行标签,可以同时做到数据打标签。

①创建TFrecords文件

orig_image = '/home/images/train_image/'
gen_image = '/home/images/image_train.tfrecords'
def create_record():
  writer = tf.python_io.TFRecordWriter(gen_image)
  class_path = orig_image
  for img_name in os.listdir(class_path): #读取每一幅图像
    img_path = class_path + img_name 
    img = Image.open(img_path) #读取图像
    #img = img.resize((256, 256)) #设置图片大小, 在这里可以对图像进行处理
    img_raw = img.tobytes() #将图片转化为原声bytes 
    example = tf.train.Example(
         features=tf.train.Features(feature={
             'label': tf.train.Feature(int64_list=tf.train.Int64List(value=[0])), #打标签
             'img_raw': tf.train.Feature(bytes_list=tf.train.BytesList(value=[img_raw]))#存储数据
             }))
    writer.write(example.SerializeToString())
  writer.close()

②读取TFrecords文件

def read_and_decode(filename):
  #创建文件队列,不限读取的数据
  filename_queue = tf.train.string_input_producer([filename])
  reader = tf.TFRecordReader()
  _, serialized_example = reader.read(filename_queue)

  features = tf.parse_single_example(
      serialized_example,
      features={
          'label': tf.FixedLenFeature([], tf.int64),
          'img_raw': tf.FixedLenFeature([], tf.string)})
  label = features['label']
  img = features['img_raw']
  img = tf.decode_raw(img, tf.uint8) #tf.float32
  img = tf.image.convert_image_dtype(img, dtype=tf.float32)
  img = tf.reshape(img, [256, 256, 1])
  label = tf.cast(label, tf.int32)
  return img, label

③批量读取数据,使用tf.train.batch

min_after_dequeue = 10000
capacity = min_after_dequeue + 3 * batch_size
num_samples= len(os.listdir(orig_image))
create_record()
img, label = read_and_decode(gen_image)
total_batch = int(num_samples/batch_size)
image_batch, label_batch = tf.train.batch([img, label], batch_size=batch_size,
                      num_threads=32, capacity=capacity) 
init_op = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
with tf.Session() as sess:
  sess.run(init_op)
  coord = tf.train.Coordinator()
  threads = tf.train.start_queue_runners(coord=coord)
  for i in range(total_batch):
     cur_image_batch, cur_label_batch = sess.run([image_batch, label_batch])
  coord.request_stop()
  coord.join(threads)

方法二:

使用h5py就是使用数组的格式来存储数据

这个方法比较好,在CNN的过程中,会使用到多个数据类存储,比较好用, 比如一个数据进行了两种以上的变化,并且分类存储,我认为这个方法会比较好用。

import os
import h5py
import matplotlib.pyplot as plt
import numpy as np
import random
from scipy.interpolate import griddata
from skimage import img_as_float
import matplotlib.pyplot as plt
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
class_path = '/home/awen/Juanjuan/Python Project/train_BSDS/test_gray_0_1/'
for img_name in os.listdir(class_path):
  img_path = class_path + img_name
  img = io.imread(img_path)
  m1 = img_as_float(img)
  m2, m3 = sample_inter1(m1) #一个数据处理的函数
  m1 = m1.reshape([256, 256, 1])
  m2 = m2.reshape([256, 256, 1])
  m3 = m3.reshape([256, 256, 1])
  orig_image.append(m1)
  sample_near.append(m2)
  sample_line.append(m3)

arrorig_image = np.asarray(orig_image) # [?, 256, 256, 1]
arrlsample_near = np.asarray(sample_near) # [?, 256, 256, 1] 
arrlsample_line = np.asarray(sample_line) # [?, 256, 256, 1] 

save_path = '/home/awen/Juanjuan/Python Project/train_BSDS/test_sample/train.h5'
def make_data(path):
  with h5py.File(save_path, 'w') as hf:
     hf.create_dataset('orig_image', data=arrorig_image)
     hf.create_dataset('sample_near', data=arrlsample_near)
     hf.create_dataset('sample_line', data=arrlsample_line)

def read_data(path):
  with h5py.File(path, 'r') as hf:
     orig_image = np.array(hf.get('orig_image')) #一定要对清楚上边的标签名orig_image;
     sample_near = np.array(hf.get('sample_near'))
     sample_line = np.array(hf.get('sample_line'))
  return orig_image, sample_near, sample_line
make_data(save_path)
orig_image1, sample_near1, sample_line1 = read_data(save_path)
total_number = len(orig_image1)
batch_size = 20
batch_index = total_number/batch_size
for i in range(batch_index):
  batch_orig = orig_image1[i*batch_size:(i+1)*batch_size]
  batch_sample_near = sample_near1[i*batch_size:(i+1)*batch_size]
  batch_sample_line = sample_line1[i*batch_size:(i+1)*batch_size]

在使用h5py的时候,生成的文件巨大的时候,读取数据显示错误:ioerror: unable to open file (bad object header version number)

基本就是这个生成的文件不能使用,适当的减少存储的数据,即可。

以上这篇基于Tensorflow批量数据的输入实现方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的ORM框架SQLObject入门实例
Apr 28 Python
深入理解Python中的内置常量
May 20 Python
Python实现简易版的Web服务器(推荐)
Jan 29 Python
transform python环境快速配置方法
Sep 27 Python
分析经典Python开发工程师面试题
Apr 08 Python
用Python配平化学方程式的方法
Jul 20 Python
python logging模块书写日志以及日志分割详解
Jul 22 Python
利用python-pypcap抓取带VLAN标签的数据包方法
Jul 23 Python
Django自定义模板过滤器和标签的实现方法
Aug 21 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 Python
python爬虫用scrapy获取影片的实例分析
Nov 23 Python
python基于selenium爬取斗鱼弹幕
Feb 20 Python
Python操作注册表详细步骤介绍
Feb 05 #Python
Python类继承和多态原理解析
Feb 05 #Python
Python模块 _winreg操作注册表
Feb 05 #Python
python3操作注册表的方法(Url protocol)
Feb 05 #Python
Python tkinter模版代码实例
Feb 05 #Python
Python Scrapy框架第一个入门程序示例
Feb 05 #Python
python lambda函数及三个常用的高阶函数
Feb 05 #Python
You might like
星际争霸任务指南——虫族
2020/03/04 星际争霸
十天学会php之第十天
2006/10/09 PHP
php模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
php无限分类且支持输出树状图的详细介绍
2013/06/19 PHP
php生成RSS订阅的方法
2015/02/13 PHP
PHP获取网站中各文章的第一张图片的代码示例
2016/05/20 PHP
PHP7内核之Reference详解
2019/03/14 PHP
PHP Cli 模式设置进程名称的方法
2019/06/12 PHP
表格 隔行换色升级版
2009/11/07 Javascript
JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
2010/05/13 Javascript
asp.net 30分钟掌握无刷新 Repeater
2011/09/16 Javascript
js 一个关于图片onload加载的事
2013/11/10 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
2015/03/03 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
JS获取url参数、主域名的方法实例分析
2016/08/03 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
不间断循环滚动效果的实例代码(必看篇)
2016/10/08 Javascript
jQuery插件WebUploader实现文件上传
2016/11/07 Javascript
Vue数据驱动模拟实现1
2017/01/11 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
解决jQuery使用append添加的元素事件无效的问题
2018/08/30 jQuery
Vue 中 template 有且只能一个 root的原因解析(源码分析)
2020/04/11 Javascript
Vue 使用iframe引用html页面实现vue和html页面方法的调用操作
2020/11/16 Javascript
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
python数据挖掘需要学的内容
2019/06/23 Python
python实现的批量分析xml标签中各个类别个数功能示例
2019/12/30 Python
Django如何使用jwt获取用户信息
2020/04/21 Python
办公室文秘自我鉴定
2013/09/21 职场文书
学生手册家长评语
2014/02/10 职场文书
教师爱岗敬业演讲稿
2014/05/05 职场文书
立志成才演讲稿
2014/09/04 职场文书
2019年自助餐厅创业计划书模板
2019/08/22 职场文书