TensorFlow中的keras
到目前为止,Keras已经与TensorFlow完全整合。Keras团队不再更新或维护Keras的独立版本。所以现在所讨论的Keras,是一个集成在Tensor Flow中的API,而不是一个单独的独立库。
传入网络的数据类型
在准备数据时,我们首先需要了解数据的格式,希望数据的格式能够传递给神经网络模型。Sequential模型在训练期间接收数据,这发生在我们对模型调用fit()函数时(训练)。因此,我们需要检查这个函数期望的数据类型。
fit()函数接收的参数如下:
fit(
x=None,
y=None,
batch_size=None,
epochs=1,
verbose='auto',
callbacks=None,
validation_split=0.0,
validation_data=None,
shuffle=True,
class_weight=None,
sample_weight=None,
initial_epoch=0,
steps_per_epoch=None,
validation_steps=None,
validation_batch_size=None,
validation_freq=1,
max_queue_size=10,
workers=1,
use_multiprocessing=False
)
对其中一些常见的参数进行解释:
- x:输入的特征值,可以作为x的数据类型如下:
-
- 1.numpy中的数组,或者数组列表
-
- 2.TensorFlow中的张量,或者张量列表
-
- 3.tf.data 中的数据集,输入形式因该是(inputs,targets)或者是(inputs,targets,sample_weights)
-
- 4.tf.keras.utils.experimental.DatasetCreator中的数据,它封装了一个可调用函数,该函数只接受一个 tf.distribute.InputContext类型的参数
- y: 输入特征值对应的标签,与输入数据X一样,是numpy数组或者是张量,应该与x一致,如果x是一个数据集(dataset),生成器(generator),或者是 keras.utils.Sequence的实例,不应该指定y,因为x中就直接包含了y。
- batch_size:整数值,表示的每次更新的样本数,如果没有指定的话,批次大小是默认32,如果x是一个数据集(dataset),生成器(generator),或者是 keras.utils.Sequence的实例,不应该指定batch_size,因为x中会生成批次。
- epochs:整数值,训练模型的次数。epoch是对所提供的整个x和y数据的迭代
- validation_split:0-1之间的一个数值,表示的是在数据中分离出来的验证集的比例,不在该验证集上进行训练,只是在每次epoch中对其进行验证,如果x是一个数据集(dataset),生成器(generator),或者是 keras.utils.Sequence的实例,不应该指定validation_split,
- validation_data:表示具体的训练集数据,通过元组(V_sample,V_label)的形式.
- shuffle:True和False。以batch_size的大小进行洗牌。
- verbose:指定了我们希望在每个训练阶段看到的控制台输出量。详细程度从0到2不等,因此我们得到的是最详细的输出。0表示是什么都不输出。
更多的细节可以查看:https://tensorflow.google.cn/api_docs/python/tf/keras/Sequential#fit
除了格式化数据以使其符合模型所需的格式之外,格式化或处理数据的另一个原因是以这样的方式对其进行转换,从而使网络更容易、更快或更高效地学习。
数据处理
深度学习的数据处理将因我们处理的数据类型和我们将使用网络执行的任务类型而有很大不同。
我们将从一个非常简单的分类任务开始,使用一个简单的数字数据集。
我们首先需要导入我们将要使用的库。接下来,我们创建两个空列表。一个保存输入数据,另一个保存目标数据。
import numpy as np
from random import randint
from sklearn.utils import shuffle
from sklearn.preprocessing import MinMaxScaler
train_labels = []
train_samples = []
创建数据集:一个简单的数据集,用于一个简单的任务
我们假设在一项临床试验中,一种实验药物在13岁到100岁的人身上进行了测试。该试验有2100名参与者。一半参与者年龄在65岁以下,另一半参与者年龄在65岁或以上。该试验显示,约95%的65岁或以上患者出现药物副作用,约95%的65岁以下患者没有副作用,这通常表明老年人更有可能出现副作用。
最终,我们想要建立一个模型,告诉我们患者是否会仅仅根据患者的年龄而经历副作用。模型的判断将基于训练数据。
年龄 | 数量 | 情况 |
---|---|---|
13-64 | 1050 | 95%没有副作用,5%出现副作用 |
65及以上 | 1050 | 95%出现副作用,5%没有副作用 |
该代码创建2100个样本,并在train_samples列表中存储个体的年龄,并在train_labels列表中存储个体是否经历过副作用。
for i in range(50):
# The ~5% of younger individuals who did experience side effects
random_younger = randint(13,64)
train_samples.append(random_younger)
train_labels.append(1)
# The ~5% of older individuals who did not experience side effects
random_older = randint(65,100)
train_samples.append(random_older)
train_labels.append