1D 卷积神经网络模型用于人类活动识别

人类活动识别是指将由专用安全带或智能手机记录的加速度计数据序列分类为已知的、定义明确的运动的问题。

传统方法涉及从时间序列数据中基于固定大小的窗口手工提取特征,并训练机器学习模型,例如决策树的集成。困难之处在于这种特征工程需要该领域的深厚专业知识。

最近,循环神经网络和一维卷积神经网络(CNN)等深度学习方法已被证明在具有很少或没有数据特征工程的具有挑战性的活动识别任务上可提供最先进的结果,而是使用原始数据进行特征学习。

在本教程中,您将了解如何为人类活动识别的时间序列分类开发一维卷积神经网络。

完成本教程后,您将了解:

  • 如何加载和准备标准人类活动识别数据集的数据,并开发一个在原始数据上实现优异性能的单一 1D CNN 模型。
  • 如何进一步调整模型的性能,包括数据转换、滤波器图和核大小。
  • 如何开发一个复杂的多头一维卷积神经网络模型,该模型可提供类似集成的结果。

通过我的新书《时间序列预测深度学习》分步教程和所有示例的Python源代码文件,从而快速启动您的项目

让我们开始吧。

How to Develop 1D Convolutional Neural Network Models for Human Activity Recognition

如何开发一维卷积神经网络模型以进行人类活动识别
照片来源:Wolfgang Staudt,部分权利保留。

教程概述

本教程分为四个部分;它们是

  1. 使用智能手机数据集进行活动识别
  2. 开发一维卷积神经网络
  3. 经过调整的一维卷积神经网络
  4. 多头一维卷积神经网络

使用智能手机数据集进行活动识别

人类活动识别,简称HAR,是根据传感器记录的人体运动轨迹预测其正在做什么的问题。

一个标准的人类活动识别数据集是 2012 年发布的“使用智能手机进行人类活动识别数据集”。

该数据集由意大利热那亚大学的 Davide Anguita 等人准备并提供,并在其 2013 年的论文“使用智能手机进行人类活动识别的公共领域数据集”中进行了详述。该数据集在他们 2012 年题为“使用多类硬件友好型支持向量机进行智能手机上的人类活动识别”的论文中使用了机器学习算法进行建模。

该数据集已发布,可从UCI机器学习库免费下载

数据是从 19 至 48 岁的 30 名受试者收集的,他们在佩戴腰部智能手机记录运动数据时执行六种标准活动之一。对每名受试者执行活动的情况进行了视频录制,并根据这些视频手动标记了运动数据。

下面是受试者执行活动并记录运动数据的示例视频。

执行的六项活动如下:

  1. 步行
  2. 上楼梯
  3. 下楼梯
  4. 坐着
  5. 站立
  6. 躺着

记录的运动数据是来自智能手机(具体来说是三星 Galaxy S II)的 x、y 和 z 轴加速度计数据(线性加速度)和陀螺仪数据(角速度)。观测值以 50 Hz(即每秒 50 个数据点)记录。每位受试者执行两次活动序列,一次设备在左侧,一次设备在右侧。

无法获取原始数据。而是提供了一个预处理版本的数据集。预处理步骤包括

  • 使用噪声滤波器预处理加速度计和陀螺仪。
  • 将数据分割成2.56秒(128个数据点)的固定窗口,重叠率为50%。
  • 将加速度计数据分解为重力(总)和身体运动分量。

对窗口数据应用特征工程,并提供了一份包含这些工程特征的数据副本。

从每个窗口中提取了人类活动识别领域常用的时间和频率特征。结果是生成了一个包含561个元素的特征向量。

数据集根据受试者的数据分为训练集(70%)和测试集(30%),例如21名受试者用于训练,9名受试者用于测试。

针对智能手机(例如定点算术)设计的支持向量机的实验结果在测试数据集上取得了 89% 的预测准确率,与未修改的 SVM 实现取得了相似的结果。

该数据集可免费从UCI机器学习库下载。

数据以一个大小约为58兆字节的zip文件提供。直接下载链接如下:

下载数据集,并将所有文件解压缩到当前工作目录中的一个名为“HARDataset”的新目录中。

时间序列深度学习需要帮助吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

开发一维卷积神经网络

在本节中,我们将为人类活动识别数据集开发一个一维卷积神经网络模型(1D CNN)。

卷积神经网络模型是为图像分类问题开发的,模型通过一个称为特征学习的过程学习二维输入的内部表示。

这一过程可以应用于一维数据序列,例如在人类活动识别的加速度和陀螺仪数据的情况下。模型学会从观测序列中提取特征,以及如何将内部特征映射到不同的活动类型。

使用 CNN 进行序列分类的好处是它们可以直接从原始时间序列数据中学习,因此不需要领域专业知识来手动工程化输入特征。模型可以学习时间序列数据的内部表示,并理想地获得与在具有工程特征的数据集版本上拟合的模型相当的性能。

本节分为 4 个部分,它们是:

  1. 加载数据
  2. 拟合和评估模型
  3. 总结结果
  4. 完整示例

加载数据

第一步是将原始数据集加载到内存中。

原始数据中有三种主要的信号类型:总加速度、身体加速度和身体陀螺仪。每种都有三个轴的数据。这意味着每个时间步总共有九个变量。

此外,每个数据系列已被划分为重叠窗口,每个窗口包含 2.56 秒的数据,即 128 个时间步。这些数据窗口对应于上一节中特征工程(行)的窗口。

这意味着一行数据包含 (128 * 9) = 1,152 个元素。这比上一节中的 561 个元素向量略少一倍,并且很可能存在一些冗余数据。

信号存储在 train 和 test 子目录下的 /Inertial Signals/ 目录中。每个信号的每个轴都存储在一个单独的文件中,这意味着每个 train 和 test 数据集都有九个输入文件需要加载,以及一个输出文件需要加载。鉴于一致的目录结构和文件名约定,我们可以将这些文件的加载分批处理。

输入数据是 CSV 格式,列由空格分隔。这些文件中的每一个都可以加载为 NumPy 数组。下面的 load_file() 函数加载给定文件路径的数据集,并以 NumPy 数组的形式返回加载的数据。

然后,我们可以将给定组(训练或测试)的所有数据加载到一个单一的三维 NumPy 数组中,其中数组的维度是 [样本、时间步、特征]。

为了更清楚,有 128 个时间步和九个特征,其中样本数是任何给定原始信号数据文件中的行数。

下面的 load_group() 函数实现了此功能。 dstack() NumPy 函数允许我们将每个加载的 3D 数组堆叠成一个单一的 3D 数组,其中变量在第三个维度(特征)上分开。

我们可以使用此函数加载给定组的所有输入信号数据,例如train或test。

下面的 load_dataset_group() 函数使用 train 和 test 目录之间一致的命名约定,加载单个组的所有输入信号数据和输出数据。

最后,我们可以加载每个train和test数据集。

输出数据被定义为类别号的整数。我们必须将这些类别整数进行独热编码,以便数据适合拟合神经网络的多类分类模型。我们可以通过调用 to_categorical() Keras 函数来完成此操作。

下面的 load_dataset() 函数实现了此功能,并返回准备好拟合和评估已定义模型的训练和测试 Xy 元素。

拟合和评估模型

现在数据已加载到内存中并准备好进行建模,我们可以定义、拟合和评估一个 1D CNN 模型。

我们可以定义一个名为 evaluate_model() 的函数,该函数接收训练和测试数据集,在训练数据集上拟合模型,在测试数据集上进行评估,并返回模型性能的估计值。

首先,我们必须使用 Keras 深度学习库定义 CNN 模型。该模型需要三维输入,格式为 [样本、时间步、特征]。

这正是我们加载数据的方式,其中一个样本是时间序列数据的一个窗口,每个窗口有 128 个时间步,而一个时间步有九个变量或特征。

模型的输出将是一个六个元素的向量,其中包含给定窗口属于六种活动类型之一的概率。

在拟合模型时需要这些输入和输出维度,我们可以从提供的训练数据集中提取它们。

为简单起见,模型定义为 Keras 顺序模型。

我们将模型定义为具有两个 1D CNN 层,然后是一个用于正则化的 dropout 层,接着是一个 池化层。将 CNN 层定义为两组是很常见的,以便模型有很好的机会从输入数据中学习特征。CNN 学习速度非常快,因此 dropout 层旨在帮助减慢学习过程,并有望获得更好的最终模型。池化层将学习到的特征大小减小到原来的 1/4,将其整合为最重要的元素。

在 CNN 和池化之后,学习到的特征被展平为一个长向量,并经过一个全连接层,然后是用于进行预测的输出层。全连接层理想地提供了学习到的特征和输出之间的缓冲,目的是在进行预测之前解释学习到的特征。

对于此模型,我们将使用标准的配置,即 64 个并行特征图和 3 个的核大小。特征图是输入被处理或解释的次数,而核大小是在读取或处理输入序列到特征图时考虑的输入时间步的数量。

将使用随机梯度下降的标准 Adam 版本来优化网络,由于我们正在学习一个多类分类问题,因此将使用分类交叉熵损失函数。

模型的定义如下所示。

模型将进行固定数量的 epoch 训练,本例中为 10 个,并将使用 32 的批次大小,即在模型权重更新之前,模型将看到 32 个窗口的数据。

模型拟合完成后,将在测试数据集上进行评估,并返回拟合模型在测试数据集上的准确率。

完整的 evaluate_model() 函数如下所示。

网络结构或选择的超参数没有什么特别之处;它们只是这个问题的起点。

总结结果

我们无法从一次评估中判断模型的技能。

原因在于神经网络是随机的,这意味着在同一数据上训练相同的模型配置将产生不同的具体模型。

这是网络的一个特点,因为它赋予了模型自适应能力,但需要对模型进行更复杂的评估。

我们将重复模型评估多次,然后总结模型在每次运行中的性能。例如,我们可以调用 evaluate_model() 共 10 次。这将产生一个需要总结的模型评估分数总体。

我们可以通过计算和报告性能的平均值和标准差来总结分数样本。平均值给出模型在数据集上的平均准确率,而标准差给出准确率相对于平均值的平均方差。

下面的 summarize_results() 函数总结了运行结果。

我们可以将重复的评估、结果收集和结果总结打包到一个主函数中,称为 run_experiment(),如下所示。

