python开发构建深度学习分类模型,探索AI在地震事件分类中的应用于可解释性分析

news2024/11/20 14:25:22

最近看到了一篇蛮有意思的论文,如下:

 将深度学习开发应用到了地震事件分析分类领域中去了,感觉挺有意思,就想着也来自己体验下看看,这里的数据集是网上找到的一个地震波应该是仿真实验的数据集,我们先来看下数据集的整体情况,代码实现如下所示:

data=np.load(filename)
print("type_data: ", type(data))


for one_key in data:
    print("one_key: ", one_key)


X_waveform = data['X_waveform']
label=data['y']

print("X_waveform_shape: ", X_waveform.shape)
print("label_shape: ", label.shape)

结果输出如下所示:

 可以看到:这是一个相当小的样本数据集了,包含了100个样本数据。

接下来开发构建一个简单基础的CNN模型来对其实现分类处理,核心代码实现如下所示:

data = np.load(filename)
X_waveform = data["X_waveform"]
label = data["y"]
x_train, y_train, x_test, y_test = dataSplit()
model = initModel()
history = model.fit(
    x_train,
    y_train,
    epochs=50,
    validation_split=0.2,
    batch_size=128,
    shuffle=True,
    callbacks=callbacks,
)
acc = history.history["acc"]
val_acc = history.history["val_acc"]
loss = history.history["loss"]
val_loss = history.history["val_loss"]
plt.subplot(1, 2, 1)
plt.plot(acc, label="Training Accuracy")
plt.plot(val_acc, label="Validation Accuracy")
plt.title("Training and Validation Accuracy")
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(loss, label="Training Loss")
plt.plot(val_loss, label="Validation Loss")
plt.title("Training and Validation Loss")
plt.legend()
plt.savefig("train1.png")

其中,模型搭建实现如下所示:

def initModel(
    input_shape,
    kernel_size,
    pooling_size,
    root_filters,
    clip_filters,
    dense_dropout,
    cnn_dropout,
    n_layers,
    activation,
    output_class,
    output_activation,
):
    inputs = Input(shape=input_shape)
    y = layers.Conv2D(
        filters=root_filters,
        kernel_size=kernel_size,
        activation=activation,
        padding="same",
    )(inputs)
    y = layers.MaxPooling2D(pooling_size)(y)
    n_kernels = root_filters
    for i in range(n_layers):
        if clip_filters:
            if n_kernels > clip_filters:
                n_kernels = clip_filters
            else:
                n_kernels *= 2
        else:
            n_kernels *= 2
        y = layers.Conv2D(
            filters=n_kernels,
            kernel_size=kernel_size,
            padding="same",
            activation=activation,
        )(y)
        y = layers.Dropout(cnn_dropout)(y)
        y = layers.MaxPooling2D(pooling_size)(y)
    y = layers.Flatten()(y)
    y = layers.Dropout(dense_dropout)(y)
    y = layers.Dense(100, activation=activation)(y)
    outputs = layers.Dense(output_class, activation=output_activation)(y)
    baseline_model = models.Model(inputs=inputs, outputs=outputs)
    baseline_model.summary()
    baseline_model.compile(
        optimizer=keras.optimizers.Adam(learning_rate=1e-3),
        loss=tf.keras.losses.SparseCategoricalCrossentropy(),
        metrics=["acc"],
    )
    return baseline_model

训练可视化如下所示:

 这里仅仅训练了30个epoch,接下来我们训练100次epoch看下效果:

 因为数据有限,后面再继续训练也没有效果的提升了。

