我对PyTorch中执行的数据扩充有点困惑.现在,据我所知,当我们执行数据扩充时,我们将保留原始数据集,然后添加其他版本(Flipping,Cropping ...等).但这似乎并没有发生在PyTorch中.据我data.transforms
所知,当我们在PyTorch中使用时,它会逐一应用它们.例如:
data_transforms = {
'train': transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
'val': transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
}
Run Code Online (Sandbox Code Playgroud)
在这里,对于训练,我们首先随机裁剪图像并调整其形状(224,224)
.然后我们拍摄这些(224,224)
图像并水平翻转它们.因此,我们的数据集现在只包含水平翻转的图像,因此在这种情况下我们的原始图像会丢失.
我对吗?这种理解是否正确?如果没有,那么我们在上面的代码(取自官方文档)中告诉PyTorch在哪里保留原始图像并将它们调整到预期的形状(224,224)
?
谢谢
尝试使用 Tensorflow 版本 2.7.0 保存具有数据增强层的模型时出现错误。
这是数据增强的代码:
input_shape_rgb = (img_height, img_width, 3)
data_augmentation_rgb = tf.keras.Sequential(
[
layers.RandomFlip("horizontal"),
layers.RandomFlip("vertical"),
layers.RandomRotation(0.5),
layers.RandomZoom(0.5),
layers.RandomContrast(0.5),
RandomColorDistortion(name='random_contrast_brightness/none'),
]
)
Run Code Online (Sandbox Code Playgroud)
现在我像这样构建我的模型:
# Build the model
input_shape = (img_height, img_width, 3)
model = Sequential([
layers.Input(input_shape),
data_augmentation_rgb,
layers.Rescaling((1./255)),
layers.Conv2D(16, kernel_size, padding=padding, activation='relu', strides=1,
data_format='channels_last'),
layers.MaxPooling2D(),
layers.BatchNormalization(),
layers.Conv2D(32, kernel_size, padding=padding, activation='relu'), # best 4
layers.MaxPooling2D(),
layers.BatchNormalization(),
layers.Conv2D(64, kernel_size, padding=padding, activation='relu'), # best 3
layers.MaxPooling2D(),
layers.BatchNormalization(),
layers.Conv2D(128, kernel_size, padding=padding, activation='relu'), # best 3
layers.MaxPooling2D(),
layers.BatchNormalization(),
layers.Flatten(),
layers.Dense(128, activation='relu'), # best 1 …
Run Code Online (Sandbox Code Playgroud) 我正在使用TensorDataset
从 numpy 数组创建数据集。
# convert numpy arrays to pytorch tensors
X_train = torch.stack([torch.from_numpy(np.array(i)) for i in X_train])
y_train = torch.stack([torch.from_numpy(np.array(i)) for i in y_train])
# reshape into [C, H, W]
X_train = X_train.reshape((-1, 1, 28, 28)).float()
# create dataset and dataloaders
train_dataset = torch.utils.data.TensorDataset(X_train, y_train)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64)
Run Code Online (Sandbox Code Playgroud)
如何将数据增强(转换)应用于TensorDataset
?
例如,使用ImageFolder
,我可以将转换指定为其参数之一torchvision.datasets.ImageFolder(root, transform=...)
。
根据PyTorch 团队成员之一的回复,默认情况下不支持。有没有其他方法可以做到这一点?
随意询问是否需要更多代码来解释问题。
我根据官方TensorFlow教程使用数据增强。首先,我创建一个具有增强层的顺序模型:
def _getAugmentationFunction(self):
if not self.augmentation:
return None
pipeline = []
pipeline.append(layers.RandomFlip('horizontal_and_vertical'))
pipeline.append(layers.RandomRotation(30))
pipeline.append(layers.RandomTranslation(0.1, 0.1, fill_mode='nearest'))
pipeline.append(layers.RandomBrightness(0.1, value_range=(0.0, 1.0)))
model = Sequential(pipeline)
return lambda x, y: (model(x, training=True), y)
Run Code Online (Sandbox Code Playgroud)
然后,我在数据集上使用映射函数:
data_augmentation = self._getAugmentationFunction()
self.train_data = self.train_data.map(data_augmentation,
num_parallel_calls=AUTOTUNE)
Run Code Online (Sandbox Code Playgroud)
该代码按预期工作,但我收到以下警告:
WARNING:tensorflow:Using a while_loop for converting RngReadAndSkip
WARNING:tensorflow:Using a while_loop for converting Bitcast
WARNING:tensorflow:Using a while_loop for converting Bitcast
WARNING:tensorflow:Using a while_loop for converting StatelessRandomUniformV2
WARNING:tensorflow:Using a while_loop for converting RngReadAndSkip
WARNING:tensorflow:Using a while_loop for converting Bitcast
WARNING:tensorflow:Using a while_loop for …
Run Code Online (Sandbox Code Playgroud) 假设您有一个数据集,其中包含图像和.csv
每个图像的一些数据。您的目标是创建一个具有卷积分支和另一个分支(在我的情况下为 MLP)的 NN。
现在,有很多关于如何创建网络的指南(这里有一个,另一个),这不是问题。
这里的问题是我如何以[[convolution_input, other_features], target]
何时convolution_input
来自添加增强图像的 Keras流的形式创建迭代器。ImageDataGenerator
更具体地说,当第 n 个图像(可能是增强图像或不是增强图像)被馈送到 NN 时,我希望它在other_features
.
我发现很少尝试(这里和这里,第二个看起来很有希望,但我无法弄清楚如何处理增强图像)正是这样做的,但他们似乎没有考虑到 Keras 生成器可能进行的数据集操作做。
要在CutMix
orMixUp
类型扩充中创建类标签,我们可以对两个标签使用beta
例如np.random.beta
orscipy.stats.beta
和执行以下操作:
label = label_one*beta + (1-beta)*label_two
Run Code Online (Sandbox Code Playgroud)
但是如果我们有两个以上的图像呢?在YoLo4 中,他们尝试了一种有趣的增强,称为Mosaic Augmentation,用于对象检测问题。与CutMix
或不同MixUp
,这种增强创建了具有4 个图像的增强样本。在物体检测的情况下,我们可以计算每个实例坐标的偏移,从而可以获得正确的基本事实,这里。但是对于仅图像分类的情况,我们怎么做呢?
这是一个启动器。
import tensorflow as tf
import matplotlib.pyplot as plt
import random
(train_images, train_labels), (test_images, test_labels) = \
tf.keras.datasets.cifar10.load_data()
train_images = train_images[:10,:,:]
train_labels = train_labels[:10]
train_images.shape, train_labels.shape
((10, 32, 32, 3), (10, 1))
Run Code Online (Sandbox Code Playgroud)
这是我们为此增强编写的函数;(`内-外循环太丑了!请建议我们是否可以有效地做到这一点。)
label = label_one*beta + (1-beta)*label_two
Run Code Online (Sandbox Code Playgroud)
增强样本,目前标签错误。
data, label = mosaicmix(train_images, train_labels, …
Run Code Online (Sandbox Code Playgroud) 我无法理解 keras 的 ImageDataGenerator 中剪切参数的影响
我曾尝试通过 ImageDataGenerator 中的 apply_transform 成员函数使用图像来应用剪切。应用此功能后,我可以看到图像似乎被旋转和拉伸。但我无法理解它到底做了什么。
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
import numpy as np
(train_x, train_y) , (test_x,test_Y) = cifar10.load_data()
img = train_x[0]
img_gen = ImageDataGenerator()
shear_intensity = np.arange(0,110,10, dtype = int)
nrow = 4
ncol = 3
plt.figure(figsize = (14,14))
for i,shear in enumerate(shear_intensity):
plt.title(f'shear intensity : {shear}')
plt.subplot(nrow, ncol, i+1)
plt.imshow(img_gen.apply_transform(img, {'shear' : shear}))
plt.show()
Run Code Online (Sandbox Code Playgroud)
图像确实有一些变化,但我无法理解效果。
我知道我可以使用tensorflow旋转图像tf.contrib.image.rotate
。但是,假设我想以弧度为单位,以-0.3到0.3之间的角度随机应用旋转,如下所示:
images = tf.contrib.image.rotate(images, tf.random_uniform(shape=[batch_size], minval=-0.3, maxval=0.3, seed=mseed), interpolation='BILINEAR')
Run Code Online (Sandbox Code Playgroud)
到目前为止,这将正常工作。但是,当批次大小在最后一次迭代中发生变化并且出现错误时,就会出现问题。那么,如何解决此代码并使它在所有情况下都能正常工作?请注意,输入图像是使用tf.data.Dataset
api 馈送的。
任何帮助深表感谢!!
我正在研究对脏图像文档进行去噪。我想创建一个数据集,其中添加合成噪声来模拟现实世界的混乱伪影。模拟污垢可能包括咖啡渍、褪色的太阳斑、折角的页面、大量皱纹等等。我该怎么做呢?
干净图像示例:
添加合成噪声后:
如何随机获得上面显示的图像?
image machine-learning image-processing random-seed data-augmentation
目前,我已经设法解决了这个问题,但它比我需要的要慢。大约需要:500k 样本需要 1 小时,整个数据集约为 100M 样本,100M 样本需要约 200 小时。
硬件/软件规格:RAM 8GB、Windows 11 64 位、Python 3.8.8
问题:
我有一个 .csv(~13GB)的数据集,其中每个样本都有一个值和几个月的相应开始结束期。我想创建一个数据集,其中每个样本都具有相同的值,但引用每个特定的值月。
例如:
从:
idx | 开始日期 | 结束日期 | 月 | 年 | 值
0 | 2022 年 5 月 20 日 | 2022 年 7 月 20 日 | 0 | 0 | X
到:
0 | 2022 年 5 月 20 日 | 2022 年 7 月 20 日 | 5 | 2022 | X
1 | 2022 年 5 月 …
python ×8
keras ×5
tensorflow ×4
pytorch ×3
csv ×1
dataset ×1
image ×1
large-data ×1
pandas ×1
random-seed ×1