问题描述
对于一组图像,如果术语“数据增强”是要转换当前数据集(例如,crop / flip / rotate / ...),还是要通过添加裁剪的/翻转/旋转图像到初始数据集。据我了解,从这个question和这个one来看,这两者都意味着。如果我错了,请纠正我。
因此,我想使用Tensorflow数据集实现第二个:增加数据量。
我正在使用TFDS中的ImageNet数据(培训集不可用):
import tensorflow_datasets as tfds
ds = tfds.load('imagenet_a',split='test',as_supervised=True)
我想翻转图像:
def transform(image,label):
image = tf.image.flip_left_right(image)
return image,label
如果我直接将转换应用于数据集,则效果很好。但这并不会增加数据量:
ds = ds.map(transform)
因此,我尝试创建第二个数据集并将两者连接:
ds0 = ds.map(transform)
ds = ds.concatenate(ds0)
但是出现以下错误:
TypeError: Two datasets to concatenate have different types (tf.uint8,tf.int64) and (tf.float32,tf.int64)
是否可以通过串联两个数据集来增加训练集? 还是如何正确做? (或如何解决我的错误)
我知道ImageDataGenerator,但其中不包含我想要的转换
解决方法
正如错误明确指出的那样,两个数据集应该具有相同的数据类型,您可以使用 public function updateAuthUserPassword(Request $request)
{
$this->validate($request,[
'current' => 'required','newpassword' => 'required','password_confirmation' => 'required|same:newpassword'
]);
$user = User::find(Auth::id());
if (!Hash::check($request->current,$user->password)) {
return response()->json(['errors' => ['current'=> ['Current password does not match']]],422);
}
$user->password = Hash::make($request->newpassword);
$user->save();
return $user;
}
来实现这一点,但是对于大型数据集来说,这是一个繁忙的过程。
您还可以使用tf.data.experimental.sample_from_datasets
合并数据集下面是带有插图的代码。
tf.cast
原始示例图片:
import tensorflow_datasets as tfds
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing.image import img_to_array,array_to_img
ds,info = tfds.load('imagenet_a',split='test',as_supervised=True,with_info=True)
我要拍摄10张图像进行测试,并使用vis = tfds.visualization.show_examples(ds,info)
函数随机翻转这10张图像以创建新的数据集。
map()
合并数据集: