对于如何*实际*读取TensorFlow中的CSV数据?感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍tensorflow读取csv文件,并为您提供关于CSV数据集不适合使用Tensorflo
对于如何*实际*读取TensorFlow中的CSV数据?感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍tensorflow读取csv文件,并为您提供关于CSV数据集不适合使用Tensorflow的内存、Effective TensorFlow Chapter 4: TensorFlow中的广播Broadcast机制【转】、Tensorflow 2.0:从 CSV 文件加载数据、tensorflow for R中的警告-您的CPU支持该TensorFlow二进制文件未编译为使用的指令:AVX2的有用信息。
本文目录一览:- 如何*实际*读取TensorFlow中的CSV数据?(tensorflow读取csv文件)
- CSV数据集不适合使用Tensorflow的内存
- Effective TensorFlow Chapter 4: TensorFlow中的广播Broadcast机制【转】
- Tensorflow 2.0:从 CSV 文件加载数据
- tensorflow for R中的警告-您的CPU支持该TensorFlow二进制文件未编译为使用的指令:AVX2
如何*实际*读取TensorFlow中的CSV数据?(tensorflow读取csv文件)
我在TensorFlow领域相对较新,对您如何 实际
将CSV数据读取到TensorFlow中可用的示例/标签张量中感到困惑。TensorFlow教程中有关读取CSV数据的示例相当分散,仅使您成为能够训练CSV数据的一部分。
这是我根据CSV教程整理而成的代码:
from __future__ import print_functionimport tensorflow as tfdef file_len(fname): with open(fname) as f: for i, l in enumerate(f): pass return i + 1filename = "csv_test_data.csv"# setup text readerfile_length = file_len(filename)filename_queue = tf.train.string_input_producer([filename])reader = tf.TextLineReader(skip_header_lines=1)_, csv_row = reader.read(filename_queue)# setup CSV decodingrecord_defaults = [[0],[0],[0],[0],[0]]col1,col2,col3,col4,col5 = tf.decode_csv(csv_row, record_defaults=record_defaults)# turn features back into a tensorfeatures = tf.stack([col1,col2,col3,col4])print("loading, " + str(file_length) + " line(s)\n")with tf.Session() as sess: tf.initialize_all_variables().run() # start populating filename queue coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(coord=coord) for i in range(file_length): # retrieve a single instance example, label = sess.run([features, col5]) print(example, label) coord.request_stop() coord.join(threads) print("\ndone loading")
这是我正在加载的CSV文件中的一个简短示例-基本数据-4个功能列和1个标签列:
0,0,0,0,00,15,0,0,00,30,0,0,00,45,0,0,0
上面的所有代码都是 从CSV文件中逐个打印每个示例 ,虽然不错,但对于培训来说却毫无用处。
我在这里遇到的困难是如何将这些单独的示例(一个接一个地加载)变成训练数据集。例如,这是我在Udacity深度学习课程中正在使用的笔记本。我基本上想获取要加载的CSV数据,然后将其放入
train_dataset 和 train_labels之类的内容中 :
def reformat(dataset, labels): dataset = dataset.reshape((-1, image_size * image_size)).astype(np.float32) # Map 2 to [0.0, 1.0, 0.0 ...], 3 to [0.0, 0.0, 1.0 ...] labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32) return dataset, labelstrain_dataset, train_labels = reformat(train_dataset, train_labels)valid_dataset, valid_labels = reformat(valid_dataset, valid_labels)test_dataset, test_labels = reformat(test_dataset, test_labels)print(''Training set'', train_dataset.shape, train_labels.shape)print(''Validation set'', valid_dataset.shape, valid_labels.shape)print(''Test set'', test_dataset.shape, test_labels.shape)
我已经尝试过使用tf.train.shuffle_batch
,就像这样,但它莫名其妙地挂起了:
for i in range(file_length): # retrieve a single instance example, label = sess.run([features, colRelevant]) example_batch, label_batch = tf.train.shuffle_batch([example, label], batch_size=file_length, capacity=file_length, min_after_dequeue=10000) print(example, label)
综上所述,这是我的问题:
- 我对这个过程缺少什么?
- 感觉到缺少一些关于如何正确构建输入管道的关键直觉。
- 有没有一种方法可以避免必须知道CSV文件的长度?
- 必须知道要处理的
for i in range(file_length)
行数(上面的代码行)感觉很不好
- 必须知道要处理的
编辑:
雅罗斯拉夫(Yaroslav)指出我很可能在这里混合了命令性和图形构造部分后,它变得越来越清晰。我能够整理以下代码,我认为这与从CSV训练模型时通常会执行的代码更接近(不包括任何模型训练代码):
from __future__ import print_functionimport numpy as npimport tensorflow as tfimport math as mathimport argparseparser = argparse.ArgumentParser()parser.add_argument(''dataset'')args = parser.parse_args()def file_len(fname): with open(fname) as f: for i, l in enumerate(f): pass return i + 1def read_from_csv(filename_queue): reader = tf.TextLineReader(skip_header_lines=1) _, csv_row = reader.read(filename_queue) record_defaults = [[0],[0],[0],[0],[0]] colHour,colQuarter,colAction,colUser,colLabel = tf.decode_csv(csv_row, record_defaults=record_defaults) features = tf.stack([colHour,colQuarter,colAction,colUser]) label = tf.stack([colLabel]) return features, labeldef input_pipeline(batch_size, num_epochs=None): filename_queue = tf.train.string_input_producer([args.dataset], num_epochs=num_epochs, shuffle=True) example, label = read_from_csv(filename_queue) min_after_dequeue = 10000 capacity = min_after_dequeue + 3 * batch_size example_batch, label_batch = tf.train.shuffle_batch( [example, label], batch_size=batch_size, capacity=capacity, min_after_dequeue=min_after_dequeue) return example_batch, label_batchfile_length = file_len(args.dataset) - 1examples, labels = input_pipeline(file_length, 1)with tf.Session() as sess: tf.initialize_all_variables().run() # start populating filename queue coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(coord=coord) try: while not coord.should_stop(): example_batch, label_batch = sess.run([examples, labels]) print(example_batch) except tf.errors.OutOfRangeError: print(''Done training, epoch reached'') finally: coord.request_stop() coord.join(threads)
答案1
小编典典我认为您在这里混淆了命令性和图形构造部分。该操作将tf.train.shuffle_batch
创建一个新的队列节点,并且可以使用一个节点来处理整个数据集。因此,我认为您之所以绞尽脑汁,是因为您shuffle_batch
在for循环中创建了一堆队列,而没有为其启动队列运行器。
正常的输入管道用法如下所示:
- 添加喜欢的节点
shuffle_batch
到输入管道 - (可选,以防止意外修改图)完成图
-–图形构造结束,命令式编程开始-
tf.start_queue_runners
while(True): session.run()
为了更具可扩展性(避免使用Python
GIL),您可以使用TensorFlow管道生成所有数据。但是,如果性能不是很关键,则可以使用slice_input_producer.
以下示例将一个numpy数组连接到输入管道:这是一个带有一些Print
节点的示例,以查看发生了什么(Print
运行节点时进入stdout的消息)
tf.reset_default_graph()num_examples = 5num_features = 2data = np.reshape(np.arange(num_examples*num_features), (num_examples, num_features))print data(data_node,) = tf.slice_input_producer([tf.constant(data)], num_epochs=1, shuffle=False)data_node_debug = tf.Print(data_node, [data_node], "Dequeueing from data_node ")data_batch = tf.batch([data_node_debug], batch_size=2)data_batch_debug = tf.Print(data_batch, [data_batch], "Dequeueing from data_batch ")sess = tf.InteractiveSession()sess.run(tf.initialize_all_variables())tf.get_default_graph().finalize()tf.start_queue_runners()try: while True: print sess.run(data_batch_debug)except tf.errors.OutOfRangeError as e: print "No more inputs."
你应该看到这样的东西
[[0 1] [2 3] [4 5] [6 7] [8 9]][[0 1] [2 3]][[4 5] [6 7]]No more inputs.
“ 8、9”数字没有填满整个批次,因此没有得到生产。还tf.Print
可以打印到sys.stdout,因此它们对我来说分别显示在Terminal中。
PS:连接batch
到手动初始化的队列的最低要求在github问题2193中
另外,出于调试目的,您可能需要timeout
在会话上进行设置,以使IPython Notebook不挂在空队列出队中。我在会话中使用此帮助器功能
def create_session(): config = tf.ConfigProto(log_device_placement=True) config.gpu_options.per_process_gpu_memory_fraction=0.3 # don''t hog all vRAM config.operation_timeout_in_ms=60000 # terminate on long hangs # create interactive session to register a default session sess = tf.InteractiveSession("", config=config) return sess
可伸缩性注意事项:
tf.constant
将您的数据副本内联到Graph中。Graph定义的大小有2GB的基本限制,因此这是数据大小的上限- 你可以避开这一限制使用
v=tf.Variable
和保存数据到那里通过运行v.assign_op
一个tf.placeholder
在右侧和喂养numpy的阵列到占位符(feed_dict
) - 这样仍然会创建两个数据副本,因此,为了节省内存,您可以使自己的版本
slice_input_producer
在numpy数组上运行,并使用feed_dict
CSV数据集不适合使用Tensorflow的内存
如何解决CSV数据集不适合使用Tensorflow的内存?
使用 Tensorflow 2.3 ,我的输入/输出数据来自CSV文件(浮点数)。不幸的是,我的数据集无法容纳在内存中。可能可以通过例如拆分来避免将整个数据集加载到内存中。
我已经进行了很多研究,包括StackOverflow问题,但是答案并不总是很清楚,或者是指 TensorFlow的先前版本。
- how to fit tensorflow dataset
- Dataset does not fit in memory
- how to fit tensorflow dataset
- https://www.tensorflow.org/tutorials/load_data/csv
- https://medium.com/@mrgarg.rajat/training-on-large-datasets-that-dont-fit-in-memory-in-keras-60a974785d71
如果有人可以提供一个简单的入门示例...
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
Effective TensorFlow Chapter 4: TensorFlow中的广播Broadcast机制【转】
本文转载自:https://blog.csdn.net/LoseInVain/article/details/78763303
TensorFlow支持广播机制(Broadcast),可以广播元素间操作(elementwise operations)。正常情况下,当你想要进行一些操作如加法,乘法时,你需要确保操作数的形状是相匹配的,如:你不能将一个具有形状[3, 2]的张量和一个具有[3,4]形状的张量相加。但是,这里有一个特殊情况,那就是当你的其中一个操作数是一个具有单独维度(singular dimension)的张量的时候,TF会隐式地在它的单独维度方向填满(tile),以确保和另一个操作数的形状相匹配。所以,对一个[3,2]的张量和一个[3,1]的张量相加在TF中是合法的。(译者:这个机制继承自numpy的广播功能。其中所谓的单独维度就是一个维度为1,或者那个维度缺失,具体可参考numpy broadcast)。
import tensorflow as tf
a = tf.constant([[1., 2.], [3., 4.]]) b = tf.constant([[1.], [2.]]) # c = a + tf.tile(b, [1, 2]) c = a + b
- 1
- 2
- 3
- 4
- 5
- 6
广播机制允许我们在隐式情况下进行填充(tile),而这可以使得我们的代码更加简洁,并且更有效率地利用内存,因为我们不需要另外储存填充操作的结果。一个可以表现这个优势的应用场景就是在结合具有不同长度的特征向量的时候。为了拼接具有不同长度的特征向量,我们一般都先填充输入向量,拼接这个结果然后进行之后的一系列非线性操作等。这是一大类神经网络架构的共同套路(common pattern)
a = tf.random_uniform([5, 3, 5])
b = tf.random_uniform([5, 1, 6]) # concat a and b and apply nonlinearity tiled_b = tf.tile(b, [1, 3, 1]) c = tf.concat([a, tiled_b], 2) d = tf.layers.dense(c, 10, activation=tf.nn.relu)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
但是这个可以通过广播机制更有效地完成。我们利用事实f(m(x+y))=f(mx+my)f(m(x+y))=f(mx+my),简化我们的填充操作。因此,我们可以分离地进行这个线性操作,利用广播机制隐式地完成拼接操作。
pa = tf.layers.dense(a, 10, activation=None)
pb = tf.layers.dense(b, 10, activation=None)
d = tf.nn.relu(pa + pb)
- 1
- 2
- 3
事实上,这个代码足够通用,并且可以在具有抽象形状(arbitrary shape)的张量间应用:
def merge(a, b, units, activation=tf.nn.relu):
pa = tf.layers.dense(a, units, activation=None) pb = tf.layers.dense(b, units, activation=None) c = pa + pb if activation is not None: c = activation(c) return c
- 1
- 2
- 3
- 4
- 5
- 6
- 7
一个更为通用函数形式如上所述:
目前为止,我们讨论了广播机制的优点,但是同样的广播机制也有其缺点,隐式假设几乎总是使得调试变得更加困难,考虑下面的例子:
a = tf.constant([[1.], [2.]])
b = tf.constant([1., 2.])
c = tf.reduce_sum(a + b)
- 1
- 2
- 3
你猜这个结果是多少?如果你说是6,那么你就错了,答案应该是12.这是因为当两个张量的阶数不匹配的时候,在进行元素间操作之前,TF将会自动地在更低阶数的张量的第一个维度开始扩展,所以这个加法的结果将会变为[[2, 3], [3, 4]],所以这个reduce的结果是12.
(译者:答案详解如下,第一个张量的shape为[2, 1],第二个张量的shape为[2,]。因为从较低阶数张量的第一个维度开始扩展,所以应该将第二个张量扩展为shape=[2,2],也就是值为[[1,2], [1,2]]。第一个张量将会变成shape=[2,2],其值为[[1, 1], [2, 2]]。)
解决这种麻烦的方法就是尽可能地显示使用。我们在需要reduce某些张量的时候,显式地指定维度,然后寻找这个bug就会变得简单:
a = tf.constant([[1.], [2.]])
b = tf.constant([1., 2.])
c = tf.reduce_sum(a + b, 0)
- 1
- 2
- 3
这样,c的值就是[5, 7],我们就容易猜到其出错的原因。一个更通用的法则就是总是在reduce操作和在使用tf.squeeze
中指定维度。
Tensorflow 2.0:从 CSV 文件加载数据
如何解决Tensorflow 2.0:从 CSV 文件加载数据?
ML 和 Tensorflow 的新手,这是一个使用 Tensorflow 2.0 的学校项目。我正在尝试创建一个神经网络模型,该模型可以预测给定频率的简单天线的电场。我使用 MATLAB 对 500 根不同频率的天线进行建模以进行测试。 Matlab 输出 xyz 坐标中每个点的值,我将其转换为 CSV 文件。每个 CSV 文件本质上都是一个矩阵,我将矩阵转置为 3 列 440 行。这些文件将作为我的模型训练集。
但是,CSV 文件没有为每一列标记 x、y 和 z。有没有办法加载这 500 个文件来为每个 CSV 文件创建一个矩阵?有没有办法在不标记 x、y 和 z 的列的情况下做到这一点?
另外,我想指定每个矩阵(每个 csv 文件)的频率。最好创建 500 个单独的文件来指定频率值,还是有更好的方法来做到这一点?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
tensorflow for R中的警告-您的CPU支持该TensorFlow二进制文件未编译为使用的指令:AVX2
如何解决tensorflow for R中的警告-您的CPU支持该TensorFlow二进制文件未编译为使用的指令:AVX2?
我收到此警告,并且我知道这是基于性能的。但是,培训需要一段时间,所以我想尽可能地解决它。
I tensorflow/core/platform/cpu_feature_guard.cc:141] Your cpu supports instructions that this TensorFlow binary was not compiled to use: AVX2
python有一个解决方案,但是,我在R中使用keras
。我想知道是否有人知道如何在R中解决此问题
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
今天的关于如何*实际*读取TensorFlow中的CSV数据?和tensorflow读取csv文件的分享已经结束,谢谢您的关注,如果想了解更多关于CSV数据集不适合使用Tensorflow的内存、Effective TensorFlow Chapter 4: TensorFlow中的广播Broadcast机制【转】、Tensorflow 2.0:从 CSV 文件加载数据、tensorflow for R中的警告-您的CPU支持该TensorFlow二进制文件未编译为使用的指令:AVX2的相关知识,请在本站进行查询。
本文标签: