2017-03-06 22:29:31 qq_23981335 阅读数 8261
  • 深度学习数据科学和自然语言处理教程

    该视频教程探索一些自然语言处理技术的最新进展、深度学习在自然语言处理技术领域的应用、实践和数据资源,以及使用英特尔的Nervanan Platform的企业自然语言处理的应用案例和使用英特尔® AI技术的NLP企业精华案例。

    543 人正在学习 去看看 CSDN讲师

本文主要讲深度学习中的数据预处理方法,主要参考NGUFLDL教程以及其他一些博客和论文进行总结,UFLDL数据预处理教程链接为

http://deeplearning.stanford.edu/wiki/index.php/数据预处理

数据预处理在众多深度学习算法中都起着重要作用,通常所讲的预处理包括数据归一化和白化。以下分别对数据归一化和白化进行说明。

数据归一化数据归一化(Data Normalization)是数据预处理的第一步,有很多方法,如常见的高斯归一化、最大最小值归一化等,而在深度学习中常用的是以下几种:

1)简单缩放 (Simple Rescaling

在简单缩放中,我们的目的是通过对数据的每一个维度的值进行重新调节(这些维度可能是相互独立的),使得最终的数据向量落在 [0,1][  1,1] 的区间内(根据数据情况而定),以满足应用需求。例如,在sparse auto-encoder中,由于网络的输出和输入是近似相等的,而隐含层和输出层神经元通常采用的是sigmoid函数作为激活函数,该函数值域为[0,1],因此为了保证输出等于输入,通常需要将输入缩放至[0,1]这个范围,然后再进行训练。

2)逐样本均值消减(Per-example mean subtraction

逐样本均值消减,也称为移除直流分量(remove DC),当数据时平稳的(stationary),即数据每一个维度的统计都服从相同分布,可以考虑在每个样本上减去数据的统计平均值(逐样本计算,即分别计算各样本的均值,然后各样本减去其对应的均值)。自然图像具有平稳的性质,所以这种归一化方法也是比较常用的。对自然图像应用PCA算法时候,通常也会这样处理,参考以下链接:

http://deeplearning.stanford.edu/wiki/index.php/PCA

注意:通常这种方法只用于灰度图像,因为彩色图像不同色彩通道中的像素并不都存在平稳特性。此外,对于教程这部分内容还有点疑惑,“对图像数据应用PCA算法”这部分内容上面讲的是标准的PCA处理方法(各维度去均值),而下面给的公式却是单独处理每个图像块(逐样本去均值)。

3)特征标准化(Feature Standardization

特征标准化的目的是使数据集中所有特征都具有零均值和单位方差,即数据的每一个维度具有零均值和单位方差,这也是比较常见的一种归一化方法,比如使用SVM时候也要进行类似处理。在实际应用中,特征标准化的具体做法是:首先计算每一个维度上数据的均值(使用全体数据计算),之后在每一个维度上都减去该均值。下一步便是在数据的每一维度上除以该维度上数据的标准差。

                                                        非监督特征学习之数据预处理


例如X是一个训练样本集,包含m个训练样本且每个训练样本的维数是n。应用特征标准化时先计算各行数据的均值 

                                                             非监督特征学习之数据预处理

然后样本集X减去该均值得到零均值化后的样本集XX。之后XX的各行除以该行数据的标准差就会得到特征标准化后的样本。

总结:以上有三种方法,具体预处理时候到底该如何选择预处理方法呢?一般可以根据自己的需要来选择(或者说数据类型)。

若图像是自然灰度图像,由于灰度图像具有平稳特性,通常可选择第二种方法,即移除直流分量(逐样本移除直流分量后还可以继续逐样本除以各样本的标准差,不过这一步通常不做,因为其平稳特性)。

若图像是自然彩色图像,由于色彩通道间并不存在平稳特性,因此通常对数据进行特征缩放(使像素值位于 [0,1] 区间)。然后再进行PCA/ZCA白化等操作,在白化前需进行特征分量均值归零(即使特征的每一个维度具有零均值,通常不需要除以各维度数据的标准差,因为各维度标准差很接近,可以对上文中的X进行验证)。在UFLDL教程的练习中(linear decoder)采用的是这种方法,而在有些论文中,也会采用第二种方法(逐样本去均值和除以标准差),如论文“An Analysis of Single-Layer Networks in Unsupervised Feature Learning”,这样在后续白化处理时是不是还需要再对各维度进行零均值化(因为计算协方差矩阵时需要这一步),论文里这点没说明。因此应用时建议根据练习中的方法来处理。

若图像是遥感图像,可采用linear decoder这个练习中的处理方法

 

PCA/ZCAzero-phase component analysis)白化数据归一化后的一个处理步骤就是数据白化。关于白化的基本知识可参考教程:

