深度学习中的正则化技术(附Python代码)

简介:

数据科学家面临的常见问题之一是如何避免过拟合。你是否碰到过这样一种情况:你的模型在训练集上表现异常好,却无法预测测试数据。或者在一个竞赛中你排在public leaderboard的顶端,但是在最终排名中却落后了几百名?那么这篇文章就是为你而准备的!

(译者注: 在kaggle这样的数据竞赛中, public leaderboard排名是根据一部分测试集来计算的,用于给选手提供及时的反馈和动态展示比赛的进行情况;而private leaderboard是根据测试集的剩余部分计算而来,用于计算选手的最终得分和排名。 通常我们可以把public LB理解为在验证集上的得分,private LB为真正未知数据集上的得分,这样做的目的是提醒参赛者,我们建模的目标是获取一个泛化能力好的模型)

避免过拟合可以提高我们模型的性能。

b7db155d62f4a5122b366c4d08979f73606f25c1

目录

1. 什么是正则化?

2. 正则化如何减少过拟合?

3. 深度学习中的各种正则化技术:

d47e62d2b349aca45e42305ed6714efbe5ed61d9 L2和L1正则化
d47e62d2b349aca45e42305ed6714efbe5ed61d9 Dropout
d47e62d2b349aca45e42305ed6714efbe5ed61d9 数据增强(Data augmentation)
d47e62d2b349aca45e42305ed6714efbe5ed61d9 提前停止(Early stopping)

4. 案例:在MNIST数据集上使用Keras的案例研究

1. 什么是正则化?

在深入该主题之前,先来看看这几幅图:

44cce9058f81ffb8003f0584d6a53574bfe01969

之前见过这幅图吗?从左到右看,我们的模型从训练集的噪音数据中学习了过多的细节,最终导致模型在未知数据上的性能不好。

换句话说,从左向右,模型的复杂度在增加以至于训练误差减少,然而测试误差未必减少。如下图所示:

8bf51b4f7f21c6cf7790c28a634048ec684dce43

Source: Slideplayer

如果你曾经构建过神经网络,你就知道它们有多复杂。这也使得它们更容易过拟合。

5a228334ef251f21db1d48827a5422115956aa4c

正则化技术是对学习算法做轻微的修改使得它泛化能力更强。这反过来就改善了模型在未知数据上的性能。

2. 正则化如何减少过拟合?

我们来看一个在训练数据上过拟合的神经网络,如下图所示:

05826d3a5bc40b3e68a4a4138e2a26548e4e14bc

如果你曾经学习过机器学习中的正则化,你会有一个概念,即正则化惩罚了系数。在深度学习中,它实际上惩罚了节点的权重矩阵。

假设我们的正则化系数很高,以至于某些权重矩阵近乎于0:

e9154de49552c893a1861aed6464218f546cbaaf

这会得到一个简单的线性网络,而且在训练数据集上轻微的欠拟合。

如此大的正则化系数并不是那么有用。我们需要对其进行优化从而得到一个拟合良好的模型,正如下图所示:

54d023b5a2d26468fa9f7a028bac2d43ef55eb8c

3. 深度学习中的各种正则化技术

我们已经理解了正则化如何帮助减少过拟合,现在我们将学习一些把正则化用于深度学习的技术。

d47e62d2b349aca45e42305ed6714efbe5ed61d9L1和L2正则化

L1和L2是最常见的正则化类型。它们通过增加一个被称为正则项的额外项来更新成本函数:

Cost function = Loss (say, binary cross entropy) + Regularization term

由于增加了这个正则项,权重矩阵的值减小了,因为这里假定了具有较小权重矩阵的神经网络会导致更简单的模型。因此,它也会在相当程度上减少过拟合。

然而,该正则项在L1和L2中是不同的。

L2中,我们有:

9a52f71f3018c1072e1832ba1f17ba9eed9415e7

这里,lambda是正则参数。它是一个超参数用来优化得到更好的结果。L2正则化也叫权重衰减(weight decay),因重朝着0衰减(但不会0)

在L1中,我有:

d07df5b3bbf9211b9ab7f07abfc09150fbbf6fff

这里,我们惩罚了权重的绝对值。不像L2, 这里的权重是有可能衰减到0的。因此,当我们想压缩模型的时候, L1非常有用,否则会偏向使用L2.

