使用Tensorflow将自己的数据分割成batch训练实例


Posted in Python onJanuary 20, 2020

学习神经网络的时候,网上的数据集已经分割成了batch,训练的时候直接使用batch.next()就可以获取batch,但是有的时候需要使用自己的数据集,然而自己的数据集不是batch形式,就需要将其转换为batch形式,本文将介绍一个将数据打包成batch的方法。

一、tf.slice_input_producer()

首先需要讲解两个函数,第一个函数是 :tf.slice_input_producer(),这个函数的作用是从输入的tensor_list按要求抽取一个tensor放入文件名队列,下面解释下各个参数:

tf.slice_input_producer(tensor_list, num_epochs=None, shuffle=True, seed=None,
       capacity=32, shared_name=None, name=None)

tensor_list 这个就是输入,格式为tensor的列表;一般为[data, label],即由特征和标签组成的数据集

num_epochs 这个是你抽取batch的次数,如果没有给定值,那么将会抽取无数次batch(这会导致你训练过程停不下来),如果给定值,那么在到达次数之后就会报OutOfRange的错误

shuffle 是否随机打乱,如果为False,batch是按顺序抽取;如果为True,batch是随机抽取

seed 随机种子

capcity 队列容量的大小,为整数

name 名称

举个例子:我的data的shape为(4000,10),label的shape为(4000,2),运行下面这行代码

input_queue = tf.train.slice_input_producer([data, label], num_epochs=1, shuffle=True, capacity=32 )

结果如图,可以看出返回值为一个包含两组数据的list,每个list的shape与输入的data和label的shape对应

使用Tensorflow将自己的数据分割成batch训练实例

二、tf.train.batch()& tf.train.shuffle_batch()

第二个函数为:tf.train.batch(),tf.train.shuffle_batch(),这个函数的作用为生成大小为batch_size的tensor,下面解释下各个参数:

tf.train.batch([data, label], batch_size=batch_size, capacity=capacity,num_threads=num_thread,allow_smaller_final_batch= True)
tf.train.shuffle_batch([example, label], batch_size=batch_size, capacity=capacity,num_threads=num_thread,allow_smaller_final_batch=True)

[data,label] 输入的样本和标签

batch_size batch的大小

capcity 队列的容量

num_threads 线程数,使用多少个线程来控制整个队列

allow_smaller_final_batch 这个是当最后的几个样本不够组成一个batch的时候用的参数,如果为True则会重新组成一个batch

下面给出生成batch的函数,由上面两个函数组成:

def get_Batch(data, label, batch_size):
 print(data.shape, label.shape)
 input_queue = tf.train.slice_input_producer([data, label], num_epochs=1, shuffle=True, capacity=32 ) 
 x_batch, y_batch = tf.train.batch(input_queue, batch_size=batch_size, num_threads=1, capacity=32, allow_smaller_final_batch=False)
 return x_batch, y_batch

还是同样的输入,batch_size设为2000,看下运行后的返回值的shape:

使用Tensorflow将自己的数据分割成batch训练实例

可以发现,返回是样本数目为2000的tensor,也就是达到了将自己的数据打包成batch的功能

三、batch的使用方法

生成batch只完成了一半,后面的使用方法也比较复杂,直接上一个完整的程序来讲解会方便理解一些:下面代码构建了一个单层感知机,对数据进行分类,主要看一下训练过程中如何使用生成好了的batch,具体细节都写在注释里面了。

import tensorflow as tf
import scipy.io as sio
import numpy as np
 
 
def get_Batch(data, label, batch_size):
 print(data.shape, label.shape)
 input_queue = tf.train.slice_input_producer([data, label], num_epochs=1, shuffle=True, capacity=32 ) 
 x_batch, y_batch = tf.train.batch(input_queue, batch_size=batch_size, num_threads=1, capacity=32, allow_smaller_final_batch=False)
 return x_batch, y_batch
 
 
data = sio.loadmat('data.mat')
train_x = data['train_x']
train_y = data['train_y']
test_x = data['test_x']
test_y = data['test_y']
 
x = tf.placeholder(tf.float32, [None, 10])
y = tf.placeholder(tf.float32, [None, 2])
 
w = tf.Variable(tf.truncated_normal([10, 2], stddev=0.1))
b = tf.Variable(tf.truncated_normal([2], stddev=0.1))
pred = tf.nn.softmax(tf.matmul(x, w) + b)
 
loss = tf.reduce_mean(-tf.reduce_sum(y * tf.log(pred), reduction_indices=[1]))
optimizer = tf.train.AdamOptimizer(2e-5).minimize(loss)
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(pred, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32), name='evaluation')
 
x_batch, y_batch = get_Batch(train_x, train_y, 1000)
# 训练
with tf.Session() as sess:
 #初始化参数
 sess.run(tf.global_variables_initializer())
 sess.run(tf.local_variables_initializer())
 # 开启协调器
 coord = tf.train.Coordinator()
 # 使用start_queue_runners 启动队列填充
 threads = tf.train.start_queue_runners(sess, coord)
 epoch = 0
 try:
  while not coord.should_stop():
   # 获取训练用的每一个batch中batch_size个样本和标签
   data, label = sess.run([x_batch, y_batch])
   sess.run(optimizer, feed_dict={x: data, y: label})
   train_accuracy = accuracy.eval({x: data, y: label})
   test_accuracy = accuracy.eval({x: test_x, y: test_y})
   print("Epoch %d, Training accuracy %g, Testing accuracy %g" % (epoch, train_accuracy, test_accuracy))
   epoch = epoch + 1
 except tf.errors.OutOfRangeError: # num_epochs 次数用完会抛出此异常
  print("---Train end---")
 finally:
  # 协调器coord发出所有线程终止信号
  coord.request_stop()
  print('---Programm end---')
 coord.join(threads) # 把开启的线程加入主线程,等待threads结束

