zoukankan      html  css  js  c++  java
  • tensorflow数据加载与前处理

    一、数据加载

    1、加载文件夹下图片数据:不同类图片放在不同的文件夹下

    batch_size = 32  #next(iter(train_ds)),一次迭代32张图片
    img_height = 224
    img_width = 224 train_ds = tf.keras.preprocessing.image_dataset_from_directory(
      str(data_root), validation_split
    =0.2, subset="training", seed=123, image_size=(img_height, img_width), batch_size=batch_size  #data_root是分类图片路径
    )  
    print(train_ds.class_names)  #图片类别/文件夹个数

    2、加载tensorflow_datasets数据:自动将数据分成训练数据、验证数据、测试数据

    import tensorflow_datasets as tfds
    (train_ds, val_ds, test_ds), metadata = tfds.load( 'tf_flowers', split=['train[:80%]', 'train[80%:90%]', 'train[90%:]'], with_info=True, as_supervised=True, )
    print(metadata.features['label'].num_classes)  #dataset有几个类别
    get_label_name = metadata.features['label'].int2str
    get_label_name(0)  #label对应的类别

     二、数据前处理

    https://tensorflow.google.cn/tutorials/images/data_augmentation?hl=zh_cn

    1、用lambda表达式对整个数据集进行处理(5中也涉及)

    normalization_layer = tf.keras.layers.experimental.preprocessing.Rescaling(1./255)  #数据缩放到[0, 1]
    train_ds = train_ds.map(lambda x, y: (normalization_layer(x), y))

     2、通用数据增强层

    1)layers.Lambda层进行图像增强

    def random_invert_img(x, p=0.5):
        if  tf.random.uniform([]) < p:
            x = (255-x)
        else:
            x
        return x

    def random_invert(factor=0.5): return layers.Lambda(lambda x: random_invert_img(x, factor))

    random_invert(image)  #layers.Lambda会自动调用绑定的函数处理图片的每个像素

    2)通过subclassing新建一个层

    class RandomInvert(layers.Layer):
      def __init__(self, factor=0.5, **kwargs):
        super().__init__(**kwargs)
        self.factor = factor
      def call(self, x):
        return random_invert_img(x, 0.3)  #random_invert_img()函数上面有
    _
    = plt.imshow(RandomInvert()(image)[0])

    3、tf.image、tf.data实现数据增强管道或层

    1 flipped = tf.image.flip_left_right(image)
    2 grayscaled = tf.image.rgb_to_grayscale(image); tf.squeeze(grayscaled)
    3 saturated = tf.image.adjust_saturation(image, 3)
    4 bright = tf.image.adjust_brightness(image, 0.4)
    5 cropped = tf.image.central_crop(image, central_fraction= 0.5)
    6 rotated = tf.image.rot90(image)
    View Code

    4、随便变换()

    tf.image.stateless_random_brightness
    tf.image.stateless_random_contrast
    tf.image.stateless_random_crop
    tf.image.stateless_random_flip_left_right
    tf.image.stateless_random_flip_up_down
    tf.image.stateless_random_hue
    tf.image.stateless_random_jpeg_quality
    tf.image.stateless_random_saturation
    例如:
    seed = (i, 0)  # tuple of size (2,);相同种子,同样结果
    stateless_random_brightness = tf.image.stateless_random_brightness(
          image, max_delta=0.95, seed=seed)    #随机改变图片亮度
     stateless_random_contrast = tf.image.stateless_random_contrast(
          image, lower=0.1, upper=0.9, seed=seed)    #随机改变图片对比度
    stateless_random_crop = tf.image.stateless_random_crop(
          image, size=[210, 300, 3], seed=seed)    #随机扣取图片
    View Code

    5、数据集增强

     1 #下载数据集
     2 (train_datasets, val_ds, test_ds), metadata = tfds.load(
     3     'tf_flowers',
     4     split=['train[:80%]', 'train[80%:90%]', 'train[90%:]'],
     5     with_info=True,
     6     as_supervised=True,
     7 )
     8 #图像缩放
     9 def resize_and_rescale(image, label):
    10   image = tf.cast(image, tf.float32)
    11   image = tf.image.resize(image, [IMG_SIZE, IMG_SIZE])
    12   image = (image / 255.0)
    13   return image, label
    14 #带seed的增强函数
    15 def augment(image_label, seed):
    16   image, label = image_label
    17   image, label = resize_and_rescale(image, label)
    18   image = tf.image.resize_with_crop_or_pad(image, IMG_SIZE + 6, IMG_SIZE + 6)
    19   # Make a new seed
    20   new_seed = tf.random.experimental.stateless_split(seed, num=1)[0, :]
    21   # Random crop back to the original size
    22   image = tf.image.stateless_random_crop(
    23       image, size=[IMG_SIZE, IMG_SIZE, 3], seed=seed)
    24   # Random brightness
    25   image = tf.image.stateless_random_brightness(
    26       image, max_delta=0.5, seed=new_seed)
    27   image = tf.clip_by_value(image, 0, 1)
    28   return image, label
    View Code

    1)利用tf.data.experimental.Counter()

    (1)?创建一个计数器,并使用(counter, counter)压缩数据集,这将确保数据集中的每个图像斗鱼基于计数器的唯一值相关联

    Create a tf.data.experimental.Counter() object (let's call it counter) and zip the dataset with (counter, counter). This will ensure that each image in the dataset gets associated with a unique value (of shape (2,)) based on counter which later can get passed into the augment function as the seed value for random transformations.

    1 counter = tf.data.experimental.Counter()
    2 train_ds = tf.data.Dataset.zip((train_datasets, (counter, counter)))

    (2)利用映射函数处理数据集

    train_ds = (
        train_ds
        .shuffle(1000)
        .map(augment, num_parallel_calls=AUTOTUNE)
        .batch(batch_size)
        .prefetch(AUTOTUNE)
    )
    val_ds = (
        val_ds
        .map(resize_and_rescale, num_parallel_calls=AUTOTUNE)
        .batch(batch_size)
        .prefetch(AUTOTUNE)
    )
    test_ds = ......

    2)利用tf.random.Generator

    (1)创建映射函数

    Note: tf.random.Generator objects store RNG state in a tf.Variable, which means it can be saved as a checkpoint or in a SavedModel. For more details, please refer to Random number generation.

    rng = tf.random.Generator.from_seed(123, alg='philox')    # Create a generator
    #映射函数,映射过程如上一致
    def f(x, y):
      seed = rng.make_seeds(2)[0]
      image, label = augment((x, y), seed)
      return image, label    # A wrapper function for updating seeds
  • 相关阅读:
    Begin Example with Override Encoded SOAP XML Serialization
    State Machine Terminology
    How to: Specify an Alternate Element Name for an XML Stream
    How to: Publish Metadata for a WCF Service.(What is the Metadata Exchange Endpoint purpose.)
    Beginning Guide With Controlling XML Serialization Using Attributes(XmlSerializaiton of Array)
    Workflow 4.0 Hosting Extensions
    What can we do in the CacheMetaData Method of Activity
    How and Why to use the System.servicemodel.MessageParameterAttribute in WCF
    How to: Begin Sample with Serialization and Deserialization an Object
    A Test WCF Service without anything of config.
  • 原文地址:https://www.cnblogs.com/wllwqdeai/p/15056735.html
Copyright © 2011-2022 走看看