CNN数据增强(1)

数据增强(Data Augmentation

(本人水平有限,请广大读者批评指正!!!!)  

深度学习通常需要大量的数据作为支撑,看到那些公开的数据集,少的也有几十万张,但是在现实中,我们能拥有的数据集网络没有那么到。但是数据量少,往往会造成过拟合等问题,因此需要一些“奇巧淫技”来增强数据,正好本人在看斯坦福的CS231N课程中的这方面介绍,因此做个总结。

结合课程和网上查看的资料,将Data Augmentation总结如下:

1、水平/竖直翻转。

2、随机crop

3、颜色改变。

4、仿射/旋转变换

5、随机改变大小

6、加噪声

7、·······

        下面对上述方法中部分进行具体介绍:

1、Keras

Keras是以tensorflowtheano作为后端的一个极易上手的框架,本人比较懒,所以研究生阶段用的最多的也就是Keras。在Keras中专门有一个图像数据增加的工具ImageDataGenerator。它能满足数据增强的大部分需求。

直接上代码:

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img

Datagen = ImageDataGenerator(rotation_range=40,
			     shear_range=0.2,
			     zoom_range=0.2,
			     horizontal_flip=True,
			     vertical_flip = True
			     fill_mode='nearest')
#还有其他一些参数,具体请看:https://keras.io/preprocessing/image/ ,如去均值,标准化,ZCA白化,旋转,
#偏移,翻转,缩放等

img = load_img('../data/hand1.jpg')#获取一个PIL图像
x_img = img_to_array(img)
x_img = x_img.reshape((1,)+ x_img.shape)

i = 0
for img_batch in Datagen.flow(x_img,
			      batch_size=1,
			      save_to_dir='../data/pre_Data/'
			      save_prefix='hand',
			      save_format='jpeg'):
	i +=1
	if i > 20:
		break

2caffe

    现在在用caffe,想研究一下caffe中的数据增强,只发现mirror、scale、crop三种,查看了一些资料,需要自己添加一些数据增强的代码,因此最近一直在研究caffe源码(一个c++很烂的人研究源码,也是蛋疼),。

后续补充。



3、提供一个链接:https://github.com/aleju/imgaug

   看上去效果很好:

 

 

4、PCA Jittering的实现:

PCA Jittering最早是由Alex在他2012年赢得的ImageNet竞赛的那篇NIPS中提出的,首先按照RGB三个颜色通道计算均值和标准差,对网络的输入数据进行规范化,随后我们在整个训练集上计算了协方差矩阵,进行特征分解,得到特征向量和特征值,用来做PCA Jittering

本文根据:https://www.zhihu.com/question/35339639中提供的PCA Jittering的代码做了下实验。代码如下

# -*- coding: utf-8 -*-
"""
Created on Wed May 10 10:00:53 2017

@author: xx
"""

import numpy as np
import os
from PIL import Image, ImageOps
import argparse
import random
from scipy import misc

def PCA_Jittering(path):
    img_list = os.listdir(path)
    img_num = len(img_list)
    
    for i in range(img_num):
        img_path = os.path.join(path, img_list[i])
        img = Image.open(img_path)
        
        img = np.asanyarray(img, dtype = 'float32')
        
        img = img / 255.0
        img_size = img.size / 3
        img1 = img.reshape(img_size, 3)
        img1 = np.transpose(img1)
        img_cov = np.cov([img1[0], img1[1], img1[2]])
        lamda, p = np.linalg.eig(img_cov)
        
        p = np.transpose(p)
        
        alpha1 = random.normalvariate(0,3)
        alpha2 = random.normalvariate(0,3)
        alpha3 = random.normalvariate(0,3)
        
        v = np.transpose((alpha1*lamda[0], alpha2*lamda[1], alpha3*lamda[2]))    
        add_num = np.dot(p,v)
        
        img2 = np.array([img[:,:,0]+add_num[0], img[:,:,1]+add_num[1], img[:,:,2]+add_num[2]])
        
        img2 = np.swapaxes(img2,0,2)
        img2 = np.swapaxes(img2,0,1)
        save_name = 'pre'+str(i)+'.png'
        save_path = os.path.join(path, save_name)
        misc.imsave(save_path,img2)
        
        #plt.imshow(img2)
        #plt.show()

效果如下:




  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习算法,可以用于数据分类任务。Python是一种流行的编程语言,通常用于数据处理和机器学习。 在使用Python进行CNN数据分类时,我们可以按照以下步骤进行: 1. 数据预处理:首先,需要对原始数据进行预处理。这包括数据的清洗、缺失值的处理、特征的选择和标准化等。Python提供了丰富的库和工具,如pandas和scikit-learn,可以帮助我们进行数据预处理。 2. 构建卷积神经网络模型:使用Python的深度学习库,如TensorFlow或Keras,可以构建CNN模型。我们可以选择合适的模型架构,包括卷积层、池化层和全连接层等。此外,还可以添加正则化、dropout和批标准化等技术来提高模型的泛化能力和防止过拟合。 3. 模型训练:为了使CNN模型能够对数据进行分类,我们需要对其进行训练。通过将训练数据输入到模型中,并通过反向传播算法来调整模型的参数,以使模型能够学习数据的特征和模式。 4. 模型评估和优化:在模型训练完成后,我们需要对其进行评估和优化。使用测试数据集来评估模型的性能,可以计算准确率、精确率、召回率和F1值等指标来衡量模型的分类效果。如果模型性能不理想,可以尝试调整模型架构、调整超参数、增加训练数据量或使用数据增强方法进行优化。 以上就是使用Python进行CNN数据分类的基本步骤。这只是一个简单的概述,实际应用中还会涉及到更多的细节和技巧。希望这个回答能帮助你更好地理解并使用Python进行CNN数据分类。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值