使用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实现二叉树的遍历
Dec 11 Python
详解Python异常处理中的Finally else的功能
Dec 29 Python
Python实现购物车程序
Apr 16 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
python+ffmpeg批量去视频开头的方法
Jan 09 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
Aug 26 Python
Python中__repr__和__str__区别详解
Nov 07 Python
基于python判断目录或者文件代码实例
Nov 29 Python
Python模拟FTP文件服务器的操作方法
Feb 18 Python
Pycharm新手使用教程(图文详解)
Sep 17 Python
python基础学习之生成器与文件系统知识总结
May 25 Python
python实现简单聊天功能
Jul 07 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
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
2007/03/15 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
PHP+JS三级菜单联动菜单实现方法
2016/02/24 PHP
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果
2015/11/26 Javascript
jQuery中的siblings用法实例分析
2015/12/24 Javascript
JS日程管理插件FullCalendar中文说明文档
2017/02/06 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
使用electron将vue-cli项目打包成exe的方法
2018/09/29 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
2019/01/18 jQuery
jQuery pager.js 插件动态分页功能实例分析
2019/08/02 jQuery
layer.open提交子页面的form和layedit文本编辑内容的方法
2019/09/27 Javascript
基于javascript实现贪吃蛇小游戏
2019/11/25 Javascript
手把手教你如何编译打包video.js
2020/12/09 Javascript
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
python根据出生年份简单计算生肖的方法
2015/03/27 Python
利用python实现数据分析
2017/01/11 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
2017/09/08 Python
Python将文本去空格并保存到txt文件中的实例
2018/07/24 Python
python判断输入日期为第几天的实例
2018/11/13 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
django mysql数据库及图片上传接口详解
2019/07/18 Python
django之自定义软删除Model的方法
2019/08/14 Python
树莓派极简安装OpenCv的方法步骤
2019/10/10 Python
Python如何使用turtle库绘制图形
2020/02/26 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
加拿大花店:1800Flowers.ca
2016/11/16 全球购物
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
小学生获奖感言范文
2014/02/02 职场文书
医院护士见习期自我鉴定
2014/09/15 职场文书
退货证明模板
2015/06/23 职场文书
小学体育队列队形教学反思
2016/02/16 职场文书
《为人民服务》教学反思
2016/02/20 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
六种css3实现的边框过渡效果
2021/04/22 HTML / CSS