TensorFlow学习笔记(13)数据增强

        本篇笔记主要记录了TensorFlow中对图片数据进行增强的两种方法。

        1、使用keras预处理层

        tf.keras.layers.Ressize 改变图片大小

        tf.keras.layers.Rescaling    归一化

#对图片大小进行统一,并归一化

IMG_SIZE = 180


resize_and_rescale = tf.keras.Sequential([
  layers.Resizing(IMG_SIZE, IMG_SIZE),
  layers.Rescaling(1./255)
])

        tf.keras.layers.RandomFlip    随机翻转

        tf.keras.layers.RandomRotation    随机旋转

#对图片进行随机翻转和旋转

data_augmentation = tf.keras.Sequential([

layers.RandomFlip("horizontal_and_vertical"),
  layers.RandomRotation(0.2),
])

   tf.keras.layers.RandomContrast    随机调整图片的对比度

   tf.keras.layers.RandomCrop    随机裁剪图片

   tf.keras.layers.RandomZoom    随机缩放图片

        在进行数据增强的操作后,如何使用这些图像成了重中之重。目前有两种处理方式:

        ①使预处理层成为模型的一部分

model = tf.keras.Sequential([
  resize_and_rescale,
  data_augmentation,
  layers.Conv2D(16, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
])

        当使用model.save导出模型时,预处理层会和其他网络层一同保存。如果再次在其他数据集上使用此模型,会根据已经设定好的预处理层再次标准化图像。测试时,数据增强预处理层是停用的,只有在调用model.fit的时候,才会对输入图像进行增强。model.evaluate和model.predict并不会对图像进行处理。

        ②将预处理层应用于数据集

aug_ds = train_ds.map(
lambda x, y: (resize_and_rescale(x, training=True), y))

#匿名函数对x和y进行处理,使用map函数将处理后的x和y一一对应

        通过这种方式对数据集进行批次增强,数据增强在CPU上异步进行,此时可以使用dataset.prefetch预读取将GPU上的模型训练和数据预处理重叠。而且在调用model.save时,预处理层并不会随模型一并导出。在保存模型或者重现时,需要将其加到模型上。

演示:

batch_size = 32
AUTOTUNE = tf.data.AUTOTUNE

def prepare(ds, shuffle=False, augment=False):
  ds = ds.map(lambda x, y: (resize_and_rescale(x), y),
              num_parallel_calls=AUTOTUNE)

#数据增强

if shuffle:
    ds = ds.shuffle(1000)
  ds = ds.batch(batch_size)

#每32个分为一个batch

#仅仅在训练层使用数据增强 

if augment:

ds = ds.map(lambda x, y: (data_augmentation(x, training=True), y),
                num_parallel_calls=AUTOTUNE)
  return ds.prefetch(buffer_size=AUTOTUNE)
train_ds = prepare(train_ds, shuffle=True, augment=True)
val_ds = prepare(val_ds)
test_ds = prepare(test_ds)

model = tf.keras.Sequential([
  layers.Conv2D(16, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(32, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(64, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Flatten(),
  layers.Dense(128, activation='relu'),
  layers.Dense(num_classes)
])

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

epochs=5
history = model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=epochs
)

loss, acc = model.evaluate(test_ds)
print("Accuracy", acc)

2、使用tf.image

使用tf.data和tf.image编写数据增强层,常见的调整方式有:

tf.image.flip_left_right    左右翻转

tf.image.rgb_to_grayscale    变为灰度图

tf.image.adjust_brightness    调整亮度

tf.image.central_crop    裁剪图像中心区域

tf.image.adjust_saturation    调整饱和度

除此之外,还有一些随机变换帮助泛化和拓展数据的方式。

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

经过这些api处理的输出图像,仅仅取决于输入。在随机调整的过程中,每一步都要求输入一个随机的seed值,只要是同一个seed,无论调用多少次输出的都是相同的结果。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在神经网络训练完成后,我们可以使用模型对新的输入数据进行预测。以下是使用 TensorFlow 进行简单神经网络训练和测试的示例代码: ```python import tensorflow as tf # 定义输入数据 x = tf.placeholder(tf.float32, [None, input_size]) # 定义模型参数 W = tf.Variable(tf.zeros([input_size, num_classes])) b = tf.Variable(tf.zeros([num_classes])) # 定义模型 y = tf.nn.softmax(tf.matmul(x, W) + b) # 定义损失函数 y_ = tf.placeholder(tf.float32, [None, num_classes]) cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) # 定义优化器 train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy) # 训练模型 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(num_iterations): batch_xs, batch_ys = get_next_batch(train_data, train_labels, batch_size) sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) # 测试模型 correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) print("Accuracy: ", sess.run(accuracy, feed_dict={x: test_data, y_: test_labels})) ``` 在训练完成后,我们可以使用 `sess.run()` 函数来获取模型的输出。例如,如果我们想要对一个新的数据样本进行预测,我们可以将其传递给 `sess.run()` 函数的 `feed_dict` 参数,并获取模型的输出 `y`。下面是一个简单的示例: ```python # 定义要预测的数据 new_data = [[5.1, 3.5, 1.4, 0.2]] # 获取预测结果 prediction = sess.run(y, feed_dict={x: new_data}) # 打印预测结果 print(prediction) ``` 在上面的代码中,我们将 `new_data` 作为输入数据传递给模型,并使用 `sess.run()` 函数获取模型的输出 `y`。然后,我们打印预测结果即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值