📜  Tensorflow 2.0:解决分类和回归问题(1)

📅  最后修改于: 2023-12-03 15:20:33.833000             🧑  作者: Mango

Tensorflow 2.0:解决分类和回归问题

TensorFlow 2.0 是一款开源的深度学习框架,可用于解决分类和回归问题。它与前版相比,简化了 API 并提供了更好的可用性,同时保持了高效性能。

分类问题

分类是机器学习中一种最受欢迎的类型,它可以为不同的图像、文本、声音等数据分配一个类别。TensorFlow 2.0 提供了多种方法来解决分类问题,其中最受欢迎的是使用 Keras API。

Keras API

Keras 是 TensorFlow 的高级 API,它使构建神经网络变得更加简单。以下是使用 Keras API 构建分类问题的示例代码:

from tensorflow.keras import layers, models

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10))

model.summary()

在这个例子中,我们使用了卷积层、池化层和全连接层来构建模型。模型的结构可以通过 model.summary() 输出:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
conv2d (Conv2D)              (None, 26, 26, 32)        320
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 13, 13, 32)        0
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 11, 11, 64)        18496
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 5, 5, 64)          0
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 3, 3, 64)          36928
_________________________________________________________________
flatten (Flatten)            (None, 576)               0
_________________________________________________________________
dense (Dense)                (None, 64)                36928
_________________________________________________________________
dense_1 (Dense)              (None, 10)                650
=================================================================
Total params: 93,322
Trainable params: 93,322
Non-trainable params: 0
_________________________________________________________________

可以看到,模型由 3 层卷积层、2 层池化层、1 层全连接层和 1 个输出层组成。输出层的形状是 (None, 10),表示目标是将输入数据分配到 10 个类别中的一个。

数据集

为了训练分类模型,我们需要准备一个数据集。TensorFlow 2.0 内置了一些常用的数据集,例如 MNIST 手写数字数据集。以下是加载和准备 MNIST 数据集的示例代码:

import tensorflow as tf
from tensorflow.keras.datasets import mnist

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

train_images = train_images.reshape((60000, 28, 28, 1)) / 255.0
test_images = test_images.reshape((10000, 28, 28, 1)) / 255.0

train_labels = tf.keras.utils.to_categorical(train_labels)
test_labels = tf.keras.utils.to_categorical(test_labels)

在这个示例中,我们首先加载了 MNIST 数据集,并将训练和测试数据分别赋值给 train_imagestrain_labelstest_imagestest_labels。然后,我们对图像数据进行预处理,将其重塑为 (60000, 28, 28, 1)(训练数据)和 (10000, 28, 28, 1)(测试数据)的形状,并将像素值缩放到 0 到 1 之间。最后,我们使用 tf.keras.utils.to_categorical 将标签转换为分类矩阵。

训练模型

使用准备好的数据集,我们可以开始训练模型。以下是训练分类模型的示例代码:

model.compile(optimizer='adam',
              loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

model.fit(train_images, train_labels, epochs=5,
          validation_data=(test_images, test_labels))

在上面的示例中,我们首先使用 model.compile 方法配置了优化器、损失函数和评估指标。然后,我们使用 model.fit 方法对模型进行训练,并将训练数据和评估数据传递给 validation_data 参数。

评估模型

在模型训练完成后,我们可以使用测试数据对模型进行评估。以下是评估分类模型的示例代码:

test_loss, test_acc = model.evaluate(test_images, test_labels)
print('Test accuracy:', test_acc)

在这个示例中,我们使用 model.evaluate 方法计算测试数据的损失和准确率,并输出准确率。

回归问题

回归是机器学习中另一种常见的问题类型,它可以预测连续的输出值,例如房屋价格、股票价格等。TensorFlow 2.0 提供了多种方法来解决回归问题。

Keras API

与分类问题相同,Keras API 是解决回归问题的最佳选择之一。以下是使用 Keras API 构建回归问题的示例代码:

from tensorflow.keras import layers, models

model = models.Sequential()
model.add(layers.Dense(64, activation='relu', input_shape=(train_X.shape[1],)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(1))

model.summary()

与分类问题不同的是,回归问题中的输出层只有一个节点,并且不应该有激活函数。这是因为回归问题的目标是预测连续的输出值,而分类问题的目标是预测相互独立的分类。

数据集

为了训练回归模型,我们需要准备一个数据集。以下是加载和准备波士顿房价数据集的示例代码:

import tensorflow as tf
from tensorflow.keras.datasets import boston_housing

(train_X, train_y), (test_X, test_y) = boston_housing.load_data()

mean = train_X.mean(axis=0)
std = train_X.std(axis=0)

train_X = (train_X - mean) / std
test_X = (test_X - mean) / std

在这个示例中,我们首先加载了波士顿房价数据集,并将训练和测试数据分别赋值给 train_Xtrain_ytest_Xtest_y。然后,我们对数据进行标准化处理,让所有特征都在相同的尺度内。

训练模型

使用准备好的数据集,我们可以开始训练模型。以下是训练回归模型的示例代码:

model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])
model.fit(train_X, train_y, epochs=100, batch_size=16, validation_split=0.2)

在上面的示例中,我们首先使用 model.compile 方法配置了优化器、损失函数和评估指标。然后,我们使用 model.fit 方法对模型进行训练,并将训练数据和评估数据传递给 validation_split 参数。

评估模型

在模型训练完成后,我们可以使用测试数据对模型进行评估。以下是评估回归模型的示例代码:

test_mse_score, test_mae_score = model.evaluate(test_X, test_y)
print('Test MAE score:', test_mae_score)

在这个示例中,我们使用 model.evaluate 方法计算测试数据的均方误差和平均绝对误差,并输出平均绝对误差。