- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在为我想做的任务在 tensorflow 中制作一个输入管道。我已经设置了一个 TFRecord 数据集,该数据集已保存到磁盘上的文件中。
我正在尝试使用以下代码加载数据集(进行批处理并发送到实际的 ML 算法):
dataset = tf.data.TFRecordDataset(filename)
print("Starting mapping...")
dataset = dataset.map(map_func = read_single_record)
print("Mapping complete")
buffer = 500 # How large of a buffer will we sample from?
batch_size = 125
capacity = buffer + 2 * batch_size
print("Shuffling dataset...")
dataset = dataset.shuffle(buffer_size = buffer)
print("Batching dataset...")
dataset = dataset.batch(batch_size)
dataset = dataset.repeat()
print("Creating iterator...")
iterator = dataset.make_one_shot_iterator()
examples_batch, labels_batch = iterator.get_next()
但是,我在 dataset.map() 行上收到错误。我收到的错误如下所示:TypeError: Expected int64, got <tensorflow.python.framework.sparse_tensor.SparseTensor object at 0x00000000085F74A8> of type 'SparseTensor' instead.
read_single_record()
函数看起来像这样:
keys_to_features = {
"image/pixels": tf.FixedLenFeature([], tf.string, default_value = ""),
"image/label/class": tf.FixedLenFeature([], tf.int64, default_value = 0),
"image/label/numbb": tf.FixedLenFeature([], tf.int64, default_value = 0),
"image/label/by": tf.VarLenFeature(tf.float32),
"image/label/bx": tf.VarLenFeature(tf.float32),
"image/label/bh": tf.VarLenFeature(tf.float32),
"image/label/bw": tf.VarLenFeature(tf.float32)
}
features = tf.parse_single_example(record, keys_to_features)
image_pixels = tf.image.decode_image(features["image/pixels"])
print("Features: {0}".format(features))
example = image_pixels # May want to do some processing on this at some point
label = [features["image/label/class"],
features["image/label/numbb"],
features["image/label/by"],
features["image/label/bx"],
features["image/label/bh"],
features["image/label/bw"]]
return example, label
我不确定问题出在哪里。我从 tensorflow API 文档中得到了这段代码的想法,为了我的目的稍微修改了一下。我真的不知道从哪里开始尝试解决这个问题。
作为引用,这里是我生成 TFRecord 文件的代码:
def parse_annotations(in_file, img_filename, cell_width, cell_height):
""" Parses the annotations file to obtain the bounding boxes for a single image
"""
y_mins = []
x_mins = []
heights = []
widths = []
grids_x = []
grids_y = []
classes = [0]
num_faces = int(in_file.readline().rstrip())
img_width, img_height = get_image_dims(img_filename)
for i in range(num_faces):
clss, x, y, width, height = in_file.readline().rstrip().split(',')
x = float(x)
y = float(y)
width = float(width)
height = float(height)
x = x - (width / 2.0)
y = y - (height / 2.0)
y_mins.append(y)
x_mins.append(x)
heights.append(height)
widths.append(width)
grid_x, grid_y = get_grid_loc(x, y, width, height, img_width, img_height, cell_width, cell_height)
pixels = get_image_pixels(img_filename)
example = tf.train.Example(features = tf.train.Features(feature = {
"image/pixels": bytes_feature(pixels),
"image/label/class": int_list_feature(classes),
"image/label/numbb": int_list_feature([num_faces]),
"image/label/by": float_list_feature(y_mins),
"image/label/bx": float_list_feature(x_mins),
"image/label/bh": float_list_feature(heights),
"image/label/bw": float_list_feature(widths)
}))
return example, num_faces
if len(sys.argv) < 4:
print("Usage: python convert_to_tfrecord.py [path to processed annotations file] [path to training output file] [path to validation output file] [training fraction]")
else:
processed_fn = sys.argv[1]
train_fn = sys.argv[2]
valid_fn = sys.argv[3]
train_frac = float(sys.argv[4])
if(train_frac > 1.0 or train_frac < 0.0):
print("Training fraction (f) must be 0 <= f <= 1")
else:
with tf.python_io.TFRecordWriter(train_fn) as writer:
with tf.python_io.TFRecordWriter(valid_fn) as valid_writer:
with open(processed_fn) as f:
for line in f:
ex, n_faces = parse_annotations(f, line.rstrip(), 30, 30)
randVal = rand.random()
if(randVal < train_frac):
writer.write(ex.SerializeToString())
else:
valid_writer.write(ex.SerializeToString())
请注意,我删除了一些与 TFRecords 文件的实际序列化/创建无关的代码。
最佳答案
未测试,但映射函数似乎无法返回 SparseTensor
和 Tensor
的列表。
tf.VarLenFeature(tf.float32)
返回一个 SparseTensor
但 tf.FixedLenFeature([], tf.int64)
返回一个 张量
。
为了更好地进行批处理,我建议您只使用 Tensor
。
关于如何派生 label
的建议:
label = {
"image/label/class" : features["image/label/class"],
"image/label/numbb" : features["image/label/numbb"],
"image/label/by" : tf.sparse_tensor_to_dense(features["image/label/by"], default_value=-1),
"image/label/bx" : tf.sparse_tensor_to_dense(features["image/label/bx"], default_value=-1)
"image/label/bh" : tf.sparse_tensor_to_dense(features["image/label/bh"], default_value=-1)
"image/label/bw" : tf.sparse_tensor_to_dense(features["image/label/bw"], default_value=-1)
}
有关如何处理此映射输出的灵感,我建议使用 thread .
关于python - Tensorflow TFRecordDataset.map 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50600661/
如何在生成 TFRecordDataset 时跳过 TFRecord 文件中的条目? 给定一个 TFRecord 文件和 tf.contrib.data.TFRecordDataset 对象,我通过
我正在 Google Cloud Datalab 上的 Jupyter notebook 中测试 Tensorflow 模型。该模型设置为使用 TFRecordDataset的 TFRecord文件作
我正在为我想做的任务在 tensorflow 中制作一个输入管道。我已经设置了一个 TFRecord 数据集,该数据集已保存到磁盘上的文件中。 我正在尝试使用以下代码加载数据集(进行批处理并发送到实际
我正在使用 TFRecordDataset 迭代器作为输入来训练 Keras 模型。训练阶段运行良好,但当我调用 model.predict 时,模型仍在使用训练数据而不是新数据作为输入。 # Loa
我不清楚 tf.TFRecordDataset 中的 buffer_size 参数是什么做。假设我们有以下代码: dataset = dataset.shuffle(buffer_size=10000
我正在使用新的 tf.data API 为 CIFAR10 数据集创建迭代器。我正在从两个 .tfrecord 文件中读取数据。一个保存训练数据 (train.tfrecords),另一个保存测试数据
我有一个大型 numpy 整数数据集,我想用 GPU 对其进行分析。数据集太大,无法放入 GPU 上的主内存,因此我尝试将它们序列化为 TFRecord,然后使用 API 流式传输记录进行处理。下面的
注意事项: 这个问题延伸到之前的 question of mine .在那个问题中,我询问了将一些虚拟数据存储为 Example 和 SequenceExample 的最佳方法,想知道哪种方法更适合与
在 TF1 中,我可以使用 summary_iterator阅读摘要文件。但是现在,它会抛出警告 WARNING:tensorflow: tf_record_iterator (from tensor
我是一名优秀的程序员,十分优秀!