默认情况下,模型会先评估 10 次,然后报告模型的性能。

完整示例

现在我们有了所有的组成部分,可以将它们组合成一个可工作的示例。

完整的代码列表如下。

运行该示例首先会打印加载的数据集的形状,然后是训练集和测试集的形状以及输入和输出元素。这确认了样本数、时间步长和变量数,以及类别数。

接下来,模型被创建和评估,并且每个模型都会打印一个调试消息。

注意:您的结果可能会有所不同,具体取决于算法或评估程序的随机性,或者数值精度的差异。请考虑运行示例几次并比较平均结果。

最后,打印分数样本,然后是均值和标准差。我们可以看到,该模型表现良好,在原始数据集上训练时达到了约 90.9% 的分类准确率,标准差约为 1.3。

考虑到原始论文发表的结果是 89%,且是在经过大量领域特定特征工程的数据集上训练的,而不是原始数据集,这是一个不错的结果。

既然我们已经看到了如何加载数据并拟合 1D CNN 模型,我们就可以研究一下通过一些超参数调整是否能进一步提升模型的技能。

经过调整的一维卷积神经网络

在本节中,我们将调整模型,以期进一步提高在该问题上的性能。

我们将关注三个主要方面

  1. 数据准备
  2. Filters数量
  3. Kernel大小

数据准备

在上一节中,我们没有进行任何数据预处理。我们直接使用了数据。

主要的数据集(身体加速度、身体陀螺仪和总加速度)已被缩放到 -1 到 1 的范围。尚不清楚数据是按受试者缩放的,还是跨所有受试者缩放的。

一种可能有助于改进的转换是,在拟合模型之前对观测值进行标准化。

标准化是指将每个变量的分布移动,使其均值为零,标准差为 1。只有当每个变量的分布是高斯分布时,它才有意义。

我们可以通过绘制训练数据集中每个变量的直方图来快速检查每个变量的分布。

这里有一个小小的困难,数据被分割成 128 个时间步长的窗口,重叠率为 50%。因此,为了公平地了解数据分布,我们必须先删除重复的观测值(重叠部分),然后移除数据的窗口化。

我们可以使用 NumPy 来做到这一点,首先对数组进行切片,只保留每个窗口的后半部分,然后将每个变量的窗口展平成一个长向量。这是一种快速粗糙的方法,确实意味着我们丢失了第一个窗口前半部分的数据。

加载数据、展平数据并为九个变量中的每个变量绘制直方图的完整示例列在下面。

运行示例会创建一个包含九个直方图的图形,每个图形对应训练数据集中的一个变量。

图形的顺序与数据加载的顺序相匹配,具体是

  1. 总加速度 x
  2. 总加速度 y
  3. 总加速度 z
  4. 身体加速度 x
  5. 身体加速度 y
  6. 身体加速度 z
  7. 身体陀螺仪 x
  8. 身体陀螺仪 y
  9. 身体陀螺仪 z

我们可以看到,除第一个变量(总加速度 x)可能之外,每个变量都具有类似高斯分布的分布。

总加速度数据的分布比身体数据的分布更平坦,身体数据的分布更尖锐。

我们可以探索使用幂变换来使分布更像高斯分布,但这留作练习。

Histograms of each variable in the training data set

训练数据集中每个变量的直方图

数据具有足够的高斯相似性,可以探索标准化转换是否能帮助模型从原始观测值中提取有用的信号。

下面名为 scale_data() 的函数可用于在拟合和评估模型之前标准化数据。将使用 scikit-learn 的 StandardScaler 类来执行转换。它首先在训练数据上进行拟合(例如,找到每个变量的均值和标准差),然后应用于训练集和测试集。

标准化是可选的,因此我们可以应用该过程,并在对照实验中将其结果与不进行标准化的相同代码路径进行比较。

我们可以更新 evaluate_model() 函数以接受一个参数,然后使用此参数来决定是否执行标准化。

我们还可以更新 run_experiment() 函数,为每个参数重复实验 10 次;在这种情况下,将仅评估两个参数 [False, True],分别表示不标准化和标准化。

这将产生两个可以比较的结果样本。

我们将更新 summarize_results() 函数来为每个配置参数总结结果样本,并创建一个箱线图来比较每个结果样本。

这些更新将允许我们直接比较模型按原样拟合的结果与数据集标准化后的结果。

这本身也是一个通用的更改,允许我们在接下来的章节中评估和比较其他参数集的结果。

完整的代码列表如下。

运行该示例可能需要几分钟时间,具体取决于您的硬件。

每个评估模型的性能都会被打印出来。在运行结束时,将总结每个测试配置的性能,显示均值和标准差。

注意:您的结果可能会有所不同,具体取决于算法或评估程序的随机性,或者数值精度的差异。请考虑运行示例几次并比较平均结果。

我们可以看到,在建模之前标准化数据集确实能带来性能的小幅提升,从大约 90.4% 的准确率(接近我们在上一节中看到的)提升到大约 91.5% 的准确率。

结果的箱线图也已创建。

这使得可以以非参数方式比较两个结果样本,显示中位数和每个样本的中间 50%。

我们可以看到,标准化结果的分布与不标准化结果的分布有很大的不同。这很可能是一个真实的效果。

Box and whisker plot of 1D CNN with and without standardization

1D CNN(标准化与否)的箱线图

Filters数量

既然我们有了一个实验框架,我们就可以探索调整模型的其他超参数。

CNN 的一个重要超参数是 filter map 的数量。我们可以尝试一系列不同的值,从比我们开发的第一个模型中使用的 64 个值少到多。

具体来说,我们将尝试以下数量的特征图

我们可以使用上一节的相同代码,并更新 evaluate_model() 函数,将提供的参数用作 Conv1D 层中的过滤器数量。我们还可以更新 summarize_results() 函数,将箱线图保存为 exp_cnn_filters.png

完整的代码示例如下所示。

运行示例会为每个指定的过滤器数量重复实验。

运行结束后,将展示每个过滤器数量结果的摘要。

注意:您的结果可能会有所不同,具体取决于算法或评估程序的随机性,或者数值精度的差异。请考虑运行示例几次并比较平均结果。

我们可以看到,平均性能随着 filter map 数量的增加而增加。方差保持相对恒定,也许 128 个特征图可能是网络的良好配置。

结果的箱线图也已创建,允许比较每个过滤器数量的结果分布。

从图中可以看出,随着特征图数量的增加,分类准确率的中位数(箱体上的橙色线)呈上升趋势。我们确实看到在 64 个特征图(我们实验中的默认或基线)处有一个下降,这有点令人惊讶,并且可能在 32、128 和 256 个过滤器图中出现平台期。也许 32 个会是更稳定的配置。

Box and whisker plot of 1D CNN with different numbers of filter maps

1D CNN 不同数量 filter map 的箱线图

Kernel大小

Kernel 的大小是 1D CNN 需要调整的另一个重要超参数。

Kernel 大小控制着在每次“读取”输入序列时考虑的时间步长数量,然后通过卷积过程投影到特征图上。

较大的 Kernel 大小意味着对数据的读取不如严格,但可能产生更泛化的快照。

我们可以使用相同的实验设置,并除了默认的三时间步长之外,测试一套不同的卷积核大小。所有值的列表如下:

完整的代码列表如下:

运行示例会依次测试每个卷积核大小。

注意:您的结果可能会有所不同,具体取决于算法或评估程序的随机性,或者数值精度的差异。请考虑运行示例几次并比较平均结果。

结果在运行结束时进行总结。我们可以看到模型性能随着卷积核大小的增加而普遍提高。

结果表明,卷积核大小为 5 可能效果不错,平均得分约为 91.8%,但大小为 7 或 11 也可能同样好,且标准差更小。

结果的箱线图也已创建。

结果表明,较大的卷积核大小确实会带来更好的准确性,而卷积核大小为 7 可以在良好的性能和低方差之间取得良好的平衡。

Box and whisker plot of 1D CNN with different numbers of kernel sizes

具有不同卷积核数量的 1D CNN 的箱须图

这只是模型调优的开始,尽管我们已经专注于其中一些可能更重要的元素。探索上述发现的一些组合可能会很有趣,看看性能是否可以进一步提升。

将重复次数从 10 增加到 30 或更多,看看这是否会导致更稳定的发现,也可能很有趣。

多头卷积神经网络

CNN 的另一种流行方法是采用多头模型,其中模型的每个头使用不同大小的卷积核读取输入时间步。

例如,一个三头模型可能有三种不同的卷积核大小:3、5、11,允许模型以三种不同的分辨率读取和解释序列数据。然后,来自所有三个头的解释在模型内被串联起来,并在做出预测之前由全连接层进行解释。

我们可以使用 Keras 功能 API 来实现多头 1D CNN。有关此 API 的初步介绍,请参阅帖子

下面列出了 `evaluate_model()` 函数的更新版本,该版本创建了一个三头 CNN 模型。

我们可以看到,模型的每个头都具有相同的结构,尽管卷积核大小不同。然后,三个头在进行预测之前,被馈送到单个合并层,然后进行解释。

模型创建时,会生成一张网络架构图,如下图所示,它清晰地展示了构建的模型是如何组合在一起的。

Plot of the Multi-Headed 1D Convolutional Neural Network

多头 1D 卷积神经网络图

模型在各个头上的其他方面也可以进行变化,例如滤波器的数量,甚至是数据本身的准备方式。

下面列出了带有带头 1D CNN 的完整代码示例。

运行示例会打印模型每次实验重复的性能,然后总结估计得分作为平均值和标准差,就像我们在第一个示例中对简单的 1D CNN 所做的那样。

注意:您的结果可能会有所不同,具体取决于算法或评估程序的随机性,或者数值精度的差异。请考虑运行示例几次并比较平均结果。

我们可以看到,模型的平均性能约为 91.6% 的分类准确率,标准差约为 0.8。

此示例可作为探索各种其他模型的依据,这些模型在输入头之间变化不同的模型超参数,甚至不同的数据准备方案。

将此结果与单头 CNN 进行比较将不是苹果对苹果的比较,因为该模型中的资源增加了两倍。也许苹果对苹果的比较将是具有相同架构和每个输入头具有相同数量滤波器的模型。

扩展

