tf.data,用不同的数据构造一个batch?
tf.data, construct a batch with different data?
我想构造一个batchsize为16的batch数据,使用tf.data
,其中[:8]
是一种数据A,[8:16]
是一种数据B。
不用tf.data
也很容易做到。如果使用tf.data
,代码可以是:
def _decode_record(record, name_to_features):
example = tf.parse_single_example(record, name_to_features)
return example
dataA = tf.data.TFRecordDataset(input_files)
dataA = dataA.apply(
tf.contrib.data.map_and_batch(
lambda record: _decode_record(record, name_to_features),
batch_size=batch_size)
)
接下来怎么办?
我试试:
dataB = tf.data.TFRecordDataset(input_files2)
dataB = dataB.apply(
tf.contrib.data.map_and_batch(
lambda record: _decode_record(record, name_to_features),
batch_size=batch_size)
)
dataC = dataA.concatenate(dataB)
但是concatenate
是:将整个数据集dataB
附加到dataA
的末尾。
对于 concatenate
,请注意 name_to_features
对于 dataA
和 dataB
应该相同,这意味着我应该填充很多虚拟数据。
我不想用tf.cond
或tf.where
来判断model_fn
和tf.estimator
里面的不同数据,也很难调试。
一种解决方法是判断不同的数据:
import tensorflow as tf
data_type = tf.constant([1, 2, 1, 2])
where_index1 = tf.where(tf.equal(data_type, 1))
where_index2 = tf.where(tf.equal(data_type, 2))
data = tf.constant([[10,10],[20,20],[30,30],[40,40]])
data1 = tf.gather_nd(data,where_index1)
data2 = tf.gather_nd(data,where_index2)
sess = tf.Session()
print(sess.run(data1))
print(sess.run(data2))
但这个答案不知何故绕过了问题。
您可以将数据集压缩在一起,然后从(数据,数据)对构建批次:
import tensorflow as tf
dataset_1 = tf.data.Dataset.from_tensors(1).repeat(100)
dataset_2 = tf.data.Dataset.from_tensors(2).repeat(100)
dataset = tf.data.Dataset.zip((dataset_1, dataset_2))
dataset = dataset.batch(8)
dataset = dataset.map(lambda a, b: tf.concat([a, b], 0))
生产
tf.Tensor([1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2], shape=(16,), dtype=int32)
tf.Tensor([1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2], shape=(16,), dtype=int32)
tf.Tensor([1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2], shape=(16,), dtype=int32)
tf.Tensor([1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2], shape=(16,), dtype=int32)
...
我想构造一个batchsize为16的batch数据,使用tf.data
,其中[:8]
是一种数据A,[8:16]
是一种数据B。
不用tf.data
也很容易做到。如果使用tf.data
,代码可以是:
def _decode_record(record, name_to_features):
example = tf.parse_single_example(record, name_to_features)
return example
dataA = tf.data.TFRecordDataset(input_files)
dataA = dataA.apply(
tf.contrib.data.map_and_batch(
lambda record: _decode_record(record, name_to_features),
batch_size=batch_size)
)
接下来怎么办? 我试试:
dataB = tf.data.TFRecordDataset(input_files2)
dataB = dataB.apply(
tf.contrib.data.map_and_batch(
lambda record: _decode_record(record, name_to_features),
batch_size=batch_size)
)
dataC = dataA.concatenate(dataB)
但是concatenate
是:将整个数据集dataB
附加到dataA
的末尾。
对于 concatenate
,请注意 name_to_features
对于 dataA
和 dataB
应该相同,这意味着我应该填充很多虚拟数据。
我不想用tf.cond
或tf.where
来判断model_fn
和tf.estimator
里面的不同数据,也很难调试。
一种解决方法是判断不同的数据:
import tensorflow as tf
data_type = tf.constant([1, 2, 1, 2])
where_index1 = tf.where(tf.equal(data_type, 1))
where_index2 = tf.where(tf.equal(data_type, 2))
data = tf.constant([[10,10],[20,20],[30,30],[40,40]])
data1 = tf.gather_nd(data,where_index1)
data2 = tf.gather_nd(data,where_index2)
sess = tf.Session()
print(sess.run(data1))
print(sess.run(data2))
但这个答案不知何故绕过了问题。
您可以将数据集压缩在一起,然后从(数据,数据)对构建批次:
import tensorflow as tf
dataset_1 = tf.data.Dataset.from_tensors(1).repeat(100)
dataset_2 = tf.data.Dataset.from_tensors(2).repeat(100)
dataset = tf.data.Dataset.zip((dataset_1, dataset_2))
dataset = dataset.batch(8)
dataset = dataset.map(lambda a, b: tf.concat([a, b], 0))
生产
tf.Tensor([1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2], shape=(16,), dtype=int32)
tf.Tensor([1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2], shape=(16,), dtype=int32)
tf.Tensor([1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2], shape=(16,), dtype=int32)
tf.Tensor([1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2], shape=(16,), dtype=int32)
...