在Keras中,我们可以使用regularizers直接在任意层上应用正则化。

下面是一段样例代码,把L2正则化用于一层之上:

from keras import regularizers

model.add(Dense(64, input_dim=64,

kernel_regularizer=regularizers.l2(0.01)

注意:这里的值0.01是正则化参数的值,即lambda, 它需要被进一步优化。可以使用grid-search的方法来优化它。

同样的,我们也可以采用L1正则化。后文中的案例研究会看到更多细节。

d47e62d2b349aca45e42305ed6714efbe5ed61d9Dropout

这是一种非常有趣的正则化技术。它的效果非常好因此在深度学习领域中最常被使用。

为了理解dropout,假设我们的神经网络结构如下所示:

1d4f9b23e68b86cf7f986844497b3a34fcadc1e5

dropout做什么呢?每次迭代,随机选择一些节点,将它们连同相应的输入和输出一起删掉,如下图:

27f27bca3fff7ef448c55e4c98b636bda04d8194

所以,每一轮迭代都有不同的节点集合,这也导致了不同的输出。它也可以被认为是一种机器学习中的集成技术(ensemble technique)。

集成模型(ensemble models)通常比单一模型表现更好,因为捕获了更多的随机性。同样的,比起正常的神经网络模型,dropout也表现的更好。

选择丢弃多少节点的概率是dropout函数的超参数。如上图所示,dropout可以被用在隐藏层以及输入层。

37d6ef5405d0037363de6f11d38e86f742724eed

由于这些原因,当我们有较大的神经网络时,为了引入更多的随机性,通常会优先使用dropout。

在Keras中,可以使用Keras core layer来实现dropout。下面是对应的Python代码:

from keras.layers.core import Dropout

model = Sequential([

Dense(output_dim=hidden1_num_units, input_dim=input_num_units, activation='relu'),

Dropout(0.25),

Dense(output_dim=output_num_units, input_dim=hidden5_num_units, activation='softmax'),

])

正如你看到的,这里定义丢弃概率为0.25。我们可以使用grid search方法来微调它以获得更好的结果。

d47e62d2b349aca45e42305ed6714efbe5ed61d9数据增强(Data augmentation)

减少过拟合最简单的方式其实是增加训练集的大小。在机器学习中,由于人工标注数据成本过高所以很难增加训练集的大小。

但是,考虑一下如果我们处理的是图像。在这种情况下,有一些方法可以增加训练集的大小——旋转、翻转、缩放、移动等等。下图中,对手写数字数据集进行了一些转换:

29e120f80cbbe65177601980eed2d5cea67858e0

这种技术叫做数据增强。通常会明显改善模型的准确率。为了提高模型预测能力,这种技术可以被视为一种强制性技巧。

在Keras中,我们使用ImageDataGenerator来执行所有这些转换。它有一大堆参数,你可以用它们来预处理你的训练数据。

下面是示例代码:

from keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(horizontal flip=True)

datagen.fit(train)

d47e62d2b349aca45e42305ed6714efbe5ed61d9提前停止(Early stopping)

提前停止是一种交叉验证的策略,即把一部分训练集保留作为验证集。当看到验证集上的性能变差时,就立即停止模型的训练。

e073fc7c0e08258afb081db35ddc2604b6e0fbc0

在上图中,我们在虚线处停止模型的训练,因为在此处之后模型会开始在训练数据上过拟合。

在Keras中,使用callbacks函数来应用提前停止。下面是代码:

from keras.callbacks import EarlyStopping

EarlyStopping(monitor='val_err', patience=5)

这里的monitor是表示需要监视的量,‘val_err’代表验证集错误.

Patience表示在该数量的epochs内没有进一步的性能改进后,就停止训练。为了更好地理解,我们再看看上面的图。在虚线之后,每个epoch都会导致一个更高的验证集错误。因此,在虚线之后的5个epoch(因为我们设置patience等于5),由于没有进一步的改善,模型将停止训练。

注意:可能在5个epoch之后(这是一般情况下为patience设定的值)模型再次开始改进,并且验证集错误也开始减少。因此,在调整这个超参数的时候要格外小心。

d47e62d2b349aca45e42305ed6714efbe5ed61d9在MNIST数据集上使用Keras的案例研究

至此,你应该对我们提到的各种技术有了一个理论上的理解。现在我们把这些知识用在深度学习实际问题上——识别数字。下载完数据集之后,你就可以开始下面的代码。首先,我们导入一些基本的库。

%pylab inline

import numpy as np

import pandas as pd

from scipy.misc import imread

from sklearn.metrics import accuracy_score

from matplotlib import pyplot

import tensorflow as tf

import keras

# To stop potential randomness

seed = 128

rng = np.random.RandomState(seed)

现在,加载数据。

423fac4703bd527a463cbc7afa22750e0637220b

现在拿一些图片来看看。

img_name = rng.choice(train.filename)

filepath = os.path.join(data_dir, 'Train', 'Images', 'train', img_name)

img = imread(filepath, flatten=True)

pylab.imshow(img, cmap='gray')

pylab.axis('off')

pylab.show()
0ae3b61fac96897f91d4dbc09a21487c7258971f

#storing images in numpy arrays

temp = []

for img_name in train.filename:

image_path = os.path.join(data_dir, 'Train', 'Images', 'train', img_name)

img = imread(image_path, flatten=True)

img = img.astype('float32')

temp.append(img)

x_train = np.stack(temp)

x_train /= 255.0

x_train = x_train.reshape(-1, 784).astype('float32')

y_train = keras.utils.np_utils.to_categorical(train.label.values)

创建一个验证集,以便优化我们的模型以获得更好的分数。我们将采用70:30的训练集、验证集比例。

split_size = int(x_train.shape[0]*0.7)

x_train, x_test = x_train[:split_size], x_train[split_size:]

y_train, y_test = y_train[:split_size], y_train[split_size:]

首先,我们先建立一个具有5个隐藏层,每层500个节点的简单神经网络。

# import keras modules

from keras.models import Sequential

from keras.layers import Dense

# define vars

input_num_units = 784

hidden1_num_units = 500

hidden2_num_units = 500

hidden3_num_units = 500

hidden4_num_units = 500

hidden5_num_units = 500

output_num_units = 10

epochs = 10

batch_size = 128

model = Sequential([

Dense(output_dim=hidden1_num_units, input_dim=input_num_units, activation='relu'),

Dense(output_dim=hidden2_num_units, input_dim=hidden1_num_units, activation='relu'),

Dense(output_dim=hidden3_num_units, input_dim=hidden2_num_units, activation='relu'),

Dense(output_dim=hidden4_num_units, input_dim=hidden3_num_units, activation='relu'),

Dense(output_dim=hidden5_num_units, input_dim=hidden4_num_units, activation='relu'),

Dense(output_dim=output_num_units, input_dim=hidden5_num_units, activation='softmax'),

])

注意,我们只运行10个epoch,快速检查一下模型的性能。

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

trained_model_5d = model.fit(x_train, y_train, nb_epoch=epochs, batch_size=batch_size, validation_data=(x_test, y_test))
7794eee1a9f708bbb64f4f7eab5fdbf6c0971b70




现在,我们尝试用L2正则化,并检查它是否给出了比简单神经网络更好的性能。

from keras import regularizers

model = Sequential([

Dense(output_dim=hidden1_num_units, input_dim=input_num_units, activation='relu',

kernel_regularizer=regularizers.l2(0.0001)),

Dense(output_dim=hidden2_num_units, input_dim=hidden1_num_units, activation='relu',

kernel_regularizer=regularizers.l2(0.0001)),

Dense(output_dim=hidden3_num_units, input_dim=hidden2_num_units, activation='relu',

kernel_regularizer=regularizers.l2(0.0001)),

Dense(output_dim=hidden4_num_units, input_dim=hidden3_num_units, activation='relu',

kernel_regularizer=regularizers.l2(0.0001)),

Dense(output_dim=hidden5_num_units, input_dim=hidden4_num_units, activation='relu',

kernel_regularizer=regularizers.l2(0.0001)),

Dense(output_dim=output_num_units, input_dim=hidden5_num_units, activation='softmax'),

])

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

trained_model_5d = model.fit(x_train, y_train, nb_epoch=epochs, batch_size=batch_size, validation_data=(x_test, y_test))
e1f20b336a1cefc3aa403e4a9f8505af2ce33239

注意这里lambda的值等于0.0001. 太棒了!我们获得了一个比之前NN模型更好的准确率。

现在尝试一下L1正则化。

## l1

model = Sequential([

Dense(output_dim=hidden1_num_units, input_dim=input_num_units, activation='relu',

kernel_regularizer=regularizers.l1(0.0001)),

Dense(output_dim=hidden2_num_units, input_dim=hidden1_num_units, activation='relu',

kernel_regularizer=regularizers.l1(0.0001)),

Dense(output_dim=hidden3_num_units, input_dim=hidden2_num_units, activation='relu',

kernel_regularizer=regularizers.l1(0.0001)),

Dense(output_dim=hidden4_num_units, input_dim=hidden3_num_units, activation='relu',

kernel_regularizer=regularizers.l1(0.0001)),

Dense(output_dim=hidden5_num_units, input_dim=hidden4_num_units, activation='relu',

kernel_regularizer=regularizers.l1(0.0001)),

Dense(output_dim=output_num_units, input_dim=hidden5_num_units, activation='softmax'),

])

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

trained_model_5d = model.fit(x_train, y_train, nb_epoch=epochs, batch_size=batch_size, validation_data=(x_test, y_test))

这次并没有显示出任何的改善。我们再来试试dropout技术。

## dropout

from keras.layers.core import Dropout

model = Sequential([

Dense(output_dim=hidden1_num_units, input_dim=input_num_units, activation='relu'),

Dropout(0.25),

Dense(output_dim=hidden2_num_units, input_dim=hidden1_num_units, activation='relu'),

Dropout(0.25),

Dense(output_dim=hidden3_num_units, input_dim=hidden2_num_units, activation='relu'),

Dropout(0.25),

Dense(output_dim=hidden4_num_units, input_dim=hidden3_num_units, activation='relu'),

Dropout(0.25),

Dense(output_dim=hidden5_num_units, input_dim=hidden4_num_units, activation='relu'),

Dropout(0.25),

Dense(output_dim=output_num_units, input_dim=hidden5_num_units, activation='softmax'),

])

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

trained_model_5d = model.fit(x_train, y_train, nb_epoch=epochs, batch_size=batch_size, validation_data=(x_test, y_test))

25904e6f79f3c9d274e1ca03d1156ce2c5185976

效果不错!dropout也在简单NN模型上给出了一些改善。

现在,我们试试数据增强。

from keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(zca_whitening=True)

# loading data

train = pd.read_csv(os.path.join(data_dir, 'Train', 'train.csv'))

temp = []

for img_name in train.filename:

image_path = os.path.join(data_dir, 'Train', 'Images', 'train', img_name)

img = imread(image_path, flatten=True)

img = img.astype('float32')

temp.append(img)

x_train = np.stack(temp)

X_train = x_train.reshape(x_train.shape[0], 1, 28, 28)

X_train = X_train.astype('float32')

现在,拟合训练数据以便增强。

# fit parameters from data

datagen.fit(X_train)

这里,我使用了zca_whitening作为实参,它突出了每个数字的轮廓,如下图所示:

626fb536565fbefd6a4a9ebe34a411a12c57e816

## splitting

y_train = keras.utils.np_utils.to_categorical(train.label.values)

split_size = int(x_train.shape[0]*0.7)

x_train, x_test = X_train[:split_size], X_train[split_size:]

y_train, y_test = y_train[:split_size], y_train[split_size:]

## reshaping

x_train=np.reshape(x_train,(x_train.shape[0],-1))/255

x_test=np.reshape(x_test,(x_test.shape[0],-1))/255

## structure using dropout

from keras.layers.core import Dropout

model = Sequential([

Dense(output_dim=hidden1_num_units, input_dim=input_num_units, activation='relu'),

Dropout(0.25),

Dense(output_dim=hidden2_num_units, input_dim=hidden1_num_units, activation='relu'),

Dropout(0.25),

Dense(output_dim=hidden3_num_units, input_dim=hidden2_num_units, activation='relu'),

Dropout(0.25),

Dense(output_dim=hidden4_num_units, input_dim=hidden3_num_units, activation='relu'),

Dropout(0.25),

Dense(output_dim=hidden5_num_units, input_dim=hidden4_num_units, activation='relu'),

Dropout(0.25),

Dense(output_dim=output_num_units, input_dim=hidden5_num_units, activation='softmax'),

])

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

trained_model_5d = model.fit(x_train, y_train, nb_epoch=epochs, batch_size=batch_size, validation_data=(x_test, y_test))
6ae770ae5b79c77734d6eb6d4c6cfe72c6e2f6a5

哇!我们在准确率得分上有了一个飞跃。并且好消息是它每次都奏效。我们只需要根据数据集中的图像来选择一个合适的实参。

现在,试一下最后一种技术——提前停止。

from keras.callbacks import EarlyStopping

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

trained_model_5d = model.fit(x_train, y_train, nb_epoch=epochs, batch_size=batch_size, validation_data=(x_test, y_test)

, callbacks = [EarlyStopping(monitor='val_acc', patience=2)])
457a4b87a7c89af1450c0ce2f95118ed5a4220c0

可以看到我们的模型在仅仅5轮迭代后就停止了,因为验证集准确率不再提高了。当我们使用更大值的epochs来运行它时,它会给出好的结果。你可以说它是一种优化epoch值的技术。

结语

我希望现在你已经理解了正则化以及在深度学习模型中实现正则化的不同技术。 无论你处理任何深度学习任务,我都强烈建议你使用正则化。它将帮助你开阔视野并更好的理解这个主题。


原文发布时间为:2018-05-24

本文作者:SHUBHAM JAIN

本文来自云栖社区合作伙伴“数据派THU”,了解相关信息可以关注“数据派THU”。

相关文章
|
10天前
|
机器学习/深度学习 监控 算法
深度学习赋能智能监控:图像识别技术的革新与应用
【4月更文挑战第8天】 随着人工智能技术的飞速发展,深度学习在图像处理领域取得了突破性进展。特别是在智能监控系统中,基于深度学习的图像识别技术已成为提升安全和效率的关键工具。本文将探讨深度学习技术如何革新传统监控体系,增强其对复杂场景的理解能力,以及在实际部署中面临的挑战和解决方案。通过分析最新的研究成果和应用案例,我们揭示了深度学习在智能监控领域的潜力及其对未来社会发展的影响。
17 2
|
9天前
|
机器学习/深度学习 监控 安全
智能化视野下的守卫者:基于深度学习的图像识别技术在智能监控领域的革新应用
【4月更文挑战第9天】 随着人工智能技术的飞速发展,深度学习已经成为了推动计算机视觉进步的重要力量。尤其在智能监控领域,基于深度学习的图像识别技术正逐步转变着传统监控系统的功能与效率。本文旨在探讨深度学习技术如何赋能智能监控,提高对场景理解的准确性,增强异常行为检测的能力,并讨论其在实际部署中所面临的挑战和解决方案。通过深入分析,我们揭示了深度学习在智能监控中的应用不仅优化了安全防范体系,也为城市管理和公共安全提供了有力的技术支持。
|
6天前
|
分布式计算 Hadoop 大数据
大数据技术与Python:结合Spark和Hadoop进行分布式计算
【4月更文挑战第12天】本文介绍了大数据技术及其4V特性,阐述了Hadoop和Spark在大数据处理中的作用。Hadoop提供分布式文件系统和MapReduce,Spark则为内存计算提供快速处理能力。通过Python结合Spark和Hadoop,可在分布式环境中进行数据处理和分析。文章详细讲解了如何配置Python环境、安装Spark和Hadoop,以及使用Python编写和提交代码到集群进行计算。掌握这些技能有助于应对大数据挑战。
|
2天前
|
数据采集 NoSQL 搜索推荐
五一假期畅游指南:Python技术构建的热门景点分析系统解读
五一假期畅游指南:Python技术构建的热门景点分析系统解读
|
9天前
|
机器学习/深度学习 自动驾驶 算法
基于深度学习的图像识别技术在自动驾驶系统中的应用
【4月更文挑战第9天】 随着人工智能技术的不断进步,深度学习已成为推动多个领域革新的核心动力。特别是在图像识别领域,通过模仿人类视觉系统的处理机制,深度学习模型已展现出超越传统算法的性能。本文将探讨深度学习在图像识别中的关键技术,并重点分析这些技术如何被应用于自动驾驶系统中以实现车辆环境的实时理解与决策。我们将从卷积神经网络(CNN)的基础结构出发,讨论其在特征提取、物体检测和分类中的作用,以及如何通过增强学习和迁移学习等策略来优化模型性能。此外,我们还将评估当前技术面临的挑战,如数据集偏差、实时处理需求以及模型泛化能力,并提出可能的解决方案。
10 1
|
11天前
|
机器学习/深度学习 人工智能 监控
深度学习赋能智能监控:图像识别技术的革新与应用
【4月更文挑战第7天】 随着人工智能的迅猛发展,深度学习技术在图像处理领域已经取得了突破性的进展。特别是在智能监控系统中,基于深度学习的图像识别技术正逐渐取代传统的模式识别方法,为视频监控带来了革命性的变化。本文旨在探讨深度学习技术在智能监控领域的具体应用,分析其优势和面临的挑战,以及未来的发展趋势。通过深入剖析,我们了解到深度学习不仅提高了图像识别的准确性和效率,还拓展了智能监控系统的功能范围,使其在安全、交通管理、环境监测等多个方面发挥了巨大作用。
|
11天前
|
机器学习/深度学习 自动驾驶 安全
基于深度学习的图像识别技术在自动驾驶系统中的应用
【4月更文挑战第7天】 随着人工智能技术的飞速发展,尤其是深度学习在图像处理领域的突破性进展,自动驾驶系统得到了前所未有的推动。本文旨在探讨如何将基于深度学习的图像识别技术有效集成到自动驾驶系统中,以提高其准确性和可靠性。文章首先介绍了深度学习的基本概念及其在图像识别中的关键作用,随后详细分析了自动驾驶系统对图像识别技术的具体需求,接着提出了一种改进的卷积神经网络模型,并通过实验验证了该模型在复杂环境下的性能表现。最后,本文还讨论了在实际部署过程中可能遇到的挑战及潜在的解决方案。
13 0
|
11天前
|
机器学习/深度学习 监控 安全
深度学习赋能智能监控:图像识别技术的革新与应用
【4月更文挑战第7天】 在现代智能监控系统中,基于深度学习的图像识别技术已成为核心推动力,其在实时监控、事件检测和行为分析等方面展现出了前所未有的能力。本文旨在探讨深度学习算法如何增强智能监控系统的效能,以及这些技术在实际部署中所面临的挑战与解决策略。我们将详细分析卷积神经网络(CNN)和循环神经网络(RNN)等深度学习模型在处理视频数据时的优势,并展示其在人群计数、异常行为检测和面部识别等智能监控任务中的应用案例。最后,本文将讨论在大规模部署深度学习模型时需要考虑的数据隐私和模型透明度问题。
11 1
|
13天前
|
机器学习/深度学习 运维 监控
深度视野:深度学习技术在智能监控系统中的革新应用
【4月更文挑战第5天】 随着人工智能技术的飞速发展,深度学习已成为图像处理和分析领域的核心技术之一。本文将深入探讨基于深度学习的图像识别技术在智能监控领域的应用及其带来的变革。我们将从神经网络的基本构成出发,解析其如何实现对监控图像中复杂场景的高效识别与分析,并进一步讨论这些技术在提高监控准确性、实时性和自动化水平方面的作用。此外,文中还将涉及深度学习技术面临的挑战及未来发展趋势。
|
14天前
|
机器学习/深度学习 传感器 数据采集
基于深度学习的图像识别技术在自动驾驶系统中的应用
【4月更文挑战第4天】随着人工智能技术的飞速发展,深度学习已经成为计算机视觉领域的核心推动力。尤其是在图像识别任务中,深度神经网络表现出了超越传统算法的性能。本文将探讨深度学习模型在自动驾驶汽车图像识别系统中的应用,重点分析卷积神经网络(CNN)的结构、训练过程以及优化策略,并讨论其在处理实时交通场景中的效率和准确性。此外,文章还将涉及数据增强、迁移学习等先进技术如何进一步提升模型的泛化能力和鲁棒性。

热门文章

最新文章