深圳外贸网站制作公司,联盟文明网站建设有新,苏州网站建设排名,wordpress五列大家好#xff0c;本文接TensorFlow训练深度学习模型的上半部分继续进行讲述#xff0c;下面将介绍有关定义深度学习模型、训练模型和评估模型的内容。
定义深度学习模型
数据准备完成后#xff0c;下一步是使用TensorFlow搭建神经网络模型#xff0c;搭建模型有两个选项…大家好本文接TensorFlow训练深度学习模型的上半部分继续进行讲述下面将介绍有关定义深度学习模型、训练模型和评估模型的内容。
定义深度学习模型
数据准备完成后下一步是使用TensorFlow搭建神经网络模型搭建模型有两个选项
可以使用各种层包括Dense、Conv2D和LSTM从头开始搭建模型。这些层定义了模型的架构及数据流经过它的方式可基于TensorFlow Hub提供的预训练模型搭建模型。这些模型已经在大型数据集上进行了训练并可以在特定数据集上进行微调以达到在较短的训练时间内达到较高的准确度。
可以根据TensorFlow Hub中的预训练模型来建立模型。这些模型已经在大型数据集上进行了训练并且可以在你的特定数据集上进行微调以达到较少的训练时间达到较高的准确性。 从头开始定义深度学习模型
TensorFlow中的tf.keras.Sequential函数允许我们逐层定义神经网络模型我们可以选择各种层如Dense、Conv2D和LSTM来搭建定制的模型架构。以下是示例
# 定义模型架构
model tf.keras.Sequential([tf.keras.layers.Conv2D(32, 3, activationrelu, input_shape(28, 28, 1)),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Flatten(),tf.keras.layers.Dense(128, activationrelu),tf.keras.layers.Dropout(0.5),tf.keras.layers.Dense(10)
])
在这个示例中我们定义了一个模型包含以下六个层4个隐藏层 Conv2D层具有32个过滤器3x3的内核大小和ReLU激活。此层以形状为28281的输入图像作为输入。 MaxPooling2D层具有默认的2x2池大小。此层对从上一层获得的特征映射进行下采样。 Flatten层将2D特征映射展平为1D向量。 Dense层具有128个神经元和ReLU激活。此层对展平的特征映射执行完全连接操作。 Dropout层在训练期间随机丢弃50的连接以防止过拟合。 Dense层具有十个神经元无激活函数。此层表示模型的输出层神经元的数量对应于分类任务中的类别数目。
这个模型遵循典型的卷积神经网络架构包括多个卷积层和池化层以及一个或多个全连接层。
从预训练模型定义深度学习模型
利用TensorFlow Hub提供的预训练模型可能是一个不错的选择因为它们已经在大量的数据集上进行了训练可以帮助在减少训练时间的同时实现高准确度。在实现任何这些模型之前让我们先了解一些TensorFlow Hub提供的常见预训练模型。 VGGThe Visual Geometry GroupVGG模型是由牛津大学开发的。这些模型广泛用于图像分类任务并在各种基准数据集上取得了最先进的结果。 ResNetThe Residual NetworkResNet模型是由微软研究院开发的。这些模型具有独特的架构可以训练非常深的神经网络高达1000层。 InceptionInception模型是由Google开发的。这些模型具有独特的架构使用不同尺度的多个并行卷积Inception模型广泛用于目标检测和图像分类任务。 MobileNetMobileNet模型是由Google开发的。这些模型具有针对移动设备和嵌入式设备进行优化的独特架构MobileNet模型广泛用于移动设备上的图像分类和目标检测任务。
可以通过向预训练模型添加额外层并在特定数据集上训练模型来应用迁移学习。与从头开始训练模型相比这种技术可以节省大量时间和计算资源。但是在选择预训练模型并将数据集转换为该格式以确保兼容之前了解预训练模型所需的输入格式非常重要。
在这个示例中MobileNet模型被作为基本模型使用。在使用基本模型之前检查模型所需的格式非常重要 在本示例中格式为2242243。然而MNIST数据集是一个灰度图像大小为28281其中单个值表示像素的亮度。图像大小也比所需的格式要小得多。因此需要重新调整数据集。以下是调整大小的主要思路
使用image.resize函数将图像调整为所需的大小。该函数使用双线性插值来保留原始图像中的信息同时将其调整为新大小。因此此步骤可以将原始形状28281调整为2242241的形状。
使用image.grayscale_to_rgb函数将图像转换为新的RGB图像通过将单个灰度通道复制到新的RGB图像的所有三个通道中从而将原始形状2242241调整为2242243的形状。
# 调整输入图像的大小为224x224并将其转换为三通道的RGB图像
X_train tf.image.grayscale_to_rgb(tf.image.resize(X_train, [224, 224]))
X_test tf.image.grayscale_to_rgb(tf.image.resize(X_test, [224, 224])) 现在让我们基于MobileNet模型定义我们的模型
# 加载MobileNet模型不包括顶层
base_model MobileNet(include_topFalse, input_shape(224, 224, 3))# 添加一个全局平均池化层和一个全连接输出层
x base_model.output
x GlobalAveragePooling2D()(x)
x Dropout(0.5)(x)
x Dense(10, activationsoftmax)(x)# 将基础模型和新层结合起来创建完整的模型
model tf.keras.models.Model(inputsbase_model.input, outputsx)# 冻结基础模型中的各层
for layer in base_model.layers:layer.trainable False
在上面的示例中我们定义了一个模型如下所示 使用MobileNet()定义基本模型 GlobalAveragePooling2D层使用基本模型的最后一个卷积层的输出计算每个特征映射的平均值从而得到一个固定长度的向量总结了特征映射中的空间信息。 Dropout层在训练期间随机丢弃50的连接以防止过拟合。 Dense层使用十个单元的完全连接层和softmax激活。它接收来自上一层的输出并生成覆盖十个可能类别的概率分布。
编译和训练模型
在创建模型之后必须通过指定在训练期间使用的损失函数、优化器和指标来编译它。以下是一个编译模型的示例代码
# 编译该模型
model.compile(optimizeradam,losssparse_categorical_crossentropy,metrics[accuracy])
由于这是一个多分类问题因此此示例代码使用了稀疏交叉熵损失函数我们使用的是Adam优化器和准确率指标。
在训练模型之后可以在测试集上评估它以查看它在未见过的数据上的表现如何以下是一个评估模型的示例代码
# 在测试数据上评估该模型
test_loss, test_acc model.evaluate(X_test, y_test)
print(Test loss: , test_loss)
print(Test Acc: , test_acc) 在此示例代码中我们在测试集上评估模型并输出测试损失和准确率。
进行预测
一旦训练和评估了模型就可以使用它来预测新数据。以下是一个进行预测的示例代码
# 对新数据进行预测
y_pred model.predict(X_test)
y_pred_labels np.argmax(y_pred, axis1)
print(y_pred_labels)
在此示例代码中我们在模型上使用predict()方法对整个测试集进行预测。
如果我们想要预测单个图像并返回预测标签与真实标签那么就需要对Keras模型的predict()方法进行更改。因为Keras模型的predict()方法期望输入数据形式为一批图像而我们想要传递单个图像给predict()方法所以需要将其重新调整为批次大小为1。
def predict_and_compare(model, X_test, y_test, index):# 从X_test中获取给定索引的例子example X_test[index]# 将例子重塑为预期的输入形状example np.reshape(example, (1, 28, 28, 1))# 预测这个例子的标签y_pred model.predict(example)# 将预测的概率转换为类别标签y_pred_label np.argmax(y_pred, axis1)[0]# 使用索引从y_test获取真实标签y_test_array y_test.values# Get the label for the first example in the test set y_true y_test_array[index]# 输出预测的和真实的标签print(Predicted label:, y_pred_label)print(True label:, y_true)# 返回预测的和真实的标签return y_pred_label, y_true# 预测并比较测试集中第一个例子的标签
y_pred_label, y_true predict_and_compare(model, X_test, y_test, 0)
在上面的示例中我们通过添加一个额外的维度来代表批次大小从而将输入图像从28281调整为128281。这样我们就可以传递单个图像给predict()方法并获得该图像的预测结果。当我们调用上面的函数时可以自定义要预测的图像 这就是在TensorFlow中实现深度学习的步骤。当然这只是一个基本示例。你可以搭建具有更多层、不同类型的层和不同超参数的更复杂的模型以便在数据集上获得更好的性能。 综上本文我们演示了如何对数据进行预处理、搭建和训练模型、在单独的测试集上评估其性能以及使用简单的卷积神经网络CNN进行图像分类的预测通过学习可以获得如何在TensorFlow中构建深度学习模型以及如何将这些概念应用于真实世界数据集的理解。