我想知道在 TensorFlow 2.4 中迭代 tf.data.Dataset 的最有效方法是什么。
我正在使用典型的:
for example in dataset:
code
Run Code Online (Sandbox Code Playgroud)
但是,我测量了挂机时间,并且由于我的数据集很大,因此计算循环需要太多时间。还有其他选择可以减少计算时间吗?
我在 Windows 虚拟环境中尝试使用 TensorFlow 和 TensorFlow 数据集时遇到问题。当我尝试导入这些包时,收到以下错误:ModuleNotFoundError:没有名为“resource”的模块。
据我了解,Windows 上不需要“资源”模块,因此我不确定为什么会出现此错误。以下是我的环境以及我已经尝试过的详细信息:
我的问题是:在 Windows 上使用 TensorFlow 和 TensorFlow 数据集时,如何解决“没有名为‘资源’的模块”错误?为了在 Windows 上正确配置这些包,我需要做什么具体的事情?
预先感谢您的任何帮助。
我正在使用tensorflow的数据集API.用简单的案例测试我的代码.下面显示了我使用的简单代码.问题是,当数据集大小很小时,似乎数据集API返回的大小不一致.我确信有一个正确的方法来处理它.但即使我阅读了该页面和教程中的所有功能,我也找不到.
import numpy as np
import tensorflow as tf
data_source = tf.zeros([24, 200, 64, 64, 1]) #[number_of_video, steps, pixel_w, pixel_h, channel]
dataset = tf.contrib.data.Dataset.from_tensor_slices(data_source)
dataset = dataset.shuffle(buffer_size=100)
dataset = dataset.batch(16)
dataset = dataset.repeat()
iterator = tf.contrib.data.Iterator.from_structure(dataset.output_types, dataset.output_shapes)
next_element = iterator.get_next()
training_init_op = iterator.make_initializer(dataset)
with tf.Session() as sess:
sess.run(training_init_op)
next_elem = next_element.eval()
print(np.shape(next_elem))
next_elem = next_element.eval()
print(np.shape(next_elem))
next_elem = next_element.eval()
print(np.shape(next_elem))
next_elem = next_element.eval()
print(np.shape(next_elem))
next_elem = next_element.eval()
print(np.shape(next_elem))
next_elem = next_element.eval()
print(np.shape(next_elem))
next_elem = next_element.eval()
print(np.shape(next_elem))
Run Code Online (Sandbox Code Playgroud)
数据集是灰度视频.共有24个视频序列,步长均为200.帧大小为64乘64和单通道.我将批量大小设置为16,缓冲区大小设置为100.但代码的结果是,
(16, …Run Code Online (Sandbox Code Playgroud) 我正在使用具有以下属性的共享服务器训练带有tensorflow的resNet50:
ubuntu 16.04 3 gtx 1080 gpus tensorflow 1.3 python 2.7但总是在两个时期之后,在第三个时期,我遇到这个错误:
terminate called after throwing an instance of 'std::system_error'
what():
Resource temporarily unavailable
Aborted
Run Code Online (Sandbox Code Playgroud)
这是将tfrecord转换为数据集的代码:
filenames = ["balanced_t.tfrecords"]
dataset = tf.contrib.data.TFRecordDataset(filenames)
def parser(record):
keys_to_features = {
"mhot_label_raw": tf.FixedLenFeature((), tf.string,
default_value=""),
"mel_spec_raw": tf.FixedLenFeature((), tf.string,
default_value=""),
}
parsed = tf.parse_single_example(record, keys_to_features)
mel_spec1d = tf.decode_raw(parsed['mel_spec_raw'], tf.float64)
# label = tf.cast(parsed["label"], tf.string)
mhot_label = tf.decode_raw(parsed['mhot_label_raw'], tf.float64)
mel_spec = tf.reshape(mel_spec1d, [96, 64])
return {"mel_data": mel_spec}, mhot_label
dataset = dataset.map(parser)
dataset = dataset.batch(batch_size)
dataset = dataset.repeat(3) …Run Code Online (Sandbox Code Playgroud) 我发现reshuffle_each_iteration参数tf.Dataset.shuffle有点混乱。考虑以下代码:
import tensorflow as tf
flist = ["trimg1", "trimg2", "trimg3", "trimg4"]
filenames = tf.constant(flist)
train_x_dataset = tf.data.Dataset.from_tensor_slices((filenames))
train_x_dataset = train_x_dataset.shuffle(buffer_size=10, reshuffle_each_iteration=False)
it_train_x = train_x_dataset.make_initializable_iterator()
next_sample = it_train_x.get_next()
with tf.Session() as sess:
for epoch in range(3):
sess.run(it_train_x.initializer)
print("Starting epoch ", epoch)
while True:
try:
s = sess.run(next_sample)
print("Sample: ", s)
except tf.errors.OutOfRangeError:
break
Run Code Online (Sandbox Code Playgroud)
代码输出:
Starting epoch 0
Sample: b'trimg2'
Sample: b'trimg1'
Sample: b'trimg3'
Sample: b'trimg4'
Starting epoch 1
Sample: b'trimg4'
Sample: b'trimg3'
Sample: b'trimg2'
Sample: b'trimg1'
Starting …Run Code Online (Sandbox Code Playgroud) 我有5个tfrecords文件,每个对象一个.虽然训练我想从所有5个tfrecords中平均读取数据,即如果我的批量大小是50,我应该从第一个tfrecord文件获得10个样本,从第二个tfrecord文件获得10个样本,依此类推.目前,它只是从所有三个文件中顺序读取,即我从同一记录中获得50个样本.有没有办法从不同的tfrecords文件中提取样品?
我的输入管道中出现以下错误:
tensorflow.python.framework.errors_impl.InvalidArgumentError:无法在组件0中批量生成具有不同形状的张量.第一个元素具有形状[2,48,48,3],元素1具有形状[27,48,48,3].
用这个代码
dataset = tf.data.Dataset.from_generator(generator,
(tf.float32, tf.int64, tf.int64, tf.float32, tf.int64, tf.float32))
dataset = dataset.batch(max_buffer_size)
Run Code Online (Sandbox Code Playgroud)
这是完全合乎逻辑的,因为批处理方法尝试创建(batch_size,?,48,48,3)Tensor.但是我希望它为这种情况创建一个[29,48,48,3] Tensor.所以连接而不是堆栈.这可能与tf.data有关吗?
我可以在生成器函数中用Python进行连接,但我想知道这是否也可以使用tf.data管道
我已经将图像数据库转换为两个TFRecords,一个用于训练,另一个用于验证。我想使用这两个文件为数据输入keras训练一个简单的模型,但是出现了我无法理解的与数据形状有关的错误。
这是代码(所有大写字母的变量在其他地方定义):
def _parse_function(proto):
f = {
"x": tf.FixedLenSequenceFeature([IMG_SIZE[0] * IMG_SIZE[1]], tf.float32, default_value=0., allow_missing=True),
"label": tf.FixedLenSequenceFeature([1], tf.int64, default_value=0, allow_missing=True)
}
parsed_features = tf.parse_single_example(proto, f)
x = tf.reshape(parsed_features['x'] / 255, (IMG_SIZE[0], IMG_SIZE[1], 1))
y = tf.cast(parsed_features['label'], tf.float32)
return x, y
def load_dataset(input_path, batch_size, shuffle_buffer):
dataset = tf.data.TFRecordDataset(input_path)
dataset = dataset.shuffle(shuffle_buffer).repeat() # shuffle and repeat
dataset = dataset.map(_parse_function, num_parallel_calls=16)
dataset = dataset.batch(batch_size).prefetch(1) # batch and prefetch
return dataset.make_one_shot_iterator()
train_iterator = load_dataset(TRAIN_TFRECORDS, BATCH_SIZE, SHUFFLE_BUFFER)
val_iterator = load_dataset(VALIDATION_TFRECORDS, BATCH_SIZE, SHUFFLE_BUFFER)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(IMG_SIZE[0], …Run Code Online (Sandbox Code Playgroud) 有什么方法可以直接将.tfrecords文件拆分为多个.tfrecords文件,而无需回写每个Dataset示例?
按照本指南设置简单的tensorflow 2.0测试时,输入到keras输入层的输入是错误的,但仅在转换为数据集之后(假装具有正确的形状)。
当然可以从文档中运行colab笔记本,但是我无法弄清楚设置可能出了什么问题。任何提示表示赞赏!
在jupyter实验室中设置一些假数据:
data = np.random.random((1000, 32,))
labels = np.random.random((1000, 10,))
dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset.shuffle(buffer_size=1024).batch(32)
>> <BatchDataset shapes: ((None, 32), (None, 10)), types: (tf.float64, tf.float64)>
Run Code Online (Sandbox Code Playgroud)
使用功能性keras API构建简化的模型(顺序没有区别):
inputs = keras.Input(shape=(32,))
hidden = keras.layers.Dense(64, activation='relu')(inputs)
hidden = keras.layers.Dense(64, activation='relu')(hidden)
output = keras.layers.Dense(10, activation='softmax')(hidden)
model = keras.Model(inputs=inputs, outputs=output)
model.compile(loss='mse',
optimizer=keras.optimizers.Adam(0.001),
metrics=['mae'])
Run Code Online (Sandbox Code Playgroud)
在numpy数组上运行模型拟合工作符合预期:
model.fit(data, labels, epochs=10, batch_size=32)
>> Epoch 1/10
>> 1000/1000 [==============================] - 0s 124us/sample - loss: 0.2472 - mae: 0.4143
[...]
>> Epoch 10/10
>> 1000/1000 [==============================] …Run Code Online (Sandbox Code Playgroud)