本节列出了一些您可能希望探索的扩展本教程的想法。

  • 数据准备。探索其他数据准备方案,例如数据归一化,以及标准化后的归一化。
  • 网络架构。探索其他网络架构,例如更深层的 CNN 架构和更深层的全连接层,用于解释 CNN 输入特征。
  • 诊断。使用简单的学习曲线诊断来解释模型在训练周期中的学习情况,以及更多的正则化、不同的学习率、不同的批次大小或更多的训练周期是否能带来更好性能或更稳定的模型。

如果您探索了这些扩展中的任何一个,我很想知道。

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

论文

文章

总结

在本教程中,您学习了如何为时间序列分类开发一维卷积神经网络,以解决人类活动识别问题。

具体来说,你学到了:

  • 如何加载和准备标准人类活动识别数据集的数据,并开发一个在原始数据上实现优异性能的单一 1D CNN 模型。
  • 如何进一步调整模型的性能,包括数据转换、滤波器图和核大小。
  • 如何开发一个复杂的多头一维卷积神经网络模型,该模型可提供类似集成的结果。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

立即开发时间序列深度学习模型!

Deep Learning for Time Series Forecasting

在几分钟内开发您自己的预测模型

...只需几行python代码

在我的新电子书中探索如何实现
用于时间序列预测的深度学习

它提供关于以下主题的自学教程
CNNLSTM多元预测多步预测等等...

最终将深度学习应用于您的时间序列预测项目

跳过学术理论。只看结果。

查看内容