总共训练的次数为(样本数目/batch_size)*num_epochs

四、 简单生成Batch的方法

最近发现了一种简单生生成batch的方法,实现简单,操作方便,就是时间复杂度可能高了一点,直接上代码。通过np.random.choice方法每次在范围[0, len(all_data))内抽取大小为size的索引。然后通过这部分索引构建batch。

epoch = 150
for i in tqdm(range(epoch)):
 # 在total_train_xs, total_train_ys数据集中随机抽取batch_size个样本出来
 # 作为本轮迭代的训练数据batch_xs, batch_ys
 batch_size = 1000
 sample_idxs = np.random.choice(range(len(all_data)), size=batch_size)
 batch_xs = []
 batch_ys = []
 
 val_sample_idxs = np.random.choice(range(len(all_data)), size=batch_size)
 val_batch_xs = []
 val_batch_ys = []
 
 for j in range(batch_size):
  train_id = sample_idxs[j]
  batch_xs.append(all_data[train_id])
  batch_ys.append(all_label[train_id])
 
  val_id = val_sample_idxs[j]
  val_batch_xs.append(all_data[val_id])
  val_batch_ys.append(all_label[val_id])
 
 batch_xs = np.array(batch_xs)
 batch_ys = np.array(batch_ys)
 val_batch_xs = np.array(val_batch_xs)
 val_batch_ys = np.array(val_batch_ys)
 
 
 # 喂训练数据进去训练
 sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
 if i % 50 == 0:
  y_train_pred = np.array(sess.run(y, feed_dict={x: batch_xs})).reshape(len(batch_xs))
  y_pred = np.array(sess.run(y, feed_dict={x: val_batch_xs})).reshape(len(val_batch_xs))
  # draw(y_test, y_pred)
  print("Iteration %d, train RMSE %f, val RMSE %f" % (i, calcaulateRMSE(batch_ys, y_train_pred), calcaulateRMSE(val_batch_ys, y_pred)))

以上这篇使用Tensorflow将自己的数据分割成batch训练实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python多线程编程(三):threading.Thread类的重要函数和方法
Apr 05 Python
python实现爬虫下载美女图片
Jul 14 Python
Python爬虫实例爬取网站搞笑段子
Nov 08 Python
python 常用的基础函数
Jul 10 Python
django如何连接已存在数据的数据库
Aug 14 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
Aug 31 Python
详解Python绘图Turtle库
Oct 12 Python
在python中logger setlevel没有生效的解决
Feb 21 Python
Python进程Multiprocessing模块原理解析
Feb 28 Python
Python matplotlib实时画图案例
Apr 23 Python
python多进程下的生产者和消费者模型
May 07 Python
Python实现日志实时监测的示例详解
Apr 06 Python
Python JSON编解码方式原理详解
Jan 20 #Python
从训练好的tensorflow模型中打印训练变量实例
Jan 20 #Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
Jan 20 #Python
新年福利来一波之Python轻松集齐五福(demo)
Jan 20 #Python
Python timer定时器两种常用方法解析
Jan 20 #Python
tensorflow 固定部分参数训练,只训练部分参数的实例
Jan 20 #Python
如何通过Django使用本地css/js文件
Jan 20 #Python
You might like
PHP操作Memcache实例介绍
2013/06/14 PHP
基于simple_html_dom的使用小结
2013/07/01 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
JsDom 编程小结
2011/08/09 Javascript
javascript错误的认识不用关心内存管理
2012/12/15 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
jQuery中element选择器用法实例
2014/12/29 Javascript
JavaScript:Array类型全面解析
2016/05/19 Javascript
JavaScript蒙板(model)功能的简单实现代码
2016/08/04 Javascript
移动端脚本框架Hammer.js
2016/12/15 Javascript
vue实现验证码输入框组件
2017/12/14 Javascript
vue-router项目实战总结篇
2018/02/11 Javascript
使用Vant完成DatetimePicker 日期的选择器操作
2020/11/12 Javascript
python Django连接MySQL数据库做增删改查
2013/11/07 Python
Python常用库推荐
2016/12/04 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
2019/10/24 Python
Python文件读写w+和r+区别解析
2020/03/26 Python
python实现udp聊天窗口
2020/03/31 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
2013/04/24 HTML / CSS
芬兰攀岩、山地运动和户外活动用品购物网站:Bergfreunde
2016/10/06 全球购物
美国一家著名的手表在线折扣网站:Discount Watch Store
2020/02/24 全球购物
普天C++笔试题
2016/03/20 面试题
新闻传媒系求职信范文
2014/04/19 职场文书
会展策划与管理专业求职信
2014/06/09 职场文书
有关九一八事变的演讲稿
2014/09/14 职场文书
个人查摆问题整改措施
2014/10/04 职场文书
政风行风整改方案
2014/10/25 职场文书
党的群众路线教育实践活动总结大会主持词
2014/10/30 职场文书
2015年银行个人工作总结
2015/05/14 职场文书
在人间读书笔记
2015/06/30 职场文书
整理Python中常用的conda命令操作
2021/06/15 Python
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏
Java Redisson多策略注解限流
2022/09/23 Java/Android