http://deeplearning.stanford.edu/wiki/index.php/Whitening

在进行 PCA/ZCA 白化时,首先使特征零均值化是很有必要的, 这一步需要在计算协方差矩阵前完成(计算协方差矩阵前的必要处理)。

总结:其实数据归一化和白化可以合并成一部分,即数据白化。因为白化前肯定需要进行一些必要的数据归一化,比如计算协方差矩阵前需进行特征零均值化操作。

此外关于预处理这部分内容,还可以参考博客:

http://www.cnblogs.com/tornadomeet/archive/2013/04/12/3016319.html

2019-06-19 19:33:11 gm_Ergou 阅读数 656
  • 深度学习数据科学和自然语言处理教程

    该视频教程探索一些自然语言处理技术的最新进展、深度学习在自然语言处理技术领域的应用、实践和数据资源,以及使用英特尔的Nervanan Platform的企业自然语言处理的应用案例和使用英特尔® AI技术的NLP企业精华案例。

    543 人正在学习 去看看 CSDN讲师

深度学习的三大要素:数据、算法、算力。
数据在深度学习中有着着重要的地位,数据集的好坏决定了模型的训练结果,由于可见数据预处理的重要性。
本文简单介绍一下如何初步处理数据,给数据分类,打标签。

例:
现在有几万张照片,每张照片的文件名中包含了年龄、性别等信息,假如我们现在需要训练一个识别年龄的模型;
首先需要进行图片预处理,第一步就是把照片按不同年龄段筛选出来,然后打上年龄标签进行分类,再进行转tf格式(之前文章介绍过怎么转格式),最后得到数据集拿去训练。

# -*- coding: UTF-8 -*- 
import re
import os
import shutil
from PIL import Image


#打开txt文本
f1=open('F:/TF2/new/txt/1/data-clear-new.txt','r')
txt_path="F:/TF2/new/data-pic/txt/"
f15=open(txt_path+'20.txt','w+')
f20=open(txt_path+'21-25.txt','w+')
f25=open(txt_path+'26-30.txt','w+')
f30=open(txt_path+'31-35.txt','w+')
f35=open(txt_path+'36-40.txt','w+')
f40=open(txt_path+'41-45.txt','w+')
f45=open(txt_path+'45.txt','w+')

#获取年龄和文件名
for line in f1.readlines():
    file_split=line.split() #以空格为分割符,把关键词分割出来

    old_name=file_split[0]   #原文件名
    old_back=os.path.splitext(old_name)[0]  #分离文件名与后缀
    # print(old_back)

    age=int(file_split[1])   #年龄
    # print(age)

    sub=file_split[2]   #性别
    # print(sub)

    folder=file_split[3]   #原文件夹名称
    # print(folder)
    root_path="F:/TF2/new/tf2-data-clear/"
    save_path = "F:/TF2/new/data-pic/"
    if age <= 20:
        print(line)
        f15.write(line)
        shutil.move(root_path + old_name, save_path + "20/" + old_name)

    if age >= 21 and age <= 25:
        f20.write(line)
        shutil.move(root_path + old_name, save_path + "21-25/" + old_name)

    if age >= 26 and age <= 30:
        f25.write(line)
        shutil.move(root_path + old_name, save_path + "26-30/" + old_name)

    if age >= 31 and age <= 35:
        f30.write(line)
        shutil.move(root_path + old_name, save_path + "31-35/" + old_name)

    if age >= 36 and age <= 40:
        f35.write(line)
        shutil.move(root_path + old_name, save_path + "36-40/" + old_name)

    if age >= 41 and age <= 45:
        f40.write(line)
        shutil.move(root_path + old_name, save_path + "41-45/" + old_name)

    if age > 45:
        f45.write(line)
        shutil.move(root_path + old_name, save_path + "45/" + old_name)

