- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章使用Tensorflow将自己的数据分割成batch训练实例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
学习神经网络的时候,网上的数据集已经分割成了batch,训练的时候直接使用batch.next()就可以获取batch,但是有的时候需要使用自己的数据集,然而自己的数据集不是batch形式,就需要将其转换为batch形式,本文将介绍一个将数据打包成batch的方法.
1、tf.slice_input_producer() 。
首先需要讲解两个函数,第一个函数是 :tf.slice_input_producer(),这个函数的作用是从输入的tensor_list按要求抽取一个tensor放入文件名队列,下面解释下各个参数:
1
2
|
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),运行下面这行代码 。
1
|
input_queue
=
tf.train.slice_input_producer([data, label], num_epochs
=
1
, shuffle
=
True
, capacity
=
32
)
|
结果如图,可以看出返回值为一个包含两组数据的list,每个list的shape与输入的data和label的shape对应 。
2、tf.train.batch()& tf.train.shuffle_batch() 。
第二个函数为:tf.train.batch(),tf.train.shuffle_batch(),这个函数的作用为生成大小为batch_size的tensor,下面解释下各个参数:
1
2
|
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的函数,由上面两个函数组成:
1
2
3
4
5
|
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:
可以发现,返回是样本数目为2000的tensor,也就是达到了将自己的数据打包成batch的功能 。
3、batch的使用方法 。
生成batch只完成了一半,后面的使用方法也比较复杂,直接上一个完整的程序来讲解会方便理解一些:下面代码构建了一个单层感知机,对数据进行分类,主要看一下训练过程中如何使用生成好了的batch,具体细节都写在注释里面了.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
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 。
4、 简单生成Batch的方法 。
最近发现了一种简单生生成batch的方法,实现简单,操作方便,就是时间复杂度可能高了一点,直接上代码。通过np.random.choice方法每次在范围[0, len(all_data))内抽取大小为size的索引。然后通过这部分索引构建batch.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
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训练实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://blog.csdn.net/sinat_35821976/article/details/82668555 。
最后此篇关于使用Tensorflow将自己的数据分割成batch训练实例的文章就讲到这里了,如果你想了解更多关于使用Tensorflow将自己的数据分割成batch训练实例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
有没有一种方法可以使用标准类型构造函数(例如 int、set、dict、list、tuple 等)以用户定义的方式将用户定义类的实例强制转换为其中一种类型?例如 class Example:
我知道这个问题在Stackoverflow中有很多问题,但是即使有很多答案,这些答案也帮不了我什么,也没有找到答案。 在我的WebAPP中,它可以正常工作,但是当我将其转换为API时,它失败了(主题标
这个问题已经有答案了: Why does the ternary operator unexpectedly cast integers? (3 个回答) 已关闭 9 年前。 最近遇到一个Java的陷
我尝试使用 FirebaseApp.configure() 配置 Firebase,但遇到以下崩溃: *** Terminating app due to uncaught exception 'c
我有一个自连接员工实体类,其中包含与其自身相关的 id、name 和 ref 列。我想创建它的新实例并将其保存到数据库。 首先我创建了一个 Employee 类的实例并将其命名为 manager。然后
我有一个用于添加新公寓的表单,在该表单中我有一个下拉列表,用户可以在其中选择负责的人员。 显然,当您从下拉列表中选择并尝试保存公寓时,我的应用程序认为该人已被修改。它给了我下面的错误,指示我应该首先保
从 Visualforce 页面,我需要检索我们组织的 salesforce 实例的 URL,而不是 Visual Force URL。 例如我需要https://cs1.salesforce.com
我遇到了一些可能的问题答案,但这是关于从 Hibernate 3.4.0GA 升级到 Hibernate 4.1.8 的问题。所以这曾经在以前的版本下工作,我已经四处搜索了为什么它在这个新版本中出现了
似乎一遍又一遍地问这个问题,我仍然找不到解决我问题的答案。我在下面有一个域模型。每个新创建或更新的“安全用户”都需要我确保其具有配置文件,如果没有,则创建一个新的配置文件并分配给它。 配置文件的要求相
我很难调试为什么 JPA 不级联我的 @ManyToMany 关系。我发现的所有答案都与缺少级联语句有关。但我确实拥有它们并且仍然得到: Caused by: org.hibernate.Transi
Play 服务 API 表明有一个叫做 Instance ID 的东西 但是,在 Android Studio 中包含以下内容后,我无法导入 InstanceID 类 compile "com.goo
我正在使用 Seam 框架。我有 2 个实体: 请求.java @Entity @Table(name = "SRV_REQUEST") public class Request { private
This question处理构建一个适当的Monad来自单子(monad)的实例,但仅在某些约束下 - 例如Set .诀窍是将其包装成 ContT ,它将约束推迟到包装/展开其值。 现在我想对 Ap
我正在尝试执行此查询: StringBuffer sb = new StringBuffer(); sb.append("select p from PointsEntity p " + "where
我试图了解是否可以更改我的 hibernate 配置并使用单个 MySQL 实例(而不是我当前拥有的多个 MySQL 实例): 我有一个使用 hibernate 的 Java 应用程序,与 2 个模式
我有一个选项卡滑动布局,其中包括四个选项卡,每个选项卡都有自己的布局和 fragment ,在我的主要 Activity 布局中,viewpager 参与更改选项卡。特定 View (选项卡)在应用程
我看到很多帖子声称他们正在运行 MySql 的 RDS 实例,但无法连接到该实例,但我没有运行 RDS。 我使用 EC2 实例来托管我的 WordPress 博客,该博客是使用 Web 平台安装程序安
因为我在我的 ec-2 实例上的 python 虚拟环境中运行应用程序( Airflow ),并且我想在同一个 ec2 实例上的默认 python 环境中运行命令,所以我认为 ssh 到我自己的实例更
这个问题已经有答案了: How to fix the Hibernate "object references an unsaved transient instance - save the tra
例子: run APP1 .. ... run APP1 ... run APP2 如何在 APP2 中对 Vue 说我需要调用 APP1?
我是一名优秀的程序员,十分优秀!