GradCAM(Gradient-weighted Class Activation Mapping)是一种用于热力图可视化的技术,可以帮助理解卷积神经网络(CNN)在分类任务中的决策依据。下面是对GradCAM技术原理的详细介绍:

  1. 卷积神经网络(CNN): GradCAM技术应用于CNN,而CNN是一种常用于图像分类任务的深度学习模型。它由多个卷积层和池化层组成,最后连接全连接层进行分类。

  2. 特征图和类别激活图: 在CNN中,卷积层的输出被称为特征图(feature map)。每个特征图包含一系列特定的特征,对应于输入图像在不同位置和尺度上的特征表示。

    类别激活图(class activation map)是GradCAM要生成的热力图。它表示CNN对某个特定类别的重要性分布,即哪些区域对于该类别的分类起到了关键作用。

  3. 反向传播与梯度: Gradient-weighted Class Activation Mapping使用了反向传播过程中的梯度信息。在CNN中,误差反向传播算法通过计算误差函数对网络各参数的偏导数来更新参数值。这些偏导数也可以用于计算输入图像的梯度。

  4. GradCAM的步骤:

    • 前向传播:将输入图像通过CNN进行正向传播,生成特征图和最终的分类结果。
    • 反向传播:计算分类结果对于特征图的梯度。这个梯度表示了特征图对于最终分类的重要性。
    • 特征图的空间权重:将每个特征图的通道上的梯度进行空间上的加权求和,用于得到每个特征图的重要性分数。
    • 热力图生成:对于每个特征图,将其重要性分数与相应的特征图相乘,得到加权后的特征图。然后将所有加权后的特征图进行叠加,形成最终的热力图。
  5. 可视化效果: 生成的GradCAM热力图可以通过叠加到原始输入图像上进行可视化。在热力图中,更亮的区域表示对于特定类别分类的重要贡献更大。通过观察热力图,可以理解CNN模型在进行分类决策时关注的区域。

总结来说,GradCAM技术利用CNN中反向传播过程中的梯度信息,对特征图进行空间权重计算,然后生成热力图来显示卷积神经网络在分类任务中关注的区域。这种可视化技术有助于解释和理解CNN模型的决策过程,以及识别图像分类中重要的区域和特征。

接下来基于GradCAM想要实现数据热力图可视化分析,核心代码实现如下所示:

model = keras.models.load_model("best.h5")
y_pred = model.predict(X)
ix = np.array([i])
sampling_rate = 100
times = np.arange(2000) / sampling_rate
cam = GradCAM(model, 0)
heatmap_eq = cam.compute_heatmap(X[ix])
cam = GradCAM(model, 1)
heatmap_exp = cam.compute_heatmap(X[ix])
cam = GradCAM(model, 2)
heatmap_noise = cam.compute_heatmap(X[ix])
heatmap_exp /= np.max(heatmap_exp)
heatmap_eq /= np.max(heatmap_eq)
heatmap_noise /= np.max(heatmap_noise)
tr_data = X[ix][0, :, 0, 0]
y_true = y[ix][0]
fig, axes = plt.subplots(nrows=3, figsize=(12, 8))
axes[0].plot(times, tr_data, "grey")
ymin, ymax = axes[0].get_ylim()
sc = axes[0].scatter(
    times, tr_data, c=heatmap_exp, cmap=plt.cm.jet, zorder=10, s=5, alpha=0.8
)
axes[0].set_title(
    f"True:  {mapping[y_true]}, Estimate: EQ, with probability {y_pred[ix][0][0]:.2f}"
)
axes[0].set_xlim(0, 20)
axes[0].set_xticks([])
axes[1].plot(times, tr_data, "grey")
sc = axes[1].scatter(
    times, tr_data, c=heatmap_eq, cmap=plt.cm.jet, zorder=10, s=5, alpha=0.8
)
axes[1].set_title(
    f"True:  {mapping[y_true]}, Estimate: noise, with probability {y_pred[ix][0][1]:.2f}"
)
axes[1].set_xlim(0, 20)
axes[1].set_xticks([])
axes[2].plot(times, tr_data, "grey")
sc = axes[2].scatter(
    times, tr_data, c=heatmap_noise, cmap=plt.cm.jet, zorder=10, s=5, alpha=0.8
)
axes[2].set_title(
    f"True:  {mapping[y_true]}, Estimate: EXP, with probability {y_pred[ix][0][2]:.2f}"
)
axes[2].set_xlabel("Time (sec)")
axes[2].set_xlim(0, 20)
fig.colorbar(sc, ax=[axes[0], axes[1], axes[2]], label="Normalized Grad-CAM weights")
path = "GradCAM/" + b[i] + ".jpg"
plt.savefig(path)

