我正在尝试使用 ArcFace 层实现模型: https://github.com/4uiiurz1/keras-arcface
为此,我创建了一个 tf.data.dataset,如下所示:
images= tf.data.Dataset.from_tensor_slices(train.A_image.to_numpy())
target = tf.keras.utils.to_categorical(
train.Label.to_numpy(), num_classes=n_class, dtype='float32'
)
target = tf.data.Dataset.from_tensor_slices(target)
images= images.map(transform_img)
dataset = tf.data.Dataset.zip((images, target, target))
Run Code Online (Sandbox Code Playgroud)
当我打电话时model.fit(dataset)
我收到以下错误:
ValueError: Layer model expects 2 input(s), but it received 1 input tensors. Inputs received: [<tf.Tensor 'IteratorGetNext:0' shape=<unknown> dtype=float32>]
Run Code Online (Sandbox Code Playgroud)
但这应该按照以下方式工作:
有人能指出我的愚蠢吗?
谢谢!
编辑:这解决了一些问题:
#reads in filepaths to images from dataframe train
images = tf.data.Dataset.from_tensor_slices(train.image.to_numpy())
#converts labels to one hot encoding vector
target = tf.keras.utils.to_categorical(train.Label.to_numpy(), num_classes=n_class, dtype='float32')
#reads in the image …Run Code Online (Sandbox Code Playgroud) 我目前的理解是:
不同map_func:两个 interleave和flat_map期望“的函数映射数据集元素的数据集”。相反,map期望“将数据集元素映射到另一个数据集元素的函数”。
参数:两个interleave和map报价参数num_parallel_calls,而flat_map不会。此外,interleave 提供了这些神奇的参数 block_length 和 cycle_length。对于 cycle_length=1,文档说明 interleave 和 flat_map 的输出是相等的。
最后,我已经看到了数据加载管道没有交错以及与交错的人。任何建议何时使用interleavevs.map或flat_map将不胜感激
//编辑:如果我们从不同的数据集开始,我确实看到了 interleave 的值,例如在下面的代码中
files = tf.data.Dataset.list_files("/path/to/dataset/train-*.tfrecord")
dataset = files.interleave(tf.data.TFRecordDataset)
Run Code Online (Sandbox Code Playgroud)
但是,在如下场景中使用interleaveover有什么好处map吗?
files = tf.data.Dataset.list_files("/path/to/dataset/train-*.png")
dataset = files.map(load_img, num_parallel_calls=tf.data.AUTOTUNE)
Run Code Online (Sandbox Code Playgroud) 在《Hands on machine Learning with scikit-learn and tensorflow 2.0》一书的第 17 章中,他们使用 tf.data.Dataset 和 window() 方法将顺序数据集拆分为多个窗口:
n_steps = 100
window_length = n_steps + 1 # target = input shifted 1 character ahead
dataset = dataset.window(window_length, shift=1, drop_remainder=True)
Run Code Online (Sandbox Code Playgroud)
为了将顺序数据集分割成多个窗口,他们使用了以下方法:
dataset = dataset.flat_map(lambda window: window.batch(window_length))
Run Code Online (Sandbox Code Playgroud)
但是当我执行上面的那一行时,出现以下错误:
AttributeError Traceback (most recent call last)
<ipython-input-18-5b215fb4cb71> in <module>()
----> 1 dataset = dataset.flat_map(lambda window: window.batch(window_length))
10 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/data/ops/dataset_ops.py in flat_map(self, map_func)
1650 Dataset: A `Dataset`.
1651 """
-> 1652 return FlatMapDataset(self, map_func)
1653
1654 def interleave(self, …Run Code Online (Sandbox Code Playgroud) 我编写了一个自定义 keras 回调来检查来自生成器的增强数据。(有关完整代码,请参阅此答案tf.data.Dataset。)但是,当我尝试对 a 使用相同的回调时,它给了我一个错误:
File "/path/to/tensorflow_image_callback.py", line 16, in on_batch_end
imgs = self.train[batch][images_or_labels]
TypeError: 'PrefetchDataset' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)
keras 回调通常只适用于生成器,还是与我编写回调的方式有关?有没有办法修改我的回调或数据集以使其工作?
我认为这个难题由三部分组成。我对其中任何一个和所有的改变持开放态度。首先是自定义回调类中的init函数:
class TensorBoardImage(tf.keras.callbacks.Callback):
def __init__(self, logdir, train, validation=None):
super(TensorBoardImage, self).__init__()
self.logdir = logdir
self.file_writer = tf.summary.create_file_writer(logdir)
self.train = train
self.validation = validation
Run Code Online (Sandbox Code Playgroud)
其次,on_batch_end同一个类中的函数
def on_batch_end(self, batch, logs):
images_or_labels = 0 #0=images, 1=labels
imgs = self.train[batch][images_or_labels]
Run Code Online (Sandbox Code Playgroud)
三、实例化回调
import tensorflow_image_callback
tensorboard_image_callback = tensorflow_image_callback.TensorBoardImage(logdir=tensorboard_log_dir, train=train_dataset, validation=valid_dataset)
model.fit(train_dataset,
epochs=n_epochs,
validation_data=valid_dataset,
callbacks=[
tensorboard_callback,
tensorboard_image_callback
])
Run Code Online (Sandbox Code Playgroud)
一些尚未让我找到答案的相关主题:
我有三个不同的 .csv 数据集,我通常使用 pandas 读取它们并训练深度学习模型。每个数据都是一个 m 矩阵,其中 n 是样本数,m 是特征数。读取数据后,我进行一些重塑,然后使用以下方法将它们输入到我的深度学习模型中feed_dict:
data1 = pd.DataFrame(np.random.uniform(low=0, high=1, size=(10,3)), columns=['A', 'B', 'C'])
data2 = pd.DataFrame(np.random.uniform(low=0, high=1, size=(10,3)), columns=['A', 'B', 'C'])
data3 = pd.DataFrame(np.random.uniform(low=0, high=1, size=(10,3)), columns=['A', 'B', 'C'])
data = pd.concat([data1, data2, data2], axis=1)
# Some deep learning model that work with data
# An optimizer
with tf.compat.v1.Session() as sess:
sess.run(init)
sess.run(optimizer, feed_dict={SOME VARIABLE: data})
Run Code Online (Sandbox Code Playgroud)
然而,我的数据太大,现在无法放入内存,我想知道如何使用 tf.data 来读取数据,而不是使用 pandas。抱歉,如果我提供的脚本是伪代码而不是我的实际代码。
python deep-learning tensorflow tensorflow2.0 tf.data.dataset
我正在使用张量流 2.3.0
我有一个 python 数据生成器-
import tensorflow as tf
import numpy as np
vocab = [1,2,3,4,5]
def create_generator():
'generates a random number from 0 to len(vocab)-1'
count = 0
while count < 4:
x = np.random.randint(0, len(vocab))
yield x
count +=1
Run Code Online (Sandbox Code Playgroud)
我把它变成了一个 tf.data.Dataset 对象
gen = tf.data.Dataset.from_generator(create_generator,
args=[],
output_types=tf.int32,
output_shapes = (), )
Run Code Online (Sandbox Code Playgroud)
现在我想使用map方法对项目进行子采样,这样 tf 生成器永远不会输出任何偶数。
def subsample(x):
'remove item if it is present in an even number [2,4]'
'''
#TODO
'''
return x
gen = gen.map(subsample)
Run Code Online (Sandbox Code Playgroud)
如何使用 …
python-3.x tensorflow tensorflow-datasets tensorflow2.0 tf.data.dataset
我正在 Google Colab 上使用 Keras 进行图像分类。我使用 tf.keras.preprocessing.image_dataset_from_directory() 函数(https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image_dataset_from_directory)加载图像,该函数返回 tf.data.Dataset 对象:
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
data_dir,
validation_split=0.2,
subset="training",
seed=1234,
image_size=(img_height, img_width),
batch_size=batch_size,
label_mode="categorical")
Run Code Online (Sandbox Code Playgroud)
我发现当数据包含数千张图像时,model.fit() 将在训练多个批次后使用所有内存(我正在使用 Google Colab,并且可以看到 RAM 使用量在第一个 epoch 期间增长)。然后我尝试使用 Keras Sequence,这是将部分数据加载到 RAM 中的建议解决方案(https://www.tensorflow.org/api_docs/python/tf/keras/utils/Sequence):
class DatasetGenerator(tf.keras.utils.Sequence):
def __init__(self, dataset):
self.dataset = dataset
def __len__(self):
return tf.data.experimental.cardinality(self.dataset).numpy()
def __getitem__(self, idx):
return list(self.dataset.as_numpy_iterator())[idx]
Run Code Online (Sandbox Code Playgroud)
我用以下方法训练模型:
history = model.fit(DatasetGenerator(train_ds), ...)
问题是getitem ()必须返回一批带索引的数据。然而,我使用的 list() 函数必须将整个数据集放入 RAM 中,因此当 DatasetGenerator 对象实例化时会达到内存限制(tf.data.Dataset 对象不支持使用 [] 进行索引)。
我的问题:
提前致谢!