f1.close()
f20.close()
f25.close()
f30.close()
f35.close()
f40.close()
f45.close()

以上结果得到6个不同年龄段的数据集,并且每一张照片都有一条txt记录了文件名和年龄,作为标签。

2019-01-08 11:18:10 qq_23149979 阅读数 378
  • 深度学习数据科学和自然语言处理教程

    该视频教程探索一些自然语言处理技术的最新进展、深度学习在自然语言处理技术领域的应用、实践和数据资源,以及使用英特尔的Nervanan Platform的企业自然语言处理的应用案例和使用英特尔® AI技术的NLP企业精华案例。

    543 人正在学习 去看看 CSDN讲师

0 引言

在进行深度学习处理较大数据集时,往往会出现数据读取困难的情况。有人提出“是否可以将数据创建成多个数据集文件,训练过程中依次读取并训练各个数据集?”。本文详细阐述了一种将大数据创建成多个csv文件的方法。

1 创建

以手头测试为例,data文件夹下保存10组数据,每组数据有几千甚至几万不等的jpg格式灰度图片,图片大小为64×64。

1.1 单个csv数据集文件创建

对于数据集不大的数据,通常只创建一个数据集文件便可。采用以下代码:

import os
import numpy as np
import cv2
import tensorflow as tf

folderpath='./data/'
folddirs = os.listdir(folderpath)
all_train_count=0
all_test_count=0
all_count=0
trainrate=0.9
interval=int(10*trainrate+1)
x_train = []
x_test = []
y_train = []
y_test = []

def Image2Vector(img):
    temp = cv2.split(img)[0]
    temp = np.array(temp, dtype='float') / 255.0
    img_vector = temp.reshape(temp.size, order='F')
    img_vector = np.transpose([img_vector])
    return img_vector
def Label2Vector(label):
    y=np.zeros(10)
    for i in range(10):
        if i==int(label):
            y[i]=1.0
        else:
            y[i]=0.0
    return y

for picfoldername in folddirs:
    picfilepath=folderpath+picfoldername
    picfiledirs = os.listdir(picfilepath)
    train_num = int(len(picfiledirs) * trainrate)
    train_count = 0
    subtotal=0
    test_num = len(picfiledirs) - train_num
    test_count=0
    label=int(picfoldername)
    for picfilename in picfiledirs:
        img_path = picfilepath + '/' + picfilename
        img = cv2.imread(img_path)
        img_vector=Image2Vector(img)
        lab_vector=Label2Vector(label)
        all_count = all_count + 1
        if subtotal%interval!=0:
            x_train.append(img_vector)
            y_train.append(lab_vector)
            all_train_count=all_train_count+1
            train_count=train_count+1
        else:
            x_test.append(img_vector)
            y_test.append(lab_vector)
            all_test_count = all_test_count + 1
            test_count = test_count + 1
        subtotal = subtotal + 1
x1train=np.array(x_train)
xtrain=np.zeros([x1train.shape[0],x1train.shape[1]])
for i in range(x1train.shape[0]):
    for j in range(x1train.shape[1]):
        xtrain[i,j]=x1train[i,j]
ytrain=np.array(y_train)
x1test=np.array(x_test)
xtest=np.zeros([x1test.shape[0],x1test.shape[1]])
for i in range(x1test.shape[0]):
    for j in range(x1test.shape[1]):
        xtest[i,j]=x1test[i,j]
ytest=np.array(y_test)
np.savetxt('./temp/xtrain.csv', xtrain, delimiter=',')
np.savetxt('./temp/ytrain.csv', ytrain, delimiter=',')
np.savetxt('./temp/xtest.csv', xtest, delimiter=',')
np.savetxt('./temp/ytest.csv', ytest, delimiter=',')