236 条回复关于 “用于人类活动识别的时间序列分类的 1D 卷积神经网络模型”

  1. Irati 2018 年 10 月 10 日下午 7:45 #

    嗨,Jason,
    这篇帖子和您的书都很棒!不过我有一个问题
    在我的例子中,尽管数据库的结构与示例相似,但由于环境的性质,数据集很小。
    我一直在深入研究,但找不到一种适用于多元时间序列的数据增强问题的良好方法。

    有什么建议吗?

    感谢您的工作!

    • Jason Brownlee 2018 年 10 月 11 日上午 7:54 #

      谢谢。

      一个很好的起点可能是向输入样本添加高斯噪声。

      • Cherries 2020 年 2 月 17 日下午 2:06 #

        老师您好,我有一个问题。例如,我想使用 4 个 IMU 数据将人类运动分类为四种运动:跑步、行走、上楼、下楼。每个 IMU 有 9 个特征,因此在同一时间步长中有 4 * 9 个特征。此分类可以使用 LSTM 模型吗?还是进行预测?

    • Daniel Thomas 2020 年 5 月 11 日凌晨 12:32 #

      Jason,

      我迫切想弄清楚一个我找不到任何答案的问题。

      当对多元时间序列进行 Conv1D 时——卷积核是卷积于所有维度还是分别卷积于每个维度?

      我将一个 900x10 的时间序列输入到 Conv1D(filter =16,kernel_size=6) 中
      我得到 800x16 的输出,而我期望得到 800x16x10,因为每个时间序列维度都与卷积核单独卷积。

      情况是怎样的?

      • Jason Brownlee 2020 年 5 月 11 日上午 6:01 #

        从内存上看,是分别对每个时间序列进行卷积。

  2. Yang 2018 年 10 月 31 日下午 1:55 #

    嗨,Jason,

    我创建了一个数据集并用 CNN 训练了它。训练准确率接近 1,但验证准确率仍保持在 0.55 左右。验证损失先下降后上升。这是过拟合问题吗?但是,数据增强和正则化没有效果。您有什么好建议吗?

    期待您的回复!

    • Jason Brownlee 2018 年 10 月 31 日下午 2:57 #

      听起来像是过拟合。

      尝试使用大型模型,并结合权重正则化和对验证数据集的提前停止。

  3. Lukas 2018 年 11 月 24 日晚上 9:13 #

    你好,

    首先,感谢您发表这篇精彩的帖子。我目前遇到了一个问题,想知道您能否给我一些想法。
    我正在分析一个只有 1 个特征的时间序列。但是,Keras 的 1D 卷积层需要一个矩阵作为输入。将 1D 时间序列分割成更小的子向量是否有意义?以及这具体意味着什么?

    提前感谢!

    • Jason Brownlee 2018 年 11 月 25 日上午 6:55 #

      是的,这可能有意义。其含义只能在您的特定问题的背景下进行评估。

  4. ravi jagannathan 2018 年 12 月 6 日上午 11:06 #

    您有 9 个特征,但它们并非独立。身体加速度 = 总加速度 - 重力
    其中重力是恒定的。所以这应该会导致错误吗?

  5. AT 2019 年 2 月 2 日上午 10:46 #

    感谢 Jason 的精彩帖子!我有一个非常相似的数据集,有 1700 多个样本,每个样本有 9 个特征(x、y、z 方向、加速度、速度)在 128 个时间戳上,我需要预测样本移动的表面(混凝土、瓷砖、地毯……共 9 种)。

    我直接使用了整个数据集并应用了 CNN。在大约 20 个训练周期后,acc 和 val_acc 没有从 60% 提高。

    您有什么关于如何处理这类传感器数据的想法吗?您的见解可能会对我的项目产生影响。

    • Jason Brownlee 2019 年 2 月 3 日上午 6:12 #

      一般来说,我建议测试一套模型以及每种方法的不同配置,以发现最适合您特定问题的方法。

      我渴望听到您的项目进展。

  6. Hayden 2019 年 3 月 28 日晚上 10:35 #

    嗨,Jason,

    感谢您发表这篇精彩的帖子。我目前正在处理一个类似的问题,使用车辆加速度,并正在探索使用 1D 卷积神经网络。我想知道的是,为什么您在拟合模型时没有使用验证集?

  7. Manisha 2019 年 4 月 10 日上午 6:50 #

    你好,先生,

    我们在这里评估神经网络模型,例如进行 10 次评估以获得准确率和标准差,这是因为它们具有随机性……如果我想绘制混淆矩阵,该如何进行?因为我们已经训练了 10 个模型……

    • Manisha 2019 年 4 月 10 日上午 6:52 #

      另外,如果我想绘制损失与周期图来检查过拟合,该如何在此处进行?

      • Jason Brownlee 2019 年 4 月 10 日下午 1:43 #

        您可以绘制单个运行的学习曲线,或者在单个图上绘制多次运行的所有曲线。

        • Maya 2021 年 7 月 28 日晚上 11:43 #

          您好,布朗利先生,
          感谢您提供这些清晰且非常有用的教程。
          您是否有绘制学习曲线或其他显示 1D CNN 模型性能的图形的示例?我看到了用于滤波器数量和卷积核数量的箱线图。
          我是 Python 新手,我需要看到代码示例 🙁 请帮帮我!

    • Jason Brownlee 2019 年 4 月 10 日下午 1:42 #

      好问题。

      混淆矩阵是基于模型的一次运行和对单个测试数据集的评估。

      • Manisha Bhattacharya 2019 年 4 月 10 日晚上 9:55 #

        所以这意味着,先生,在这里绘制混淆矩阵是不可行的,因为我们评估了模型 10 次……因为每次混淆矩阵都会不同?

  8. Manisha 2019 年 4 月 10 日晚上 9:57 #

    先生,您好,

    在所有上述分析中,您如何确定模型没有过拟合,而不绘制它?

    • Jason Brownlee 2019 年 4 月 11 日上午 6:38 #

      我现在不确定。

      不过,我在开发代码时确实检查了损失图。

      • Manisha 2019 年 4 月 12 日晚上 7:11 #

        先生,如果我评估模型 30 次,并取平均准确率(如上所述),但假设在这 30 次评估中,我的模型在某些情况下过拟合了(通过查看损失与周期的图),那么我是否仍应将平均准确率作为我的最终结果?

  9. Manisha 2019 年 4 月 11 日上午 4:04 #

    先生,还有一个疑问……我们说模型是随机的,每次结果都不同,但这是为什么呢?

    是因为我们一开始分配的权重每次都会改变吗?
    Keras 默认使用 glorot uniform……所以每次我们分配一个不同的 glorot uniform 权重,这就是为什么我们的模型是随机的?

  10. Manisha 2019年4月13日凌晨12:16 #

    先生,我们也可以在这里使用 gridsearch cv 和 keras wrapper 来调整参数,比如核和核的大小,对吧?

    那么上面展示的两种方法和 gridsearch 方法之间有什么区别……除了我们可以在 grid search 中使用的交叉验证之外?

    • Jason Brownlee 2019年4月13日凌晨6:32 #

      是的。

      我建议手动使用神经网络进行网格搜索,以便更好地控制过程。

  11. Rene 2019年5月2日凌晨4:03 #

    嗨,Jason,

    首先,非常感谢您分享您的所有知识和见解。
    我有一个问题想问您。在 1D CNN 的情况下,Keras 使用的默认过滤器/核是什么?

    • Jason Brownlee 2019年5月2日凌晨8:08 #

      这些超参数没有默认值,您必须指定过滤器的尺寸和过滤器的数量。

  12. Matt 2019年6月14日晚上8:15 #

    嗨 Jason

    关于您的代码,是否有可能为回归问题进行预测?如果是,您能否解释一下代码中具体应该更改什么?谢谢。

    此致,
    Matt

  13. vinodh 2019年6月21日晚上9:23 #

    你好,不错的博文,我们可以为此问题使用 conv2d 吗?如果不行,为什么?你能简要解释一下吗?

  14. Jhony 2019年7月3日晚上8:27 #

    亲爱的 Jason,

    我是否遗漏了什么,因为这个网络应该给出这 6 种活动的结果,从这个例子来看准确性非常好,如何在新数据集中使用此模型进行预测,其中没有标签?

  15. ICHaLiL 2019年7月7日凌晨4:57 #

    嗨,Jason,

    在 Flatten 之后,我们是否可以使用 TimeDistributed 层而不是 Dense 层?您有这方面的例子吗?因为当我尝试使用它时,总是收到不同的错误。

    谢谢。

  16. Colin 2019年8月7日凌晨12:45 #

    这可能不是问这个的地方,但这让我很抓狂。Pandas 给了我 FileNotFoundError,尽管文件确实在那里。其他人遇到过这个问题吗?我尝试使用绝对路径但没有改变。

  17. Eric 2019年8月10日凌晨12:48 #

    感谢您提供的出色教程。

    我注意到许多论文或教程从输入到卷积再到输出以及中间的每一个步骤都以图形方式描绘了它们模型。我试图重现这样一个图表,但在可视化这个图表时遇到了困难。

    例如
    http://alexlenail.me/NN-SVG/LeNet.html

    您是否为这个模型创建了这样的东西?

  18. Mohammad 2019年9月4日凌晨12:42 #

    嗨,Jason,

    感谢您有益的帖子。我可以问一下是否有任何关于 CNN 1D 理论方面的来源?任何帮助都将不胜感激。

    • Jason Brownlee 2019年9月4日凌晨6:00 #

      比如具体是什么?

      也许是深度学习教材。

  19. smitha 2019年9月14日凌晨2:50 #

    嗨,Jason,

    您的教程非常有帮助和信息量。它解决了我的许多疑问。但是,大多数示例都基于图像数据集。我不太确定如何处理表格数据的参数传递。您能否为 CNN 和 LSTM 在二元分类和外部数据集测试中使用 K 折交叉验证做一个教程?

    非常感谢。

  20. Frank 2019年9月18日凌晨5:03 #

    嗨 Jason,感谢您的帖子。
    为什么对于相同的数据集(正如您在另一篇文章中所示)使用 LSTM 会得到更差的结果?

    • Jason Brownlee 2019年9月18日凌晨6:31 #

      教程展示了如何使用这些模型,而不是如何为标准数据集获得最佳结果。

      • Frank 2019年9月18日凌晨7:06 #

        抱歉,可能我没解释清楚。

        在这篇文章中,您使用 CNN,获得了 90.78 的准确率
        在另一篇文章中,您使用了 LSTM 网络,但准确率较低(89.78)。

        我的问题是

        1. 在训练模型之前,仅考虑网络类型和数据集类型,是否可以从理论上预测到 CNN 的结果会更好?

        2. 如果我们构建一个新的神经网络,同时使用 LSTM 层和 CNN 层,是否可能获得更好的结果?为什么?

        感谢您的关注。这些信息对我非常重要。

  21. Lilly 2019年10月30日晚上11:03 #

    非常感谢您的教程。

    请问我有一个问题。我是深度学习的新手。

    我能否进行此部分以进行交叉验证?我会随机打乱数据来进行此操作……可以吗?

    ——————————————-
    # 运行一个实验
    def run_experiment(repeats=10)
    # 加载数据
    trainX, trainy, testX, testy = load_dataset()
    # 重复实验
    scores = list()
    for r in range(repeats)
    score = evaluate_model(trainX, trainy, testX, testy)
    score = score * 100.0
    print(‘>#%d: %.3f’ % (r+1, score))
    scores.append(score)
    # 总结结果
    summarize_results(scores)

    # run the experiment
    run_experiment()
    ———————————

    • Jason Brownlee 2019年10月31日凌晨5:31 #

      我们通常不能对序列预测使用交叉验证。取而代之的是我们使用前向验证。

  22. ahmad 2019年11月30日凌晨4:54 #

    非常感谢您的教程。
    我想根据 CSV 文件数据集,使用像上面模型一样的 1D CNN,来构建一个评估乳腺癌生存率(二元分类)的预测模型,input_shape 是多少?
    已知 dataset.shape = (237124, 37)

  23. ahmad 2019年11月30日凌晨9:07 #

    抱歉,可能我没解释清楚。

    我有一个 CSV 格式的表格数据集。如何使用 LSTM 和 CNN 或(任何其他深度学习技术)进行客户流失预测,以比较准确率、特异性、灵敏度……我已经使用了 MLP。

    MLP 是深度学习技术还是机器学习技术?
    因为概念对我来说很混乱。

    MLP 和 DNN 技术是相同的吗?

    感谢您的理解与合作。

  24. chandra sekhar 2019年12月31日晚上8:44 #

    嗨,Jason,

    我有一些代表用户签名的列向量。对于每个用户,我有 60 个样本。拥有 60 个样本后,我生成了一维向量并绘制了它们。我附上了输出。红色是真实的,蓝色是 GAN 生成的。现在,对于每个用户只有 60 个样本,是否有可能从 GAN 生成高质量图像或一维向量?

    https://drive.google.com/file/d/1aJE_ugzhJcfayJwOGNYu5uGofV2jPAZ6/view?usp=sharing

  25. Geo 2020年1月10日凌晨12:56 #

    你好 Jason,

    感谢您的教程。

    代替 to_categorical() for y_train,我们能否在此使用 Embedding 层,例如
    Flatten()(Embedding(n_classes, n_features)(y))?

    第二个问题,
    我们可以使用 multiply 而不是 concatenate 吗?为什么选择一个而不是另一个?

    • Jason Brownlee 2020年1月10日凌晨7:28 #

      我没有试过,不太清楚您到底想实现什么。

      Concatenation 提供更多上下文,您可以尝试相乘并比较结果。

  26. Muthiah 2020年2月18日晚上10:14 #

    我有一个 numpy 数组,形状为 (9339,16384)

    如何为该输入大小提供卷积 1d 层

    这是图像

  27. Tanunchai 2020年2月22日凌晨6:46 #

    我通过 Jupyter notebook python3.6 编译后,从您的代码(案例:141 行)中获得了准确的结果以及 p 值和参数的错误。

    如何纠正?

    _________

    7352, 128, 9) (7352, 1)
    (2947, 128, 9) (2947, 1)
    (7352, 128, 9) (7352, 6) (2947, 128, 9) (2947, 6)

    —————————————————————————
    TypeError Traceback (most recent call last)
    in ()
    139 # 运行实验
    140 n_params = [False, True]
    –> 141 run_experiment(n_params)

    在 run_experiment(params, repeats) 中
    129 scores = list()
    130 for r in range(repeats)
    –> 131 score = evaluate_model(trainX, trainy, testX, testy, p)
    132 score = score * 100.0
    133 print(‘>p=%s #%d: %.3f’ % (p, r+1, score))

    在 evaluate_model(trainX, trainy, testX, testy, param) 中
    100 model.add(Flatten())
    101 model.add(Dense(100, activation=’relu’))
    –> 102 model.add(Dense(n_outputs, activation=’softmax’))
    103 model.compile(loss=’categorical_crossentropy’, optimizer=’adam’, metrics=[‘accuracy’])
    104 # fit network

    c:\users\tanunchai.j\appdata\local\programs\python\python36\lib\site-packages\keras\engine\sequential.py in add(self, layer)
    179 self.inputs = network.get_source_inputs(self.outputs[0])
    180 elif self.outputs
    –> 181 output_tensor = layer(self.outputs[0])
    182 if isinstance(output_tensor, list)
    183 raise TypeError(‘All layers in a Sequential model ‘

    c:\users\tanunchai.j\appdata\local\programs\python\python36\lib\site-packages\keras\engine\base_layer.py in __call__(self, inputs, **kwargs)
    455 # Actually call the layer,
    456 # collecting output(s), mask(s), and shape(s).
    –> 457 output = self.call(inputs, **kwargs)
    458 output_mask = self.compute_mask(inputs, previous_mask)
    459

    c:\users\tanunchai.j\appdata\local\programs\python\python36\lib\site-packages\keras\layers\core.py in call(self, inputs)
    881 output = K.bias_add(output, self.bias, data_format=’channels_last’)
    882 if self.activation is not None
    –> 883 output = self.activation(output)
    884 return output
    885

    c:\users\tanunchai.j\appdata\local\programs\python\python36\lib\site-packages\keras\activations.py in softmax(x, axis)
    29 raise ValueError(‘Cannot apply softmax to a tensor that is 1D’)
    30 elif ndim == 2
    —> 31 return K.softmax(x)
    32 elif ndim > 2
    33 e = K.exp(x – K.max(x, axis=axis, keepdims=True))

    c:\users\tanunchai.j\appdata\local\programs\python\python36\lib\site-packages\keras\backend\tensorflow_backend.py in softmax(x, axis)
    3229 A tensor.
    3230 “””
    -> 3231 return tf.nn.softmax(x, axis=axis)
    3232
    3233

    TypeError: softmax() got an unexpected keyword argument ‘axis’

  28. tanunchai 2020年2月22日凌晨8:09 #

    之前的消息有错误是因为我使用了 keras 版本 2.2.4,它与您程序中的 softmax() 函数不兼容。
    然后我将 keras 版本从 2.2.4 改为 2.1.3,并卸载了 keras 2.2.4。

    然后它在 keras 版本 2.1.3 下与您程序中的 softmax() 很好地工作。

    Tanunchai

  29. tanunchai 2020年2月22日凌晨8:10 #

    这是从 Keras 版本 2.1.4 获得的结果(但版本 2.2.4 对 softmax() 函数有错误)。

    (7352, 128, 9) (7352, 1)
    (2947, 128, 9) (2947, 1)
    (7352, 128, 9) (7352, 6) (2947, 128, 9) (2947, 6)
    >p=False #1: 88.599
    >p=False #2: 88.293
    >p=False #3: 90.770
    >p=False #4: 87.784
    >p=False #5: 91.686
    >p=False #6: 89.820
    >p=False #7: 92.501
    >p=False #8: 89.990
    >p=False #9: 87.309
    >p=False #10: 91.585
    >p=True #1: 91.144
    >p=True #2: 88.836
    >p=True #3: 91.619
    >p=True #4: 91.449
    >p=True #5: 93.146
    >p=True #6: 92.026
    >p=True #7: 91.822
    >p=True #8: 88.734
    >p=True #9: 92.128
    >p=True #10: 92.162
    [[88.59857482185272, 88.29317950458093, 90.77027485578554, 87.78418730912793, 91.68646080760095, 89.82015609093995, 92.50084832032576, 89.98982015609094, 87.30912792670512, 91.58466236851035], [91.14353579911774, 88.83610451306413, 91.61859518154056, 91.44893111638956, 93.14557176789955, 92.02578893790296, 91.82219205972176, 88.73430607397353, 92.12758737699356, 92.16152019002375]] [False, True]
    Param=False: 89.834% (+/-1.703)
    Param=True: 91.306% (+/-1.358)

  30. akshay 2020年3月2日晚上6:12 #

    如果 model.fit 的维度是 (7352, 128, 9) 个样本和 (7352, 6) 个类别,而 model.evaluate 的维度是 (7352, 128, 5) 个样本,具有相同的类别,会怎么样?

    • Jason Brownlee 2020年3月3日凌晨5:57 #

      输入数据在训练和推理时必须具有相同的形状。

  31. Soumya 2020年3月30日下午2:10 #

    你好,
    您能否告诉我如何加载数据,因为 zip 文件不包含任何 csv 文件!
    谢谢!

    • Jason Brownlee 2020年3月31日凌晨7:53 #

      上面的教程准确地展示了如何加载数据集。

  32. aggelos 2020年4月6日晚上8:09 #

    嗨,Jason,

    我想问一个关于 2d cnn 的问题。

    我看到在实现中会添加更多维度。

    假设在这个初始层 model.add(Conv2D(128, (2, 2), activation = ‘relu’, input_shape = X_train[0].shape))

    初始 X_train[0].shape 是 200, 6,它们重塑以添加一个额外的维度。

    X_train = X_train.reshape(7062, 200, 6, 1)
    X_test = X_test.reshape(1766, 200, 6, 1)

    额外的维度有什么作用?

    2d cnn 是否需要 3d 输入?

  33. Joel 2020年4月8日晚上7:48 #

    嗨,Jason,

    您是否有关于如何实现这种 1D CNN 的自动编码器形式的示例?

  34. ila 2020年4月12日凌晨4:31 #

    嗨 Jason,在您的 Multi-Headed CNN 示例中,我如何使用 model.fit_generator 而不是 model.fit?

    我收到此错误:ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 3 array(s), but instead got the following list of 1 arrays

    在您的代码中,您有 model = Model(inputs=[inputs1, inputs2, inputs3], outputs=outputs)

    在我的代码中:model.fit_generator(generator=generator, epochs=epochs, steps_per_epoch=timesteps, workers=3, verbose=2)

    • Jason Brownlee 2020年4月12日凌晨6:25 #

      错误表明数据不符合您模型的预期。请更改模型或更改数据。

  35. Mohammad reza 2020年4月23日晚上6:48 #

    嗨,jason
    非常感谢您提出这个问题。
    我有一个问题。这段代码是否仅适用于人类活动?我在土木工程中遇到了加速度时间序列的问题。这段代码有帮助吗?

  36. bhumi 2020年4月25日上午4:14 #

    如何解决CNN的主要缺点,即处理有限的上下文长度、时间序列数据的计算效率低下、有效处理时间拉伸等问题,该模型使用一维时间序列传感器数据进行训练?

    有限的上下文长度、时间拉伸真的是CNN在一维时间序列分类中的主要缺点吗?

    • Jason Brownlee 2020年4月25日上午7:02 #

      一维CNN很神奇,它有这些限制。

      • bhumi 2020年4月26日下午4:09 #

        Jason你好,感谢你的快速回复。
        我们如何确保训练好的CNN模型没有有限的上下文长度、时间拉伸?因为我觉得如果使用一维CNN模型进行分类,那么它不会受到有限的上下文长度和时间拉伸的影响。我可能错了,你能帮我理解一下一维CNN的有限上下文长度和时间拉伸吗?这将非常有帮助。

        谢谢

        • Jason Brownlee 2020年4月27日上午5:30 #

          Keras的CNN实现需要固定长度。

          为了克服这个问题,您可能需要编写自定义代码。我没有例子,抱歉。

          • bhumi 2020年4月28日上午2:54 #

            Jason你好,感谢你的回复。
            你能否就我可以遵循的策略提供一些见解,以便我克服有限的上下文长度问题。如果你有一些好的材料可以帮助理解CNN的有限上下文长度和时间拉伸,那就太好了。
            谢谢

          • Jason Brownlee 2020年4月28日上午6:50 #

            您可以使用动态RNN,它不需要固定长度的输入。也许您可以将动态RNN改编为动态一维CNN……我没有这样做。

  37. kim 2020年4月26日下午4:31 #

    你知道如何在CNN中提取变量的重要性吗?

  38. kosara 2020年5月21日上午7:16 #

    您好。感谢您的教程。
    在这个数据集中,是否可以根据每个单独的活动来计算准确率?
    例如,CNN模型对步行准确率为90%,对站立准确率为89%。
    是否可以使用您教授的相同数据和代码来实现这一点?

    • Jason Brownlee 2020年5月21日下午1:36 #

      是的。您可以计算预测的混淆矩阵,然后计算每个类的准确率。

      • kosara 2020年5月21日下午2:47 #

        感谢您的宝贵建议。
        你能给我建议一下如何做到这一点吗?

        • Jason Brownlee 2020年5月22日上午6:02 #

          是的,我将准备一个关于这个主题的教程。

          在此之前,这可能有助于您入门
          https://machinelearning.org.cn/confusion-matrix-machine-learning/

          • John 2021年10月1日上午9:42 #

            嗨,Jason,

            我只是好奇这个是否已经出来了。我知道混淆矩阵需要预测分数和期望分数,那么在这种情况下,我们如何知道期望分数是什么?

          • Adrian Tam
            Adrian Tam 2021年10月1日下午12:46 #

            您的训练数据应该包含计算这些期望分数所需的所有信息。

  39. ahmad 2020年6月9日上午7:07 #

    感谢您的本教程!

    我们用(MaxPooling1D(pool_size=2))是什么意思?卷积层会发生什么?

    kernel_size=1 吗?

  40. reyner 2020年7月17日凌晨12:49 #

    Jason你好,感谢你的教程。

    我有一个自己的数据集,其中包含64个时间序列文件。1个文件包含12个特征和约200个时间步长,因此1个文件包含约200行数据,每行有12个元素。这64个文件分为4个不同的组并有标签。您会建议我如何将数据集拟合到一维CNN?我如何根据您的教程进行修改以适应我的数据集?

  41. reyner 2020年7月19日上午7:33 #

    Jason你好,再次感谢您准备机器学习问题库,但我仍然不确定在将CNN一维拟合到数据时,train_y和test_y数据的维度应该是什么样的。我尝试检查zip文件夹中的y文件,但它们包含乱码,并且我尝试拟合2d train_y和test_y文件(只有一个列),但均未成功。您对此有什么建议吗?????

  42. Jeremy 2020年7月23日上午7:20 #

    布朗利博士,您好,

    我遇到了一个与我的EMG数据中用于分类手势的类似一维CNN的问题。

    在处理完我的数据以使其达到正确的形状后,我遵循了您的示例,创建了一个适用于我的特定模型的数组列表。然后我遵循了您关于基本模型架构的教程,使用了我自己的输入形状(863个时间步长,8个EMG通道),并尝试编译和运行模型。在编译期间我遇到了一个错误,它说模型需要三维输入,而不是二维输入。

    当我在TF文档中查找时,我发现它需要一个批次大小。这就是事情变得有点奇怪的地方。在输入层和优化器中输入批次大小后,我遇到了一个单独的错误,它说我输入的维度太多了。它返回了输入形状,看起来是这样的
    [None, 10, 863, 8],而我在代码中的输入形状中输入的是[10, 863, 8]。

    您对如何纠正这个错误有什么见解吗?如果您认为这有帮助,我很乐意向您发送更多关于我的代码的信息。

    • Jason Brownlee 2020年7月23日下午2:38 #

      这很令人惊讶,因为一维CNN需要三维输入,而不是四维输入。也许您使用的是不同的模型或API。

  43. MariosGavaletakis 2020年8月23日上午7:14 #

    您好。教程非常棒。
    我有一个问题

    我们的trainX可以是三维ndarray(128, 9, 7352)而不是(7352, 128, 9)吗?
    您说过“模型需要三维输入,其中[样本,时间步长,特征]”。

    这是标准的吗?如果是,为什么?

    我运行了一个类似的项目,并且我遇到了ValueError:层Sequential的输入0与该层不兼容::需要min_ndim=3,找到ndim=2。接收到的完整形状是:[None, 3]。

  44. Nabil 2020年8月23日下午2:13 #

    Jason你好,感谢如此棒的教程。但我这里有些困惑。
    1.使用1个输入与3个输入(像您一样)有什么区别?

    我的意思是

    inputs = Input(shape=(n_timesteps,n_features))
    # layer 1
    conv1 = Conv1D(filters=64, kernel_size=3, activation=’relu’)(inputs)
    # layer 2
    conv2 = Conv1D(filters=64, kernel_size=5, activation=’relu’)(inputs)
    # layer 3
    conv3 = Conv1D(filters=64, kernel_size=11, activation=’relu’)(inputs)

    2.并且基本上,您在这里构建的是MNN(多层神经网络),对吗?
    3.使用具有1个sigmoid输出与10个softmax输出(抱歉我不知道如何说)有什么区别?我的意思是,有什么区别
    输出10,softmax,categorical_crossentropy
    vs
    输出1,sigmoid,binary_crossentropy
    我知道我们处理的是多类问题,但是否可以只提供1个输出?

    • Jason Brownlee 2020年8月24日上午6:17 #

      不客气。

      3输入模型允许以不同的分辨率考虑输入序列。这是否有所帮助取决于您数据集的复杂性。

      所有模型都是多层的。这是一个多输入模型。

      当存在两个以上的类别需要预测时,需要softmax输出。您可以为两个类的问题提供一个输出。您还可以使用argmax将多类输出解释为单个整数类标签
      https://machinelearning.org.cn/argmax-in-machine-learning/

      • Nabil 2020年8月24日下午2:08 #

        还是不明白。在卷积之前使用WordEmbedding时,我该怎么办?我需要3个输入还是1个输入?

        # layer 1
        inputs1 = Input(shape=(n_timesteps,n_features))
        embedding = layers.Embedding(vocab_size, embedding_dim, input_length=maxlen)(inputs1)
        conv1 = Conv1D(filters=64, kernel_size=3, activation=’relu’)(embedding)
        # layer 2
        inputs2 = Input(shape=(n_timesteps,n_features))
        embedding = layers.Embedding(vocab_size, embedding_dim, input_length=maxlen)(inputs2)
        conv2 = Conv1D(filters=64, kernel_size=5, activation=’relu’)(embedding)
        # layer 3
        inputs3 = Input(shape=(n_timesteps,n_features))
        embedding = layers.Embedding(vocab_size, embedding_dim, input_length=maxlen)(inputs3)
        conv3 = Conv1D(filters=64, kernel_size=11, activation=’relu’)(embedding)

        抱歉,我的意思是多通道神经网络。因为我最近有点混淆多通道神经网络(MNN)和多层神经网络(MNN)。您能给我一些直观的理解吗?或者来自您的文章?

        好的,我现在的问题是,我是否可以为两个以上的类别问题提供1个输出?我的意思是,为什么不只提供1个输出,这样我们就无需使用np.argmax了?

  45. David 2020年9月11日晚上10:04 #

    感谢您提供的精彩教程。
    我来自一家制造厂的数据,为期10秒,采样间隔为10毫秒。数据有5个信号作为输入,1个信号作为输出。

    如何开发一个模型来预测输出信号的时间行为?我能采取类似的方法吗?我需要输出作为一个时间向量。

    我已经为相同数据开发了逐点模型,但如何开发向量化输出模型?
    请推荐一些方法。

  46. marios gavaletakis 2020年9月28日凌晨12:05 #

    教程很棒且有帮助。
    我使用了您的CNN模型架构,但是我的验证损失图看起来不符合我的预期。

    我注意到(从model.summary())我的总参数为3,249,676(太多了吗?)。这有问题吗?

    • Jason Brownlee 2020年9月28日上午6:18 #

      也许可以尝试添加一些正则化,或者尝试其他模型架构并比较结果。

  47. Amhed 2020年10月20日下午1:18 #

    嗨,Jason,

    感谢这个很棒的教程!

    我有多变量时间序列数据,来自19个传感器(每个传感器作为一个特征)。我想执行二元分类。我正在考虑使用一维卷积和LSTM,如下所示

    model = Sequential()
    model.add(
    TimeDistributed(Conv1D(filters=32, kernel_size=2, activation=’relu’,padding=’same’)
    , input_shape=(None,timesteps,n_features)))
    model.add(TimeDistributed(Conv1D(filters=64, kernel_size=2, activation=’relu’)))
    model.add(TimeDistributed(MaxPooling1D(pool_size=2)))
    model.add(TimeDistributed(Flatten()))
    model.add(Dropout(0.2))
    model.add(LSTM(64,activation=’relu’,return_sequences=True))
    model.add(LSTM(64,activation=’relu’))
    model.add(Dense(1, activation=’sigmoid’))

    如果可能的话,我只有两个问题
    1)一起使用这些模型(Conv1D和LSTM)是否可以(从理论上讲)?
    2)我还在研究它,但还没有取得好结果。我是否可能在代码中遗漏了什么?我的意思是它看起来可以吗,还是我遗漏了什么需要添加或删除的?

    非常感谢!

  48. Lee 2020年12月4日下午1:35 #

    嗨,Jason,

    感谢您提供的有用的教程!
    我将您的代码应用于模拟数据,该数据具有500个时间步长,1个特征和3个输出。我将n_features在评估函数中替换为1,并将数据直接放入实验函数中,如下所示,但收到错误消息,
    “ValueError: 层sequential_23的输入0与该层不兼容::需要min_ndim=3,找到ndim=2。接收到的完整形状是:[None, 500]。”如果您能帮助我找到问题所在,我将不胜感激。
    先谢谢您了。

    ###data ##
    np.random.seed(1234)

    #Group 1
    Group1=np.reshape(np.random.normal(0,1,50000),(100,500))

    #Group 2
    Group2=np.reshape(np.random.normal(100,1,50000),(100,500))

    #Group 3
    Group3=np.reshape(np.random.normal(200,1,50000),(100,500))

    sns.boxplot(data=[Group1,Group2,Group3])

    stacked_mean0=np.stack(Group1)
    stacked_mean100=np.stack(Group2)
    stacked_mean200=np.stack(Group3)

    labels = [0] * len(stacked_mean0)
    labels += [1] * len(stacked_mean100)
    labels += [2] * len(stacked_mean200)

    labels = np.array(labels)

    data=np.concatenate((stacked_mean0,stacked_mean100,stacked_mean200))

    np.random.seed(151)

    ## indexing
    training = np.random.choice(len(labels), round(0.7*len(labels)), replace=False)
    test= [i for i in range(len(labels)) if i not in training]

    training_labels = labels[training]
    train_data1 = data[training]

    test_labels=labels[test]
    test_data1=data[test]

    trainy = training_labels – 1
    testy = test_labels – 1
    # one hot encode y
    trainy2 = to_categorical(trainy)
    testy2 = to_categorical(testy)
    print(train_data1.shape, trainy2.shape, test_data1.shape, testy2.shape)
    # 运行一个实验
    def run_experiment(repeats=10)
    # 加载数据
    trainX, trainy, testX, testy = train_data1, trainy2, test_data1, testy2
    # 重复实验
    scores = list()
    for r in range(repeats)
    score = evaluate_model(trainX, trainy, testX, testy)
    score = score * 100.0
    print(‘>#%d: %.3f’ % (r+1, score))
    scores.append(score)
    # 总结结果
    summarize_results(scores)

    # run the experiment
    run_experiment()

  49. Elbohy, Abdallah 2020年12月9日晚上6:28 #

    你好,Jason教授
    我给您在另一个帖子中发了一个与主题相关的评论,但仅限于可视化,您告诉我X_train是训练集,为什么我们要使用inertial_Signals预处理数据来拟合模型?X_train的重要性是什么?

    • Jason Brownlee 2020年12月10日上午6:24 #

      我们在本教程中对原始数据进行模型拟合。X_train是训练数据集。

  50. Elbohy, Abdallah 2020年12月9日晚上6:48 #

    我明白了,惯性信号是原始数据,经过预处理并提供。它被分为2.56秒的窗口数据。对128个数据点进行特征工程以提取X_train。让我们参考一下问题,为什么在训练堆叠的惯性信号时没有使用X_train?

    • Jason Brownlee 2020年12月10日上午6:24 #

      X_train是从内部信号加载的。

      • Elbohy, Abdallah 2020年12月13日下午1:58 #

        但是有一个单独的X_train,有561个特征,而您没有将其用作训练。您只加载了具有128个数据点和9个特征的数据。

  51. Elbohy, Abdallah 2020年12月9日晚上6:54 #

    哪种特征9(惯性信号)或561(X_train)更清晰,更能支持模型区分不同活动的模式。抱歉我的问题很多,
    我们是否可以使用(7532,128, 561)作为训练集而不是(7532,128,9)?您为什么只使用9个特征?

    • Jason Brownlee 2020年12月10日上午6:25 #

      原始数据只有9个特征——您可以在文本编辑器中自行检查。

      • Elbohy, Abdallah 2020年12月13日下午2:01 #

        先生,我的问题是关于为什么不加载具有561个特征的数据?

        我说过,这些数据(561个特征)可能有助于模型的训练。

        • Jason Brownlee 2020年12月14日上午6:14 #

          我已尽力回答您的问题,但似乎进展不大。

          我认为我不是最适合帮助您的人,抱歉。

  52. Elbohy, Abdallah 2020年12月19日上午8:57 #

    Jason教授,我发现使用训练数据(7352,561,1)时,使用CONV1的验证准确率达到了99%,并且使用了Robust Scaler作为预处理。

  53. Steven 2021年1月13日上午10:42 #

    你好,Jason。
    一如既往,这是一篇非常好的文章。
    在图像分类方面,我发现第一个convLayer中的input_shape可以这样设置
    input_shape = (None, None,3))
    这意味着模型将能够对可变输入大小的图像进行分类。
    假设我想知道一对时间序列是1(first_label)还是0(second_label)。
    并且时间序列长度可以在5到50之间。
    在前面提到的input_shape =(None, None,3))中,“3”实际上是通道数。
    在这种情况下:a=[0, 1, 2, 3, 4],b=[2, 3, 4, 5, 6]。
    我的输入将是c=[a, b]。我的标签将是[0]。
    我的input_shape是:input_shape=(n_timesteps,n_features),实际上是input_shape=(2,5)。
    在这种情况下,n_timesteps是2,因为我有一对时间序列需要查看。n_features是5,因为每个都有5个元素。
    如何通过更改函数input_shape=(n_timesteps,n_features)或数据集来使其正常工作,以便模型能够从任何一对相同长度序列中进行训练?
    我的意思是,一个输入可以是c =[[1, 2, 3],[2, 3, 4]。d =[[1, 2, 3, 4],[1, 2, 3, 4]]等等。
    提前感谢!可变输入尺寸总是有趣的,即使某些层可能不兼容(例如Dense或Flatten)

  54. Mohammad 2021年1月27日上午2:42 #

    嗨,Jason,

    由于时间步长= 128,特征= 9,输入大小为[样本,时间步长,特征]
    这意味着每个输入样本由9个通道组成,每个通道有128个长度吗?
    换句话说,输入样本是一个128行9列的矩阵,还是9个向量(即通道)每个通道有128行?

    两种情况下的区别在于滤波器大小;它是向量还是矩阵。

    谢谢

  55. Lara 2021年2月11日 上午10:14 #

    你好,谢谢你的教程。

    我仍然有疑问

    在用于时间序列二元分类的Conv1d中,如何/在哪里可视化每个层提取的特征。我曾找到有关Conv2d的信息,但仍然没有关于Conv1d如何可视化特征的清晰描述。

    我阅读了你的教程,但仍然不清楚你在验证部分是否这样做了。

    谢谢

    • Jason Brownlee 2021年2月11日 下午1:15 #

      通常,不会可视化1D层的层。

      • Lara 2021年4月14日 上午11:22 #

        Jasson你好。我能问一下为什么不能吗?
        例如,如果我处理的是时间序列输入,并且我想观察模型提取了哪些特征,可以吗?这合理吗?

        • Jason Brownlee 2021年4月15日 上午5:20 #

          你可以这样做,我建议你这样做——作为一项实验。

          我的想法是,与图像不同,滤波器或滤波器生成的输出的任何图都难以解释。

          • Luca 2022年8月3日 下午10:32 #

            Jason你好。感谢你所有的文章。我和Lara一样,也在寻找一种可视化卷积结果的方法,所以偶然看到了这里。

            和Lara一样,我认为可视化会有帮助。

            例如,我正在分析一些序列,我已知序列的平滑版本可以增强预测结果(我正在进行预测,而不是分类)。然后,为了我个人理解,我正在尝试Conv1d滤波器是否会提取序列的任何平滑版本。

            我还想看看Conv1d滤波器是否会提取序列的差异版本。
            所有这些都应该很容易通过视觉来解释。

            我还在学习,我不是专家,所以也许我的期望不对。

            你对这些问题的看法将非常有见地。
            谢谢!

          • James Carmichael 2022年8月4日 上午6:48 #

            Luca,你提供了出色的反馈!我们非常感谢你的支持!

  56. Saketh 2021年2月11日 下午12:13 #

    train_X(5993,250,6) 对应 train_Y(5993,250,12),其中5993是窗口数量,250是我的窗口大小,6是我的输入特征,12是one-hot编码的输出。

    我如何将此作为输入形状提供给我的ConvLSTM2D模型,因为它在形状兼容性方面会产生错误。

    model.build(input_shape=(None,5,50,1,6))
    model.fit(train_X,train_Y ,epochs=epochs, batch_size=batch_size)

    • Jason Brownlee 2021年2月11日 下午1:16 #

      我相信ConvLSTM2D的输入形状是4D的,也许你可以以上面的例子为起点?

  57. Vivek 2021年3月1日 下午1:42 #

    你好 Jason,

    一如既往,感谢您提供的精彩帖子。

    我有一个关于Conv1D层输出的问题。在多头1D CNN中,在图像(多头1D卷积神经网络图)中。输入是9个特征,每个特征有128个时间步长。这里每个时间序列(每个特征)沿着时间轴被64个不同的滤波器核卷积。但1D CNN的输出是126,64,我理解128个时间步长在1D卷积后减少到126,64是指特征图的数量。但这对应于1个特征(或1个时间序列)的输出,其余8个特征的输出在哪里?

    提前感谢

    • Jason Brownlee 2021年3月1日 下午1:47 #

      不客气!

      好问题,初步看来——我认为这些特征被整合成了单一的特征图。

      • Vivek 2021年3月1日 下午3:08 #

        谢谢。我再查一下并确认。

        我还有一些问题(也许这些问题是为上传数据的UCL人员准备的。但如果你有答案,那就太好了)
        1.重叠128个样本窗口的原理是什么?我猜是因为时间序列的性质是周期性的,如果我们取一个窗口,就足以找到时间序列的特征。我们不需要一次性看整个时间序列。
        2.如何决定窗口大小?我假设是基于数据的最大频率,
        假设25Hz是最大频率(我们假设数据中没有噪声)。这意味着在25个样本后,最大频率分量会重复出现。所以如果我们取128个样本,我们就在安全区,即我们覆盖了所有频率的主要周期。幸运的是,我们需要窗口化(最大400个样本/窗口,我猜)时间序列来用于1D CNN/LSTM网络。

        请告诉我你的想法。

        提前感谢。

        • Jason Brownlee 2021年3月2日 上午5:40 #

          重叠窗口可能有助于模型检测窗口边缘的模式。

          根据系统实验结果确定窗口大小或历史长度。

      • Vivek 2021年3月7日 上午4:54 #

        我刚刚找到了我之前问题的答案。特征被合并为单个特征。基本上它们被加在一起。

  58. David 2021年3月3日 上午9:39 #

    一如既往,做得很好。
    尽管如此,我还是有个问题。我正在处理一个分类问题,其中我有一个3D多变量输入向量和一个2D单变量输出向量。我不理解这些层的 [功能](https://tensorflowcn.cn/guide/keras/functional_api)
    – Dropout.
    – Max Pooling.
    – Flatern.
    – Dense.
    我不知道你是否能解释为什么这些层在这个模型中是必需的,或者你是否能指明一个解释的方向。
    提前感谢。

    • Jason Brownlee 2021年3月3日 下午1:55 #

      谢谢。

      在实践中它效果很好,但可以尝试不同的组合,看看哪种最适合你的特定数据集。

  59. ali 2021年3月16日 下午1:02 #

    嗨,Jason,
    一如既往,很棒的教程。

    我有一个关于Conv1d层中input_shape的问题。我正在处理一个包含3000个样本的数据集,每个样本大约有6300个特征。事实上,6300个特征是从每个.wav文件中提取的。

    我想将数据馈送到Conv1d层。将数据重塑为(3000, 1, 6300)并设置input_shape为(1, 6300)是否合理?因为正如你所说,input_shape必须是(n_timesteps, n_features),在这种情况下只有一个时间步长或序列。事实上,样本不是特征的序列。

    那么input_shape哪个是正确的?(1, n_features)还是(n_features, 1)?

    非常感谢!

  60. Wei 2021年3月20日 上午5:34 #

    嗨,Jason,

    关于多头模型。

    如果我有一个时间线,我需要检测短时向下脉冲,那么对于内核大小为3的路线,使用min pooling而不是max pooling是否有用?

    在卷积层之后使用dropout层是否常见?我一直认为dropout只应该在全连接/线性层之后使用。

    提前感谢

    • Jason Brownlee 2021年3月21日 上午5:59 #

      也许可以试试。

      是的,在卷积层之后使用dropout是常见的。

  61. fran 2021年5月5日 下午10:58 #

    你如何推断出2.65秒的数据中有128个时间步长?

    • Jason Brownlee 2021年5月6日 上午5:46 #

      这不是推断。我认为我查看了数据本身并进行了计数。

  62. francesco 2021年5月5日 下午11:05 #

    早上好,

    你如何推断出重叠窗口的2.65秒数据等于128个时间步长?

    诚挚的问候,
    F.

  63. Sagar John Camoens 2021年5月16日 下午6:49 #

    相同的代码可以在Colab上运行吗?我刚接触这个领域,有一个项目要做这个。我希望你能有一个关于这个的视频。我尝试在Colab上下载数据集并对load函数进行测试,以加载body acc x的测试数据。它似乎没有成功,所以我很好奇相同的代码是否可以在Colab上不经修改地使用?

  64. khushboo 2021年5月17日 上午7:25 #

    我应该在哪里提供数据集的路径?你能具体说明一下位置吗?我无法做到。请尽快回复。

    • Jason Brownlee 2021年5月18日 上午6:09 #

      您必须将数据集放在Python文件所在的同一目录中,然后您就可以在上面的教程代码中运行它来加载数据集。

  65. vinay 2021年5月22日 下午7:26 #

    我怎样才能为CNN代码打印图表?你能告诉我吗?

  66. harsh 2021年5月27日 上午7:54 #

    如何为你的代码绘制验证曲线并打印混淆矩阵?

  67. harsh 2021年5月28日 下午12:19 #

    我如何显示测试数据集上的结果/检测性能?

    • Jason Brownlee 2021年5月29日 上午6:45 #

      在测试集上进行预测,并使用指标将预测与预期值进行比较。

  68. khushboo 2021年5月29日 上午9:44 #

    我们能将此代码用于其他数据集吗?

  69. khushboo 2021年5月30日 上午4:47 #

    您使用了什么公式来计算CNN模型的准确性?

    • Jason Brownlee 2021年5月30日 上午5:52 #

      准确性的计算只有一种方式:正确预测的总数 / 进行的总预测。

      • khushboo 2021年6月1日 下午6:46 #

        谢谢Jason,但我问的是您在算法中使用的预测公式。

  70. bonface 2021年6月7日 下午12:17 #

    请给我这个任务的算法伪代码,使用1D CNN。

  71. harsh 2021年6月7日 下午5:16 #

    如何打印你的代码的损失

  72. DrJin 2021年6月11日 下午10:31 #

    谢谢!我正在寻找这样的文章!
    我将要通过传感器序列数据来检测交通,所以首先我尝试了LSTM来识别时间序列特征,但效果不佳……所以我尝试了CNN-LSTM模型,但仍然效果不佳!最后,我从模型中删除了LSTM,然后它就有意义了!现在我非常困惑1D-Conv是如何做得好的,所以我在搜索原因,然后我发现了这篇文章。
    在人类活动识别领域,我认为序列数据在时间上没有意义,对吧?所以LSTM的效果不好,但CNN可以,因为CNN可以提取特征并挖掘模式。我的想法对吗?

    • Jason Brownlee 2021年6月12日 上午5:34 #

      在上述问题中,输入是一系列观测值,这非常适合LSTM或1D CNN。

  73. DrJIn 2021年6月12日 下午4:30 #

    那么,LSTM和1D-CNN在检测传感器数据方面有什么区别?根据我的直觉,1D CNN对时间的敏感度不如LSTM,后者处理递归网络。另外,我认为时间对于传感器数据检测问题不是很重要,因为它们不是预测模型。所以我认为1D-CNN更适合它们。
    如果我在这类问题中使用LSTM,我该如何处理?我的目标不是预测下一个序列,而是对序列进行分类。为了实现这一点,我必须添加一个softmax层,然后前一层应该找到每个序列的模式。然后它可以通过LSTM找到这些模式吗?为了找到这些模式,我在LSTM之前添加了1D-CNN,这被称为CNN-LSTM,但它的效果更差。这个模型的 [问题](https://www.researchgate.net/post/Can-LSTM-and-CNN-be-combined-to-improve-prediction-of-time-series-data) 在哪里?

    • Jason Brownlee 2021年6月13日 上午5:48 #

      内部操作非常不同。

      实践中,我建议评估每种方法,并使用最适合您特定数据集的方法,以及混合方法和一套不同的数据准备和模型配置。

  74. bonface 2021年6月13日 下午3:41 #

    那么你能提供我这个任务使用1D CNN的算法吗?

  75. harsh 2021年6月16日 上午3:01 #

    我尝试用不同的数据集运行你的代码,但没有成功。请建议一些UCI HAR以外的数据集。并告知我是否需要进行任何特定的更改

    • Jason Brownlee 2021年6月16日 上午6:22 #

      您必须为任何其他数据集改编代码和模型。

  76. harsh 2021年6月19日 下午4:37 #

    您能告诉我您架构中所有层的尺寸(滤波器尺寸和所有细节)吗?

  77. John 2021年8月28日 下午9:11 #

    嗨,Jason,

    非常感谢你。这相当清楚。但是,我似乎在运行这段代码时遇到了麻烦,因为我对Python不太熟悉。我正在尝试用深度学习来理解人类活动识别,但无法模拟这段代码。你有没有一个分步运行这段代码的视频教程,包括需要输入到代码中的数据集标签?我在Google Colab上尝试运行它,其中一个我无法调试的错误是“group”未定义。我希望你能帮助解决这个问题。

    谢谢

    • Adrian Tam
      Adrian Tam 2021年8月28日 下午11:08 #

      没有,我们没有视频教程。“group”未定义错误意味着你使用了group作为变量,并在写入任何内容之前从中读取。

  78. Sarya 2021年9月5日 上午7:31 #

    非常感谢这个教程!我仍然对Conv1D所需的输入形状有点困惑。我想做一个二元分类与EEG数据,数据集的形状如下:500, 1250, 6(其中500是epoch数,1250是毫秒级的时间步长,6是额叶电极的数量)。然后,y/标签数据集的形状是500。将输入形状设置为(1250, 6)是否正确?

  79. Talha Wadood 2021年9月7日 上午12:11 #

    model.add(Dense(100, activation=’relu’))

    为什么我们总是使用100作为fc密集层的输出?

    • Adrian Tam
      Adrian Tam 2021年9月7日 上午6:14 #

      没有特别的原因。只是一个方便在示例中使用的数字。

  80. Jamie 2021年9月8日 下午12:57 #

    你好,我正在运行一个类似的1D卷积模型。我已经准备好了我的样本和特征来输入模型,即X_train,但我不太确定1D数据情况下的train_y和test_y数据是什么。你能详细说明一下你的例子吗?

    • Adrian Tam
      Adrian Tam 2021年9月9日 上午4:30 #

      你期望从网络输出什么?那就是你的“y”值。

  81. jamiea 2021年9月12日 下午2:03 #

    您能否分享一下您是如何推导出 y_train 和 test 的?很难弄清楚函数之间的路径。这仅仅是数据预先格式化的方式,然后将其引入代码,还是在代码中进行了格式化?

    • Adrian Tam
      Adrian Tam 2021年9月14日 下午1:27 #

      是的,它们是预先格式化的。

  82. RAKESH KIRAN 2021年10月1日 下午10:27 #

    非常感谢您的帖子,先生。
    我有一个疑问,通常 1D CNN 处理一维数据,在这里您将其用于二维数据,即 (时间步长, 特征数)。但这些维度为 64*1 的卷积核是如何对二维数据进行卷积的,是按列还是按行?

    请给我这个答案,我已经在很多地方搜索过这个概念,但一直无法理解。

    并且对于我的一个项目,我已经将其设置为一维数据,通过分离所有特征,所以输入模型的是 (时间步长, 1),那么我的疑问是,如果我将输入设置为 (1, 时间步长) 会不会改变结果?
    这就是我之前疑问的原因。

    谢谢你

    • Adrian Tam
      Adrian Tam 2021年10月6日 上午7:08 #

      对于一维数据,唯一可能的卷积是在时间轴上。因此,您更像是对前 n 个时间步进行平均。例如,如果您沿着特征轴进行卷积,您就没有做任何事情,就像卷积不存在一样。

  83. Rakesh Sahoo 2021年11月3日 上午1:10 #

    晚上好,先生。
                                 我已经浏览了 UCI HAR Dataset.zip,但无法识别 y_test.txt 和 y_train.txt,它们显示了一些符号,而 X_test.txt 和 X_train.txt 显示了一些值。我请求您提供一些关于 y_test.txt 和 y_train.txt 的详细信息。

    谢谢你。

  84. Jeremy Springston 2021年12月13日 上午3:55 #

    Brownlee 博士,

    早上好,先生,感谢您写这篇文章!我今天晚些时候会深入研究“深度学习时间序列”这本书,但希望能得到您的一个答案。我正在尝试为每个头增加更多的卷积/池化层。但是,我一直遇到 Keras 错误。这是一个样本。

    inputs1 = Input(shape=(n_timesteps,n_features))
    conv1 = Conv1D(filters=128, kernel_size=3, activation=’relu’)(inputs1)
    pool1 = MaxPooling1D(pool_size=2)(conv1)
    conv1a = Conv1D(filters=64, kernel_size=5, activation=’relu’)(pool1)
    pool1a = MaxPooling1D(pool_size=2)(conv1a)
    drop1a = Dropout(0.5)(pool1a)
    flat1 = Flatten()(drop1a)

    有什么明显的错误吗?我见过这种风格在 Sequential API 中使用,但我找不到 Functional API 的好例子。非常感谢您的时间和帮助,先生!

    • Jeremy Springston 2021年12月13日 上午10:17 #

      不用了,先生。我找到了问题所在。我尝试添加除准确率之外的另一个指标,Tensorflow 不满意。您关于如何使用 Functional API 的页面非常有帮助。感谢您发布所有这些很棒的东西!

    • Adrian Tam
      Adrian Tam 2021年12月15日 上午5:59 #

      您的错误是什么?

  85. Mark 2022年9月28日 上午12:58 #

    嗨,Jason,

    这个例子非常好。但是,您是否有更简单的例子来对仅二维信号(x=时间,y=值)进行时间序列分类?这样的例子可以很好地介绍这个例子。另外,我认为现实情况中有更多这样的问题。

    谢谢你

  86. Filip 2022年10月10日 下午10:01 #

    你好 Jason,

    很棒的文章和精彩的讨论。
    我有一个关于时间序列分类数据的前提条件的问题。
    是否有适合时间序列分类数据的先决条件摘要?

    另外,当传感器不在同一时间戳提供信号时,我们应该怎么做?
    例如
    时间戳#信号1_值#信号2_值#信号3_值
    ————————————————————————-
    时间戳1#值11#N/A#值31
    时间戳2#值12#值22#值32
    时间戳3#N/A#N/A#值33
    时间戳4#值13#值24#N/A

  87. Filip 2022年10月12日 下午6:29 #

    嗨 James,

    谢谢。我的问题与时间序列单变量多类分类有关。链接与图像分类有关。您能推荐一些其他资源吗?

    谢谢你

  88. Hasnat 2022年11月17日 上午8:25 #

    嗨 James,
    在 model.fit([train_X,train_X,train_X], train_y, epochs=50, batch_size=1024, verbose=1) 中如何处理验证数据?
    您能告诉我如何传递验证数据吗??
    谢谢你

  89. Hasnat 2022年11月17日 上午8:52 #

    好的,现在搞定了。我之前加载数据格式是错误的。

  90. Elia 2023年1月24日 下午8:20 #

    嗨 James

    感谢 CNN1D 和这些信息
    我问
    如果使用 optuna 或 pso 来自动调整 filter 或 kernal,您代码中的哪些部分需要更新?
    您能写出代码的更改部分吗???请

  91. Paromita Kundu 2023年11月12日 上午4:01 #

    有人能帮我理解时间步长的概念吗?我有来自 64 个样本的信号,需要将其分类为 4 个类别。每个信号记录 300 秒。之后,我将 300 秒的信号分成 10 秒的时间窗口。由于某些窗口包含噪声,我手动删除了它们。现在每个样本都有不同的时间窗口。那么我如何确定我的时间步长?如果我随机选择时间步长会成为问题吗?

  92. Quan Nguyen 2024年3月17日 上午6:29 #

    嗨 James。您的教程很棒。我能问您一个问题吗?
    我有一个包含 4 个文件的数据集,代表机器的 4 种故障,每个文件有 1000 个 CSV 文件,包含 3 个轴 x、y 和 z 的加速度计数据。CSV 文件是时间序列采样 1KHz,持续 1 秒。您认为我可以用这个 1D CNN 来处理这个数据集吗?我刚接触这个领域。期待您的尽快回复。
    非常感谢!

  93. Ali 2024年3月22日 上午7:00 #

    嗨 James,
    在 Google Colab 中,我收到了以下错误
    ModuleNotFoundError: No module named ‘keras.layers.convolutional’
    我该如何解决?

  94. Quan Nguyen 2024年4月29日 上午3:46 #

    嗨,又是我,来自 2024 年 3 月 17 日的帖子。我还有另一个问题,希望您能给我一些提示。我想知道是否有任何方法可以知道 CNN 网络需要使用多少层或什么超参数。我做了一些研究,他们都说我们必须尝试多种情况来找出数据集的最佳性能。您对此有何看法?期待您的尽快回复。
    非常感谢!

  95. ChaoticMind 2024年5月4日 上午6:38 #

    我正在处理一个包含 50 个特征的数据集。我的数据是按时间戳收集的。我将 10 行作为一个块输入我的 1DCNN 模型。所以我的输入大小是 (batch size, 50, 10)。我想在时间轴上进行卷积。所以我取一个大小为 3 的卷积核,并沿着我的时间(10 行)移动。所以结果将是 32×8。我的 50 到哪里去了?它被压缩成 32 个输出通道了吗?

    • James Carmichael 2024年5月5日 上午7:59 #

      嗨 ChaoticMind…在您的 1D 卷积神经网络 (1DCNN) 模型中,您的输入大小是 (batch_size, 50, 10),其中
      batch_size 是每批样本的数量。
      50 表示特征的数量。
      10 表示时间序列的长度。

      当您应用大小为 3 的 1D 卷积操作并沿着时间轴(在您的例子中长度为 10)移动时,您只沿着时间轴执行卷积。1D 卷积操作不直接涉及特征轴(长度为 50 的轴)。

      以下是发生的情况:

      1. **卷积操作:**
      – 大小为 3 的卷积核沿着时间轴(长度 10)移动,在每个步骤执行卷积。
      – 对于沿着时间轴的卷积核的每个位置,都在该位置的输入时间序列和卷积核权重之间计算点积。
      – 该点积产生一个单一值,该值成为输出特征图的一个元素。

      2. **输出特征图:**
      – 输出特征图的深度(通道数)由卷积过程中应用的滤波器或卷积核的数量决定。
      – 如果您应用 32 个滤波器,则输出特征图的深度为 32。
      – 由于卷积操作和任何填充/步长,特征图的空间维度将比输入有所减小。

      3. **对特征 (50) 的影响:**
      – 1D 卷积操作不直接压缩特征轴(长度为 50 的轴)。
      – 特征在沿着时间轴的卷积操作过程中被保留并独立处理。
      – 但是,在卷积过程中应用的学习到的滤波器(卷积核)可能会捕获特征和时间点之间的模式或关系。

      因此,回答您的问题,50 个特征并未压缩为 32 个输出通道。32 个输出通道代表了沿时间轴的卷积核提取的不同学习特征或模式。每个输出通道对应于沿着时间轴的每个位置上不同滤波器的激活。特征被保留,并且与沿时间轴的卷积操作分开。

留下回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。