接下来看下对应的效果图:

 整体来看还是不错的:跟论文中的整体呈现结果还是比较相像的。

 接下来我们进一步通过仿真实验生成了大批量的数据集,如下:

 共包含了主要的四个维度的特性数据。

这里针对模型开发层面我们一共设计开发了:lenet、alexnet、vgg、resnet、mobilenet和原论文模型等多种卷积神经网络模型。

时间关系这里就不多展开介绍了,我们直接看下结果:

 训练过程可视化如下:

这里同样借助于GradCAM算法实现了热力图的可视化展示,如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pytest教程__Hook函数pytest_addoption(parser):定义自己的命令行参数(14-1)

考虑场景: 我们的自动化用例需要支持在不同测试环境运行,有时候在dev环境运行,有时候在test环境运行;有时候需要根据某个参数不同的参数值,执行不同的业务逻辑; 上面的场景我们都可以通过“在命令行中输入…

浏览器之BFC

浏览器之BFC 什么是BFCBFC的特性特性1:BFC会阻止垂直外边距折叠①相邻兄弟元素margin重叠问题②父子元素margin重叠问题 特性2:BFC不会重叠浮动元素BFC可以包含浮动----清除浮动 什么是BFC Block formatting context直译为"块级格式化上下文Block …

Python进阶语法之字符串

Python进阶语法之字符串 当我们处理文本数据时,字符串是不可避免的数据类型。Python 提供了很多字符串方法,它们可以帮助我们更方便地操作和处理字符串。在本篇博客中,我们将深入探讨 Python 字符串。 字符串的基本操作 在深入了解字符串…

亚马逊云科技 | Summit - 中国峰会

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 亚马逊云科技 | Summit - 中国峰会 亚马逊云科技提供全球覆盖广泛、服务深入的云平台,全球数据中心提供超过 200 项功能齐全的服务连续 11 年被 Gartner 评…

【python】数据可视化,使用pandas.merge()对dataframe和geopandas类型数据进行数据对齐

目录 0.环境 1.适用场景 2.pandas.merge()函数详细介绍 3.名词解释“数据对齐”(来自chatGPT3.5) 4.本文将给出两种数据对齐的例子 1)dataframe类型数据和dataframe类型数据对齐(对齐NAME列); 数据对…

[游戏开发]Unity颜色矫正无障碍方案

[目录] 0. 前言1. 颜色矫正2. 线性变换Shader2. 颜色纠正参数3. 摄像机后处理4. 效果5. 结束咯 0. 前言 之前有在关注色盲视觉纠正问题,最近在调整游戏的时候就打算把这个用上。 色弱色盲,这其实算是一种误称吧,只是人类中的少数派&#xf…

保护您的数据与ManageEngine Log360

在当今数字时代,网络安全成为了企业和组织不可忽视的重要议题。随着信息技术的发展和互联网的普及,企业面临着越来越多的网络威胁和数据泄露的风险。为了保护重要的数据资产和防止潜在的攻击,日志管理和事件关联成为了至关重要的一环。 Mana…

IIS安装ARR(Application Request Router)负载均衡扩展

IIS7.5安装ARR(Application Request Router)负载均衡扩展 本文主要记录我在IIS中安装ARR的全流程,本文参考了网上一些教程,但可能时间关系,与一些早期文章所述有所出入。 花了我半天的时间才最终安装成功,因此这里做一个记录。本…

立体解析Fiddler Filters:让你快速捕获和过滤网络请求

如果要对当前Fiddler的抓包进行过滤(如过滤掉与测试项目无关的抓包请求),那功能强大的 Filters 过滤器能帮到你。 如果你想学习Fiddler抓包工具,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的Fiddler抓包…