print(all_count,all_train_count,all_test_count)

1.2 多个csv数据集文件创建

在以上基础上,加入批次循环,每循环一次生成一组训练数据,即xtrain_?.csv和ytrain_?.csv,全部循环完之后生成一组测试数据集,即xtest.csv和ytest.csv。如果读透代码,你可以看到如何选取的数据以及训练数据和测试数据的比例。为使你能深入学习代码,此处提供的程序并未参数化,代码如下:

import os
import numpy as np
import cv2
import tensorflow as tf

folderpath='./data/'
folddirs = os.listdir(folderpath)
all_train_count=0
all_test_count=0
all_count=0

all_batch_num = 10  #生成10套csv数据

def Image2Vector(img):
    temp = cv2.split(img)[0]
    temp = np.array(temp, dtype='float') / 255.0
    img_vector = temp.reshape(temp.size, order='F')
    img_vector = np.transpose([img_vector])
    return img_vector
def Label2Vector(label):
    y=np.zeros(10)
    for i in range(10):
        if i==int(label):
            y[i]=1.0
        else:
            y[i]=0.0
    return y

for batch_num in range(all_batch_num):

    print ("循环第 %d 次" % batch_num)
    x_train = []
    x_test = []
    y_train = []
    y_test = []
    for picfoldername in folddirs:
        picfilepath=folderpath+picfoldername
        picfiledirs = os.listdir(picfilepath)

        label=int(picfoldername)

        file_num = 0
        for picfilename in picfiledirs:
            img_path = picfilepath + '/' + picfilename
            img = cv2.imread(img_path)
            img_vector=Image2Vector(img)
            lab_vector=Label2Vector(label)
            all_count = all_count + 1

            if file_num % 11 == 0:
                x_test.append(img_vector)
                y_test.append(lab_vector)
                all_test_count = all_test_count + 1

            elif file_num % 11 == batch_num + 1:
                x_train.append(img_vector)
                y_train.append(lab_vector)
                all_train_count = all_train_count + 1

            file_num += 1

    x1train = np.array(x_train)

    xtrain = np.zeros([x1train.shape[0],x1train.shape[1]])
    for i in range(x1train.shape[0]):
        for j in range(x1train.shape[1]):
            xtrain[i,j]=x1train[i,j]
    ytrain = np.array(y_train)
    x1test = np.array(x_test)
    xtest = np.zeros([x1test.shape[0],x1test.shape[1]])
    for i in range(x1test.shape[0]):
        for j in range(x1test.shape[1]):
            xtest[i,j]=x1test[i,j]
    ytest=np.array(y_test)

    np.savetxt('./temp/xtrain_'+'%d.csv' % batch_num, xtrain, delimiter=',')
    np.savetxt('./temp/ytrain_'+'%d.csv' % batch_num, ytrain, delimiter=',')

    print ("+++++++++ 第 %d 组训练集文件生成+++++++++"%batch_num)
    if batch_num == 9:
        np.savetxt('./temp/xtest.csv', xtest, delimiter=',')
        np.savetxt('./temp/ytest.csv', ytest, delimiter=',')
        print ("+++++++++ 第 %d 组测试集文件生成+++++++++" % batch_num)
    print(all_count,all_train_count,all_test_count)

如果你要使用此代码处理自己的数据,需要深入读懂代码,有时间可以对比两段代码的不同之处,并尝试自己修改其中的参数。本文不作详细解释。
下一篇博客(https://blog.csdn.net/qq_23149979/article/details/86608854)将介绍大量图片数据依次训练的问题。

2 特别鸣谢

创建单个csv数据集的博文较多,感谢相关博文作者。

3 声明

本程序只做学习研究!
如有疑问,可留言反馈或通过邮件交流(hardenqiu@foxmail.com)。

2019-01-12 20:51:39 qq_35008279 阅读数 794
  • 深度学习数据科学和自然语言处理教程

    该视频教程探索一些自然语言处理技术的最新进展、深度学习在自然语言处理技术领域的应用、实践和数据资源,以及使用英特尔的Nervanan Platform的企业自然语言处理的应用案例和使用英特尔® AI技术的NLP企业精华案例。

    543 人正在学习 去看看 CSDN讲师

深度学习模型不会接收原始文本作为输入,它只能处理数值张量。文本向量化(vectorize)是指将文本转换为数值张量的过程。

1. 单词和字符的one-hot编码

1)单词级
import numpy as np

