深度学习数据处理与卷积神经网络全解析
立即解锁
发布时间: 2025-09-02 00:50:41 阅读量: 3 订阅数: 32 AIGC 

### 深度学习数据处理与卷积神经网络全解析
#### 1. 数据预处理与TF Transform
Keras提供的预处理层极大地简化了数据预处理工作。无论选择编写自己的预处理层,还是使用Keras提供的层,甚至是Feature Columns API,所有预处理都可以即时完成。不过,在训练时,提前进行预处理可能是更好的选择。
如果预处理需要大量计算,提前进行预处理而非即时处理可以显著提高性能。因为数据在训练前只需对每个实例进行一次预处理,而不是在训练的每个时期对每个实例都进行一次预处理。
当数据集足够小可以放入内存时,可以使用其`cache()`方法。但如果数据集过大,则需要借助Apache Beam和Spark等工具。这些工具可以在大量数据上执行高效的处理管道,即使数据分布在多个服务器上。可以使用它们在训练前处理所有训练数据。
然而,这种方法存在一个缺点。假设要将训练好的模型部署到移动应用中,就需要在应用中编写代码来处理数据的预处理,然后再将数据传输到模型中。如果还想将模型部署到TensorFlow.js中,以便在网页浏览器中运行,同样需要编写预处理代码。这会使项目的维护变得非常困难,而且容易出错,可能会导致训练和服务之间的不一致,从而引发错误或性能下降。
一种改进方法是在将训练好的模型部署到移动应用或浏览器之前,添加额外的预处理层来即时进行预处理。这样就只有两个版本的预处理代码:Apache Beam或Spark的代码,以及预处理层的代码。
更好的方法是只定义一次预处理操作,这就是TF Transform发挥作用的地方。TF Transform是TensorFlow Extended (TFX)的一部分,是一个用于将TensorFlow模型投入生产的完整平台。
使用TF Transform的步骤如下:
1. 安装TF Transform(在创建conda环境tf2时已经完成)。
2. 定义预处理函数(用Python),可以调用TF Transform的函数进行缩放、分割等操作,也可以使用任何有用的TensorFlow操作。
以下是一个包含两个特征的预处理函数示例:
```python
import tensorflow_transform as tft
def preprocess(inputs): # inputs = 一批输入特征
median_age = inputs["housing_median_age"]
ocean_proximity = inputs["ocean_proximity"]
standardized_age = tft.scale_to_z_score(median_age)
ocean_proximity_id = tft.compute_and_apply_vocabulary(ocean_proximity)
return {
"standardized_median_age": standardized_age,
"ocean_proximity_id": ocean_proximity_id
}
```
TF Transform允许使用Apache Beam将`preprocess()`函数应用于整个训练集。在处理过程中,它还会计算整个训练集的必要统计信息,如特征`housing_median_age`的均值和标准差,以及特征`ocean_proximity`的词汇表。建立这些统计信息的组件称为分析器。
TF Transform还会生成一个等效的TensorFlow函数,可以集成到要部署的模型中。这个TF函数包含了Apache Beam计算的所有必要统计信息的常量。
#### 2. TensorFlow Datasets (TFDS)
TensorFlow Datasets (TFDS)项目旨在方便下载经典数据集,从较小的数据集(如MNIST或Fashion MNIST)到非常大的数据集(如ImageNet)都有涵盖。可用的数据集涉及图像、文本(包括翻译)、音频和视频。
使用TFDS的步骤如下:
1. 安装`tensorflow-datasets`库。
2. 调用`tfds.load()`函数下载所需的数据(如果之前未下载过),并以数据集字典的形式获取数据(通常一个用于训练,一个用于测试,但具体取决于所选的数据集)。
以下是使用MNIST数据集的示例:
```python
import tensorflow_datasets as tfds
dataset = tfds.load(name="mnist")
mnist_train, mnist_test = dataset["train"], dataset["test"]
```
可以对数据集应用任何转换(通常是打乱、分批和预取),然后就可以开始训练模型了:
```python
mnist_train = mnist_train.shuffle(10000).batch(32).prefetch(1)
for item in mnist_train:
images = item["image"]
labels = item["label"]
# ...
```
`load()`函数会打乱下载的每个数据部分(仅针对训练集)。但这可能不够,最好再对训练数据进行一些打乱操作。
每个数据集元素是一个包含特征和标签的字典。然而,Keras期望每个元素是一个包含两个元素的元组(同样是特征和标签)。可以使用`map()`方法转换数据集:
```python
mnist_train = mnist_train.shuffle(10000).batch(32)
mnist_train = mnist_train.map(lambda items: (items["image"], items["label"]))
mnist_train = mnist_train.prefetch(1)
```
更简单的方法是让`load()`函数处理这个问题,指定`as_supervised=True`(显然,这仅适用于有标签的数据集)。如果需要,还可以指定批次大小。然后将数据集直接传递给tf.keras模型:
```python
dataset = tfds.load(name="mnist", batch_size=32, as_supervised=True)
mnist_train = dataset["train"].prefetch(1)
model = keras.models.Sequential([...])
model.compile(loss="sparse_categorical_crossentropy", optimizer="sgd")
model.fit(mnist_train, epochs=5)
```
#### 3. 卷积神经网络的起源与应用
计算机直到最近才能够完成一些看似简单的任务,如在照片中识别猫或识别说出的单词。人类能够轻松完成这些任务,是因为这些过程大多在我们的意识之外,在大脑的专门感官模块中进行。当感官信息到达我们的意识时,已经包含了大量的高级特征。
卷积神经网络(CNN)源于对大脑视觉皮层的研究,自20世纪80年代以来就用于图像识别。近年来,由于计算能力的提高、可用训练数据的增加以及训练深度网络的技巧,CNN在复杂视觉任务上取得了超越人类的性能
0
0
复制全文
相关推荐