动态规划算法(多状态dp1)

动态规划算法专辑之多状态dp问题(1) 一、什么是多状态 多状态dp问题,指一个规模问题下存在多种状态,我们需要联合关注多种状态间的相互转移,才可以求解目的问题。 多状态问题可以理解为有限状态机,在有限…

节省时间、提升效率——Jetpack关爱你的摸鱼时间

JetPack Jetpack 是一个由 Google 提供的 Android 应用开发库集合。它旨在简化 Android 应用程序开发过程,提供一系列的库和工具,帮助开发者快速构建高质量、健壮、可扩展的 Android 应用。 Jetpack 包含多个组件,每个组件都专注于不同的功…

Nginx 的reload,升级以及关闭流程

一、reload流程 1 向master进程发送HUP信号(reload命令) 2 master进程校验配置语法是否正确; 3 master打开可能引入的新的监听端口; 4 master用新的配置文件启动新的worker子进程; 5 启动新的worker子进程之后&#x…

小马赠书【第8期】清华社 618 IT BOOK 多得活动(送书5本)

本期 敬 之 共精心挑选了 15 本 IT 相关书籍,包含 前端、后端、数据分析、人工智能、python 等各个领域。关于如何参与等具体活动信息请看活动详情页,以下是 15 本 IT 书籍介绍: 活动详情页:小马赠书【第8期】 1. 《Linux设备驱动…

怎么入手性能测试,重点以及各项流程

之前在性能测试学习路线里,提到过《软件性能测试、分析与调优实践之路》这本书。 昨天看到之前自己记的读书笔记,整理一下发出来,希望对读者有所帮助。 网上关于性能测试的文章大多数时间比较久远,或者知识点比较散,…

南大一作!科学家发现全新量子态 | Nature速递

光子盒研究院 马萨诸塞大学助理教授Tigran Sedrakyan在内的一个物理学家团队最近在《自然》杂志上宣布,他们已经发现了一种新的物质阶段——“手性玻色液态(chiral Bose-liquid state)”,这一突破为理解物理世界本质的古老努力开辟了一条全新道路。 团队…

【目标跟踪】MOT数据集GroundTruth可视化

MOT数据集格式简介 MOT15数据集下载&#xff1a;https://pan.baidu.com/s/1foGrBXvsanW8BI4eybqfWg?pwd8888 以下为一行gt示例&#xff1a; 1,1,1367,393,73,225,1,-1,-1,-1 各列数据对应含义如下 <frame>,<id>,<bb_left>,<bb_top>,<bb_width&g…

autocut

在讲 OpenAI Whisper 前先做了一个剪视频小工具【论文精读44】_哔哩哔哩_bilibili更多论文&#xff1a;https://github.com/mli/paper-reading, 视频播放量 58633、弹幕量 233、点赞数 2732、投硬币枚数 1630、收藏人数 1465、转发人数 604, 视频作者 跟李沐学AI, 作者简介 &am…

什么是python,一篇带你详细了解Python

Python是一种跨平台的计算机程序设计语言&#xff0c;是ABC语言的替代品&#xff0c;属于面向对象的动态类型语言&#xff0c;最初被设计用于编写自动化脚本&#xff0c;随着版本的不断更新和语言新功能的添加&#xff0c;越来越多被用于独立的、大型项目的开发。 python前景…

挖掘用户真实需求 避坑5大技巧

1、用户总是“说一套 做一套” 在进行需求市场调研时&#xff0c;我们问1000个用户&#xff0c;是否想要黄金&#xff0c;几乎所有的用户都是肯定的回答。如果我们以此认定&#xff0c;黄金是用户的真实需求会过于草率。 我们需继续追问用户&#xff1a;买黄金做什么&#xff1…

【微信小程序开发】第 7 课 - 小程序的组件

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、小程序中组件的分类 3、常用的视图容器类组件 3.1、view 组件 3.2、scroll - view 组件 3.3、swiper 和 swiper…