samples = ['The cat sat on the mat.', 'The dog ate my homework.']  # 初始数据,本例中是一个句子,当然也可以是一篇文章

token_index = {}   # 构建数据中所有标记的索引
for sample in samples:
    for word in sample.split():   # 用split方法对样本进行分词,实际应用中,可能还需要考虑到标点符号
        if word not in token_index:

            token_index[word] = len(token_index) + 1  #为每个唯一单词指定唯一索引,注意我们没有为索引编号0指定单词


max_length = 10   # 对样本进行分词,只考虑样本前max_length单词

results = np.zeros((len(samples), max_length, max(token_index.values()) + 1))    # 将结果保存到results中
for i, sample in enumerate(samples):
    for j, word in list(enumerate(sample.split()))[:max_length]:
        index = token_index.get(word)
        results[i, j, index] = 1.
2)字符集
import string

samples = ['The cat sat on the mat.', 'The dog ate my homework.']
characters = string.printable   # 所有可打印的ASCII字符
token_index = dict(zip(characters, range(1, len(characters) + 1)))

max_length = 50
results = np.zeros((len(samples), max_length, max(token_index.values()) + 1))
for i, sample in enumerate(samples):
    for j, character in enumerate(sample[:max_length]):
        index = token_index.get(character)
        results[i, j, index] = 1.
3)Keras实现
from keras.preprocessing.text import Tokenizer

samples = ['The cat sat on the mat.', 'The dog ate my homework.']

tokenizer = Tokenizer(num_words=1000)  # i创建一个分词器(tokenizer),设置为只考虑前1000个最常见的单词

tokenizer.fit_on_texts(samples)   # 构建索引单词


sequences = tokenizer.texts_to_sequences(samples)   # 将字符串转换为整数索引组成的列表


one_hot_results = tokenizer.texts_to_matrix(samples, mode='binary')  #可以直接得到one-hot二进制表示。这个分词器也支持除
																												# one-hot编码外其他向量化模式


word_index = tokenizer.word_index  # 得到单词索引
print('Found %s unique tokens.' % len(word_index))

2. 使用词嵌入

待补充

2019-12-01 10:53:41 qq_41084756 阅读数 160
  • 深度学习数据科学和自然语言处理教程

    该视频教程探索一些自然语言处理技术的最新进展、深度学习在自然语言处理技术领域的应用、实践和数据资源,以及使用英特尔的Nervanan Platform的企业自然语言处理的应用案例和使用英特尔® AI技术的NLP企业精华案例。

    543 人正在学习 去看看 CSDN讲师


数据预处理在构建网络模型时是非常重要的,往往能够决定训练结果。当然对于不同的数据集,预处理的方法都会有或多或少的特殊性和局限性。在这里介绍三种当前最为普遍被广泛使用的预处理方法。

一、中心化/零均值化

零均值化就是将每一维原始数据减去每一维数据的平均值,将结果代替原始数据。
利用python具体实现如下:

import numpy as np
import matplotlib.pyplot as plt
from numpy import random

x = random.rand(50,2)     #随机生成一个50*2(50个样本,2维)的实数矩阵
# print(x)
plt.scatter(x[:,1],x[:,0],color="red")  #以x的第二列为各点的横坐标,第一列为纵坐标
new_ticks = np.linspace(-1, 1, 5)		#固定坐标轴在-1到1之间,共5个值
plt.xticks(new_ticks)
plt.yticks(new_ticks)
plt.show()

#***************零值化******************#
x -= np.mean(x,axis = 0)  #去均值
#print(x)
plt.scatter(x[:,1],x[:,0],color="black")
new_ticks = np.linspace(-1, 1, 5)
plt.xticks(new_ticks)
plt.yticks(new_ticks)
plt.show()

