基于tf2的dl编程学习(零)

一些进入tf2核心功能与性质之前的前置知识和有些生疏的点,主要为pandas的数据操作及可视化,和Tensorflow 提供的Dataset API。
在建立模型之前,首先需要对数据进行分析。以往的工作就是忽略了数据分析与数据处理的重要性,从而限制了模型性能的上限,后期再发现导致前期的很多工作白做了。在该阶段主要使用到的工具就是pandas。

pandas

Pandas的主要数据结构是Series(一维数据)和DataFrame(二维数据),缺失数据表示为NaN

数据结构
Series

用于表示Pandas中的一维数据,常见于DataFrame中的一列。Series是带标签的一维数组,因此同时带有数组与字典的特性。可通过pd.Series生成一个Series,data接受字典,多维数组,标量等作为参数:

s = pd.Series(data, index=index)  # index自动生成数值索引,data为标量时index必须指定

Series操作与ndarray类似,由数组性质支持大多数Numpy函数和索引,切片操作:

s[0]  # 索引
s[:3]  # 切片
s[s > 1]  # 条件索引
s[[1,2,4]]  # 批量索引
np.exp(s)  # numpy函数计算
s + s  # 矢量操作

Series还具有字典性质,类似于固定大小的字典,可进行相似操作:

s['a']  # 索引
s['b'] = 3  # 赋值
s.values  # 提取数值,形式为ndarray
DataFrame

DataFrame是pandas中最常用的数据类型,表现为二维表格,可视作Series的容器。DataFrame与Numpy数组的最大差别在于每一列的数据类型各不相同。由ndarray,series或series字典,结构多维数组等生成:

s = pd.DataFrame(data, index=index, columns=columns)  # index为行标签,columns为列标签

DataFrame类似于Series字典,以列属性为键值,具有许多字典的性质:

df['one']  # 索引
df['three'] = df['one'] * df['two']  # 计算赋值
del df['two']  # 删除列
df.pop('two')  # 弹出列

可分别用index和columns属性访问行,列标签,或loc和iloc属性选择行:

df[col]  # 选择列
df.loc[label]  # 用标签选择行,一般默认是自增数值标签
df.iloc[index]  # 用索引选择行
df[a:b]  # 行切片
df[boolen]  # 布尔表达式选择行

可通过查看DataFrame表格的一部分观察数据格式等信息:

df.head()  # 前五行数据
df.tail()  # 后五行数据
df.shape()  # 查看行列维度

DataFrame常用的一系列函数:

df.set_index()  # 设置某列为index,取代默认的index
df.dropna()  # 删除缺失值
df.fillna()  # 填充缺失值
df.isna()  # 获取缺失值布尔掩码
df.diff()  # 沿axis的差值,默认沿行
df.query()  # 接受布尔表达式,用于过滤dataframe,可直接用字符串引用列名
df.mean()  # 统计均值,默认axis=0为列,axis=1则按行统计
df.apply()  # 数据处理,接受函数对所有dataframe数据进行计算,原数据对象不改变
df.values_count()  # 数据统计,多用于离散数据列
df.append()  # 追加行
df.groupby()  # 按条件分割数据,得到多组数据,可为每组单独应用函数处理
可视化

主要方法是使用Series或DataFrame上的plot()函数。

# plot()函数主要参数
kind:
'line':折线图
'bar':条形图
'hist':直方图
'box':箱形图
'pie':饼图
'area':面积图
'scatter':散点图

figsize:
元组,绘图的大小

legend:
子图图例,对绘图的说明

title:
绘图标题

通过plot()函数定义如何绘图后,还可以调用plt的各属性进行进一步的定制:

