gpt4 book ai didi

python - 如何使用 Tensorflow Dataset API 读取不同名称的文件而不评估文件名字符串

转载 作者:行者123 更新时间:2023-12-01 02:07:49 25 4
gpt4 key购买 nike

假设我收到了 csv 数据集文件,其文件名格式为 index_channel.csv,其中 index 是示例的索引(从 1 到 10000), channel 是 channel 的索引(从 1 到 5)。因此 7_3.csv 是第 7 个示例的第 3 个 channel 。我想加载所有这些 csv 文件并连接 channel 以获得正确的张量作为我的数据集。我缺少对使我能够执行此操作的函数的引用。下面是我到目前为止的代码。当我开始运行它时,它提示 TypeError: Expected str, bytes or os.PathLike object, not Tensor。我猜测它正在尝试评估表达式,而不是仅在调用 sess.run() 之后,但不确定如何规避它。

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

# Imports
import numpy as np
import tensorflow as tf
from tensorflow.contrib.data import Dataset, Iterator

def main(unused_argv):
train_imgs = tf.constant(["1","2","3"]) #just trying the 3 first examples
tr_data = Dataset.from_tensor_slices((train_imgs))
tr_data = tr_data.map(input_parser)

# create TensorFlow Iterator object
iterator = Iterator.from_structure(tr_data.output_types,
tr_data.output_shapes)
next_element = iterator.get_next()
training_init_op = iterator.make_initializer(tr_data)
with tf.Session() as sess:

# initialize the iterator on the training data
sess.run(training_init_op)
# get each element of the training dataset until the end is reached
while True:
try:
elem = sess.run(next_element)
print(elem)
except tf.errors.OutOfRangeError:
print("End of training dataset.")
break

def input_parser(index):
dic={}
for d in range(1,6):
a=np.loadtxt(open("./data_for_tf/" + index +"_M"+str(d)+".csv", "rb"), delimiter=",", skiprows=1)
dic[d]=tf.convert_to_tensor(a, dtype=tf.float32)
metric=np.stack((dic[1],dic[2],dic[3]))
return metric

抱歉,我是 TF 的新手。我的问题似乎微不足道,但我通过谷歌搜索找到的示例都没有回答我的问题。

最佳答案

在我看来,错误是通过使用 index 生成的。在:

a=np.loadtxt(open("./data_for_tf/" + index +"_M"+str(d)+".csv", "rb"), delimiter=",", skiprows=1)

正如您所怀疑的,当 TensorFlow 设置其声明性模型时,您的 input_parser 只会被调用一次 - 这会建立 TensorFlow 操作之间的关系以供以后评估。但是,您的 Python 调用(例如 numpy 操作)会在此初始化期间立即运行。就在此时,np.loadtxt正在尝试使用尚未指定的 TF 操作构建字符串。

事实上,您甚至不需要运行模型来生成错误(尝试删除 sess.run() )。

您会在 https://www.tensorflow.org/programmers_guide/datasets#preprocessing_data_with_datasetmap 的示例中注意到,他们使用 TF 文件访问函数读取数据:

filenames = ["/var/data/file1.txt", "/var/data/file2.txt"]

dataset = tf.data.Dataset.from_tensor_slices(filenames)

# Use `Dataset.flat_map()` to transform each file as a separate nested dataset,
# and then concatenate their contents sequentially into a single "flat" dataset.
# * Skip the first line (header row).
# * Filter out lines beginning with "#" (comments).

dataset = dataset.flat_map(
lambda filename: (
tf.data.TextLineDataset(filename)
.skip(1)
.filter(lambda line: tf.not_equal(tf.substr(line, 0, 1), "#"))))

它被设计为声明性 TF 模型的一部分(即在运行时解析文件名)。

以下是使用 TensorFlow 操作读取文件的更多示例:

https://www.tensorflow.org/get_started/datasets_quickstart#reading_a_csv_file

也可以使用命令式 Python 函数(请参阅第一个链接中的“使用 tf.py_func() 应用任意 Python 逻辑”),不过仅在没有其他选择的情况下才建议这样做。

所以,基本上,除非您使用 tf.py_fun()机制,您不能期望任何依赖于 TF 张量或运算的正常 Python 操作能够按预期工作。然而,它们可以用于循环构造来设置相互关联的 TF 操作。

更新:

这是一个示意性示例:

## For a simple example, I have four files <index>_<channel>_File.txt
## so, 1_1_File.txt, 1_2_File.txt

import tensorflow as tf

def input_parser(filename):
filesWithChannels = []

for i in range(1,3):
channel_data = tf.read_file(filename+'_'+str(i)+'_File.txt')

## Uncomment the two lines below to add csv parsing.
# channel_data = tf.sparse_tensor_to_dense(tf.string_split([channel_data],'\n'), default_value='')
# channel_data = tf.decode_csv(channel_data, record_defaults=[[1.],[1.]])

filesWithChannels.append(channel_data)

return tf.convert_to_tensor(filesWithChannels)


train_imgs = tf.constant(["1","2"]) # e.g.
tr_data = tf.data.Dataset.from_tensor_slices(train_imgs)
tr_data = tr_data.map(input_parser)

iterator = tr_data.make_one_shot_iterator()
next_element = iterator.get_next()

with tf.Session() as sess:
for i in range(2) :
out = sess.run(next_element)
print(out)

更新更新(添加 csv):

## For a simple example, I have four files <index>_<channel>_File.txt
## so, 1_1_File.txt, 1_2_File.txt

import tensorflow as tf

with tf.device('/cpu:0'):
def input_parser(filename):
filesWithChannels = []

for i in range(1,3):
channel_data = (tf.data.TextLineDataset(filename+'_'+str(i)+'_File.txt')
.map(lambda line: tf.decode_csv(line, record_defaults=[[1.],[1.]])))

filesWithChannels.append(channel_data)

return tf.data.Dataset.zip(tuple(filesWithChannels))

train_imgs = tf.constant(["1","2"]) # e.g.
tr_data = tf.data.Dataset.from_tensor_slices(train_imgs)
tr_data = tr_data.flat_map(input_parser)

iterator = tr_data.make_one_shot_iterator()
next_element = iterator.get_next()
next_tensor_element = tf.convert_to_tensor(next_element)

with tf.Session() as sess:
for i in range(2) :
out = sess.run(next_tensor_element)
print(out)

看看tf.decode_csv有关如何设置字段分隔符并使用 column_defaults 指定列号和默认值的详细信息.

关于python - 如何使用 Tensorflow Dataset API 读取不同名称的文件而不评估文件名字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48896762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com