随机初始化:
在这里插入图片描述
零值化后:
在这里插入图片描述
可以看到,同一坐标轴下,数据中心化了。

二、归一化

归一化就是将原始数据归一到相同尺度,通常有两种方法来实现归一化:

  • 原始数据除以数据绝对值的最大值,以保证所有的数据归一化后都在-1到1之间。
  • 原始数据零均值后,再将每一维的数据除以每一维数据的标准差。
    这里利用python实现第二种:
import numpy as np
import matplotlib.pyplot as plt
from numpy import random

x = random.rand(50,2)    
# print(x)
plt.scatter(x[:,1],x[:,0],color="red") 
new_ticks = np.linspace(-1, 1, 5)
plt.xticks(new_ticks)
plt.xticks(new_ticks)
plt.show()

#***************归一化******************#
x -= np.mean(x,axis = 0)  #去均值
x /= np.std(x)   #归一化
#print(x)
plt.scatter(x[:,1],x[:,0],color="red")
new_ticks = np.linspace(-1, 1, 5)
plt.xticks(new_ticks)
plt.yticks(new_ticks)
plt.show()

随机初始化:
在这里插入图片描述
归一化后:
在这里插入图片描述
可以看到,数据分布更均匀了。

三、PCA和白化

PCA:主成成分分析,首先将数据变成0均值的,然后计算数据的协方差矩阵来得到数据不同维度之间的相关性,协方差矩阵的第(i,j)个元素表示数据第i维和第j维特征的相关性,特别地,对角线上的元素表示方差。另外,协方差矩阵是对称并且半正定的。可以对该协方差矩阵进行SVD分解,其中U矩阵的列为特征向量,S对角线上的元素是奇异值(等同于特征值的平方)。为了对数据去相关,首先将数据(0均值后的)投影到特征向量上,注意,U的列是相互正交的向量,也因此它们可以被看成基向量。这种投影相当于将数据X旋转、投影到新的基向量轴上。如果再去计算Xrot的协方差矩阵的话,就会发现它是一个对角阵,说明不同维度之间不再相关。np.linalg.svd的一个很好的特性在于返回的U是按照其特征值的大小排序的,排在前面的就是主方向,因此可以通过选取前几个特征向量来减少数据的维度。
白化:把各个特征轴上的数据除以对应特征值,从而达到在每个特征轴上都归一化幅度的结果。也就是在PCA的基础上再除以每一个特征的标准差,以使其归一化,其标准差就是奇异值的平方根。

具体python实现如下:

import numpy as np
import matplotlib.pyplot as plt
from numpy import random

x = random.rand(50,2)    
# print(x)
plt.scatter(x[:,1],x[:,0],color="red")  
new_ticks = np.linspace(-1, 1, 5)
plt.xticks(new_ticks)
plt.yticks(new_ticks)
plt.show()

#***************PCA和白化***************#
x -= np.mean(x) # 去均值
cov = np.dot(x.T, x) / x.shape[0]   # 计算协方差矩阵得到相关性
U,S,V = np.linalg.svd(cov)			# 协方差矩阵奇异值分解
Xrot = np.dot(x, U)					# 去相关
Xrot_reduced = np.dot(x,U[:,:100])	# 降维
plt.scatter(Xrot_reduced[:,1],Xrot_reduced[:,0], color = "green")
new_ticks = np.linspace(-1, 1, 5)
plt.xticks(new_ticks)
plt.yticks(new_ticks)
plt.show()
#白化数据
Xwhite = Xrot / np.sqrt(S + 1e-5)
plt.scatter(Xwhite[:,1],Xwhite[:,0], color = "purple")
new_ticks = np.linspace(-1, 1, 5)
plt.xticks(new_ticks)
plt.yticks(new_ticks)
plt.show()

随机初始化:
在这里插入图片描述
PCA处理后:
在这里插入图片描述
白化处理后:
在这里插入图片描述
注意:在进行数据的预处理时,只能在训练数据上进行,然后应用到验证/测试数据上。

没有更多推荐了,返回首页