plt.xlabel = ('x)  # 定义横坐标名称
plt.ylabel = ('y')  # 定义纵坐标名称
plt.show()  # 显示绘图
文件读写
# csv文件,文本数据
pd.read_csv()
pd.to_csv()
# json文件,文本数据
pd.read_json()
pd.to_json()
# excel文件,二进制数据
pd.read_excel()
pd.to_excel()
pandas 常用操作
pd.get_dummies()  # pandas 实现one-hot encode 方法,对应列属性组合为独热编码形式
pd.concat()  # 按axis拼接,axis=0为按行拼接,axis=1为按列拼接,只会拼接不同行/列
pd.merge()  # 连接,默认内连接,还可选择外连接,左连接,右连接;on参数指定连接键
pd.join()  # 合并,按照索引进行连接

tf2数据准备

Tensorflow官方推荐的Dataset API,同时支持从硬盘和内存读取数据和相应的处理。

生成
# 从内存读取数据,data可为数组,矩阵,字典等
dataset = tf.data.Dataset.from_tensor_slices(data)
# 从生成器读取数据
dataset = tf.data.Dataset.from_generator(generator)
# 读取TFRecord文件,dataset中每一元素是一个TFExample
filenames = ["/var/data/file1.tfrecord", "/var/data/file2.tfrecord"]
dataset = tf.data.TFRecordDataset(filenames)
# 读取文本文件,输入文件列表,Dateset中每一元素对应文件中的一行,可读取csv文件
filenames = ["/var/data/file1.txt", "/var/data/file2.txt"]
dataset = tf.data.TextLineDataset(filenames)
# list_files将路径Dataset化,可利用路径在map函数中读取文件
dataset = tf.data.Dataset.list_files(./data/cifar2/train/*/*.jpg).map(load_image)
常用操作
# map函数,将Dataset中每个元素视为输入,函数返回值作为新的Dateset
dataset = dataset.map(lamda x: x+1)
# batch函数,根据接收的整数值将多个元素组合成batch
dataset = dataset.batch(32)
# shuffle函数,打乱Dataset中数据,参数buffersize表示打乱时的范围
dataset = dataset.shuffle(buffer_size=1000)
# repeat函数,重复序列多次
dataset = dataset.repeat(5)
# take函数,采样整数个样本
dataset.take(5)
# flat_map函数,将dataset中数据映射并压为一维,顺序不变
dataset = dataset.flat_map(map_func)
# filter函数,对Dataset中每一个元素执行过滤方法
dataset = dataset.filter(filter_func)
# zip函数,打包,通常用于打包样本和对应标签
dataset = tf.data.Dataset.zip((image_ds,label_ds))
# window函数,每若干元素打包成滑动窗口
dataset = dataset.window(5)
图片数据

使用Tensorflow原生方法准备图片数据:

dataset = tf.data.Dataset.list_files("./data/cifar2/train/*/*.jpg") \
.map(load_image, num_parallel_calls=tf.data.experimental.AUTOTUNE) \
.shuffle(buffer_size = 1000).batch(BATCH_SIZE) \
.prefetch(tf.data.experimental.AUTOTUNE)
# list_files()找到所有图片文件的路径,*表示任意字符串
# map()函数对其进行处理,并指定num_parallel_calls选项进行并行化预处理
# shuffle()函数每次选择buffer_size个数据进行打乱,避免内存不够
# batch()函数对数据分组
# prefetch()函数预存数据,提升性能

map函数接受的处理函数,可为lambda匿名函数。lambda函数形式为:

lambda a,b:expression(a,b)  # 冒号前的a,b为参数,冒号后为函数的计算表达式

lambda函数返回一个函数地址,是普通函数的单行简写形式

文本数据

文本数据的处理要更加复杂,包括去除停用词,构建词典,编码转换,序列填充,构建数据管道等等。这里使用到tf.data.Dataset搭配tf.keras.layers.experimental.preprocessing.TextVectorization预处理层

# 加载文本文件并进行文本清洗,打乱,分批,得到dataset对象
dataset= tf.data.TextLineDataset(filenames = [train_data_path]) \
.map(split_line,num_parallel_calls = tf.data.experimental.AUTOTUNE) \
.shuffle(buffer_size = 1000).batch(BATCH_SIZE) \
.prefetch(tf.data.experimental.AUTOTUNE)

# 预处理层,用于构建词典,编码转换和序列填充
vectorize_layer = TextVectorization(
    standardize=clean_text,  # 自定义文本清洗方法
    split = 'whitespace',
    max_tokens=MAX_WORDS-1, #有一个留给占位符
    output_mode='int',
    output_sequence_length=MAX_LEN)

# 得到纯文本,并传入预处理层中
ds_text = dataset.map(lambda text,label: text)
vectorize_layer.adapt(ds_text)

# 得到整齐的文本向量表示
ds = ds_train_raw.map(lambda text,label:(vectorize_layer(text),label)) \
    .prefetch(tf.data.experimental.AUTOTUNE)
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值