深度学习 Day21——利用RNN实现心脏病预测

news2025/2/25 9:08:00

深度学习 Day21——利用RNN实现心脏病预测

文章目录

  • 深度学习 Day21——利用RNN实现心脏病预测
    • 一、前言
    • 二、我的环境
    • 三、什么是RNN
    • 四、前期工作
      • 1、设置GPU
      • 2、导入数据
      • 3、检查数据
    • 五、数据预处理
      • 1、划分数据集
      • 2、数据标准化
    • 六、构建RNN模型
    • 七、编译模型
    • 八、训练模型
    • 九、模型评估
    • 十、最后我想说

一、前言

🍨 本文为🔗365天深度学习训练营 中的学习记录博客

🍦 参考文章地址:🔗深度学习100例-循环神经网络(RNN)心脏病预测 | 第46天

🍖 作者:K同学啊

在这里插入图片描述

大概快两个星期没有更新这个专栏的续集了,实在是抱歉,最近发生了很多事,一直都没有时间来写,上周忙着复习期末考试,结果学校提前放假了,让我们尽快回家,然后就开始了漫长的回家之旅,路途艰苦,差点回不了家,还好经过两天的休息现在已经恢复的很好了,一刻也不能懈怠,调整过来了就要抓紧学习了。

好啦废话不多说,我们开始新的一轮学习吧,从本期博客开始,我们将从原来的CNN转变到RNN来,学习一个新的神经网络,流程都是类似的,我们主要来学习如何使用RNN来解决问题,本期博客我们就来使用RNN来实现心脏病的预测。

二、我的环境

  • 电脑系统:Windows 11
  • 语言环境:Python 3.8.5
  • 编译器:DataSpell 2022.2
  • 深度学习环境:TensorFlow 2.4.0
  • 显卡及显存:RTX 3070 8G

三、什么是RNN

在编程开始之前,我们首先来了解一下什么是RNN,循环神经网络( RNN ) 是一类人工神经网络,其中节点之间的连接可以创建一个循环,允许来自某些节点的输出影响对相同节点的后续输入。这允许它展示时间动态行为。源自前馈神经网络,RNN 可以使用其内部状态(记忆)来处理可变长度的输入序列。这使得它们适用于未分段的、连接的手写识别或语音识别等任务。

简单的RNN网络结构包括一个输入层、一个隐藏层和一个输出层:

在这里插入图片描述

如果我们将上面的图片按照时间线展开也可以画成这样:

在这里插入图片描述

四、前期工作

1、设置GPU

和之前一样,如果你GPU很好就只使用GPU进行训练,如果GPU不行就推荐使用CPU训练加GPU加速。

只使用GPU:

import tensorflow as tf

gpus = tf.config.list_physical_devices("GPU")

if gpus:
    gpu0 = gpus[0]                                        #如果有多个GPU,仅使用第0个GPU
    tf.config.experimental.set_memory_growth(gpu0, True)  #设置GPU显存用量按需使用
    tf.config.set_visible_devices([gpu0],"GPU")
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

使用CPU+GPU:

import tensorflow as tf
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"

2、导入数据

在导入数据之前我们来查看一下我们的CSV数据:

在这里插入图片描述

其中每个数据的标签含义为:

  • age:年龄
  • sex:性别
  • cp:胸痛类型 (4 values)
  • trestbps:静息血压
  • chol:血清胆甾醇 (mg/dl)
  • fbs:空腹血糖 > 120 mg/dl
  • restecg:静息心电图结果 (值 0,1 ,2)
  • thalach:达到的最大心率
  • exang:运动诱发的心绞痛
  • oldpeak:相对于静止状态,运动引起的ST段压低
  • slope:运动峰值 ST 段的斜率
  • ca:荧光透视着色的主要血管数量 (0-3)
  • thal:0 = 正常;1 = 固定缺陷;2 = 可逆转的缺陷
  • target:0 = 心脏病发作的几率较小 1 = 心脏病发作的几率更大

介绍完数据标签,我们将数据进行导入:

import pandas as pd
import numpy as np

df = pd.read_csv("E:\DL_data\Day21\heart.csv")
df

在这里插入图片描述

一共303行,4列数据。

3、检查数据

在进行数据预处理之前我们还需要对我们的数据进行检查,确保每一个标签内的数据没有空值:

df.isnull().sum()
age         0
sex         0
cp          0
trestbps    0
chol        0
fbs         0
restecg     0
thalach     0
exang       0
oldpeak     0
slope       0
ca          0
thal        0
target      0
dtype: int64

五、数据预处理

1、划分数据集

检查完数据之后,我们来对数据集进行划分,划分出训练集、验证集和测试集:

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

x = df.iloc[:,:-1]
y = df.iloc[:,-1]

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.1, random_state=1)
x_train.shape, y_train.shape
((272, 13), (272,))

2、数据标准化

# 将每一列特征标准化为标准正太分布,注意,标准化是针对每一列而言的
sc = StandardScaler()
x_train = sc.fit_transform(x_train)
x_test  = sc.transform(x_test)

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

这里我们用到了 StandardScaler函数,它的作用是去均值和方差归一化。且是针对每一个特征维度来做的,而不是针对样本。

六、构建RNN模型

这里我们构建模型要用到tf.keras.layers.SimpleRNN()函数,这个函数的模型如下:

tf.keras.layers.SimpleRNN(
    units,
    activation='tanh',
    use_bias=True,
    kernel_initializer='glorot_uniform',
    recurrent_initializer='orthogonal',
    bias_initializer='zeros',
    kernel_regularizer=None,
    recurrent_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    kernel_constraint=None,
    recurrent_constraint=None,
    bias_constraint=None,
    dropout=0.0,
    recurrent_dropout=0.0,
    return_sequences=False,
    return_state=False,
    go_backwards=False,
    stateful=False,
    unroll=False,
    **kwargs
)

这里对函数的参数介绍我就直接截图官网的解释:

在这里插入图片描述

介绍完函数模型,现在我们来构建模型:

import tensorflow
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,LSTM,SimpleRNN

model = Sequential()
model.add(SimpleRNN(128, input_shape= (13,1),return_sequences=True,activation='relu'))
model.add(SimpleRNN(64,return_sequences=True, activation='relu'))
model.add(SimpleRNN(32, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.summary()
Model: "sequential_11"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
simple_rnn_31 (SimpleRNN)    (None, 13, 128)           16640     
_________________________________________________________________
simple_rnn_32 (SimpleRNN)    (None, 13, 64)            12352     
_________________________________________________________________
simple_rnn_33 (SimpleRNN)    (None, 32)                3104      
_________________________________________________________________
dense_22 (Dense)             (None, 64)                2112      
_________________________________________________________________
dense_23 (Dense)             (None, 1)                 65        
=================================================================
Total params: 34,273
Trainable params: 34,273
Non-trainable params: 0
_________________________________________________________________

七、编译模型

opt = tf.keras.optimizers.Adam(learning_rate=1e-4)
model.compile(loss='binary_crossentropy', optimizer=opt,metrics=['accuracy'])

八、训练模型

epochs = 50

history = model.fit(x_train, y_train,
                    epochs=epochs,
                    batch_size=128,
                    validation_data=(x_test, y_test),
                    verbose=1)

训练的结果是:

Epoch 1/50
3/3 [==============================] - 0s 154ms/step - loss: 0.7026 - accuracy: 0.3272 - val_loss: 0.7091 - val_accuracy: 0.3548
Epoch 2/50
3/3 [==============================] - 0s 17ms/step - loss: 0.6947 - accuracy: 0.4485 - val_loss: 0.7001 - val_accuracy: 0.4839
Epoch 3/50
3/3 [==============================] - 0s 21ms/step - loss: 0.6884 - accuracy: 0.5772 - val_loss: 0.6914 - val_accuracy: 0.5806
Epoch 4/50
3/3 [==============================] - 0s 14ms/step - loss: 0.6831 - accuracy: 0.6691 - val_loss: 0.6834 - val_accuracy: 0.5806
Epoch 5/50
3/3 [==============================] - 0s 15ms/step - loss: 0.6779 - accuracy: 0.6801 - val_loss: 0.6759 - val_accuracy: 0.5806
Epoch 6/50
3/3 [==============================] - 0s 13ms/step - loss: 0.6729 - accuracy: 0.6765 - val_loss: 0.6692 - val_accuracy: 0.6129
Epoch 7/50
3/3 [==============================] - 0s 14ms/step - loss: 0.6677 - accuracy: 0.6912 - val_loss: 0.6627 - val_accuracy: 0.6129
Epoch 8/50
3/3 [==============================] - 0s 14ms/step - loss: 0.6623 - accuracy: 0.7022 - val_loss: 0.6558 - val_accuracy: 0.6129
Epoch 9/50
3/3 [==============================] - 0s 14ms/step - loss: 0.6568 - accuracy: 0.7132 - val_loss: 0.6492 - val_accuracy: 0.6774
Epoch 10/50
3/3 [==============================] - 0s 15ms/step - loss: 0.6511 - accuracy: 0.7169 - val_loss: 0.6418 - val_accuracy: 0.7419
Epoch 11/50
3/3 [==============================] - 0s 13ms/step - loss: 0.6450 - accuracy: 0.7390 - val_loss: 0.6342 - val_accuracy: 0.8065
Epoch 12/50
3/3 [==============================] - 0s 14ms/step - loss: 0.6386 - accuracy: 0.7463 - val_loss: 0.6260 - val_accuracy: 0.8065
Epoch 13/50
3/3 [==============================] - 0s 13ms/step - loss: 0.6325 - accuracy: 0.7463 - val_loss: 0.6170 - val_accuracy: 0.8065
Epoch 14/50
3/3 [==============================] - 0s 16ms/step - loss: 0.6261 - accuracy: 0.7463 - val_loss: 0.6083 - val_accuracy: 0.8065
Epoch 15/50
3/3 [==============================] - 0s 14ms/step - loss: 0.6192 - accuracy: 0.7574 - val_loss: 0.5989 - val_accuracy: 0.8065
Epoch 16/50
3/3 [==============================] - 0s 15ms/step - loss: 0.6122 - accuracy: 0.7684 - val_loss: 0.5888 - val_accuracy: 0.8387
Epoch 17/50
3/3 [==============================] - 0s 14ms/step - loss: 0.6046 - accuracy: 0.7610 - val_loss: 0.5781 - val_accuracy: 0.8387
Epoch 18/50
3/3 [==============================] - 0s 14ms/step - loss: 0.5967 - accuracy: 0.7684 - val_loss: 0.5666 - val_accuracy: 0.8387
Epoch 19/50
3/3 [==============================] - 0s 13ms/step - loss: 0.5880 - accuracy: 0.7684 - val_loss: 0.5543 - val_accuracy: 0.8710
Epoch 20/50
3/3 [==============================] - 0s 14ms/step - loss: 0.5784 - accuracy: 0.7794 - val_loss: 0.5413 - val_accuracy: 0.8710
Epoch 21/50
3/3 [==============================] - 0s 13ms/step - loss: 0.5680 - accuracy: 0.8015 - val_loss: 0.5282 - val_accuracy: 0.8710
Epoch 22/50
3/3 [==============================] - 0s 13ms/step - loss: 0.5572 - accuracy: 0.8015 - val_loss: 0.5149 - val_accuracy: 0.8710
Epoch 23/50
3/3 [==============================] - 0s 14ms/step - loss: 0.5462 - accuracy: 0.8051 - val_loss: 0.4997 - val_accuracy: 0.8710
Epoch 24/50
3/3 [==============================] - 0s 17ms/step - loss: 0.5360 - accuracy: 0.7904 - val_loss: 0.4845 - val_accuracy: 0.8710
Epoch 25/50
3/3 [==============================] - 0s 16ms/step - loss: 0.5256 - accuracy: 0.7868 - val_loss: 0.4675 - val_accuracy: 0.8710
Epoch 26/50
3/3 [==============================] - 0s 16ms/step - loss: 0.5142 - accuracy: 0.7831 - val_loss: 0.4489 - val_accuracy: 0.8710
Epoch 27/50
3/3 [==============================] - 0s 16ms/step - loss: 0.5028 - accuracy: 0.7794 - val_loss: 0.4294 - val_accuracy: 0.8710
Epoch 28/50
3/3 [==============================] - 0s 16ms/step - loss: 0.4881 - accuracy: 0.7904 - val_loss: 0.4108 - val_accuracy: 0.8710
Epoch 29/50
3/3 [==============================] - 0s 15ms/step - loss: 0.4783 - accuracy: 0.8051 - val_loss: 0.3924 - val_accuracy: 0.9032
Epoch 30/50
3/3 [==============================] - 0s 14ms/step - loss: 0.4673 - accuracy: 0.8051 - val_loss: 0.3738 - val_accuracy: 0.9032
Epoch 31/50
3/3 [==============================] - 0s 14ms/step - loss: 0.4555 - accuracy: 0.8088 - val_loss: 0.3546 - val_accuracy: 0.9032
Epoch 32/50
3/3 [==============================] - 0s 14ms/step - loss: 0.4448 - accuracy: 0.8125 - val_loss: 0.3376 - val_accuracy: 0.9032
Epoch 33/50
3/3 [==============================] - 0s 14ms/step - loss: 0.4350 - accuracy: 0.8125 - val_loss: 0.3235 - val_accuracy: 0.9032
Epoch 34/50
3/3 [==============================] - 0s 14ms/step - loss: 0.4248 - accuracy: 0.8125 - val_loss: 0.3131 - val_accuracy: 0.9032
Epoch 35/50
3/3 [==============================] - 0s 15ms/step - loss: 0.4159 - accuracy: 0.8162 - val_loss: 0.3055 - val_accuracy: 0.9032
Epoch 36/50
3/3 [==============================] - 0s 14ms/step - loss: 0.4075 - accuracy: 0.8125 - val_loss: 0.3003 - val_accuracy: 0.9032
Epoch 37/50
3/3 [==============================] - 0s 15ms/step - loss: 0.4000 - accuracy: 0.8199 - val_loss: 0.2925 - val_accuracy: 0.9032
Epoch 38/50
3/3 [==============================] - 0s 16ms/step - loss: 0.3931 - accuracy: 0.8272 - val_loss: 0.2859 - val_accuracy: 0.9032
Epoch 39/50
3/3 [==============================] - 0s 14ms/step - loss: 0.3865 - accuracy: 0.8382 - val_loss: 0.2806 - val_accuracy: 0.9032
Epoch 40/50
3/3 [==============================] - 0s 14ms/step - loss: 0.3789 - accuracy: 0.8309 - val_loss: 0.2800 - val_accuracy: 0.9032
Epoch 41/50
3/3 [==============================] - 0s 13ms/step - loss: 0.3736 - accuracy: 0.8346 - val_loss: 0.2874 - val_accuracy: 0.9032
Epoch 42/50
3/3 [==============================] - 0s 13ms/step - loss: 0.3745 - accuracy: 0.8272 - val_loss: 0.2857 - val_accuracy: 0.9032
Epoch 43/50
3/3 [==============================] - 0s 13ms/step - loss: 0.3655 - accuracy: 0.8419 - val_loss: 0.2740 - val_accuracy: 0.9032
Epoch 44/50
3/3 [==============================] - 0s 13ms/step - loss: 0.3560 - accuracy: 0.8456 - val_loss: 0.2719 - val_accuracy: 0.9032
Epoch 45/50
3/3 [==============================] - 0s 14ms/step - loss: 0.3504 - accuracy: 0.8456 - val_loss: 0.2714 - val_accuracy: 0.9032
Epoch 46/50
3/3 [==============================] - 0s 13ms/step - loss: 0.3444 - accuracy: 0.8566 - val_loss: 0.2723 - val_accuracy: 0.9032
Epoch 47/50
3/3 [==============================] - 0s 12ms/step - loss: 0.3391 - accuracy: 0.8640 - val_loss: 0.2725 - val_accuracy: 0.9032
Epoch 48/50
3/3 [==============================] - 0s 13ms/step - loss: 0.3353 - accuracy: 0.8566 - val_loss: 0.2706 - val_accuracy: 0.9032
Epoch 49/50
3/3 [==============================] - 0s 12ms/step - loss: 0.3307 - accuracy: 0.8566 - val_loss: 0.2685 - val_accuracy: 0.9032
Epoch 50/50
3/3 [==============================] - 0s 13ms/step - loss: 0.3254 - accuracy: 0.8713 - val_loss: 0.2657 - val_accuracy: 0.9032
model.evaluate(x_test,y_test)
1/1 [==============================] - 0s 999us/step - loss: 0.2657 - accuracy: 0.9032
[0.26569074392318726, 0.9032257795333862]

九、模型评估

import matplotlib.pyplot as plt

acc = history.history['accuracy']
val_acc = history.history['val_accuracy']

loss = history.history['loss']
val_loss = history.history['val_loss']

epochs_range = range(epochs)

plt.figure(figsize=(14, 4))
plt.subplot(1, 2, 1)

plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')

plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

在这里插入图片描述

我们打印出最后的准确率看看:

scores = model.evaluate(x_test, y_test, verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
accuracy: 90.32%

可以看出还不错,不过模型还可以进行改进的。

十、最后我想说

RNN相比于其他的神经网络,RNN是具有记忆性的,输入数据之间通常是分离的,它只能单独的去处理一个个的输入,前后输入之间并没有相关性,但是在实际应用中,某些任务需要能够处理序列的信息,而且前后输入存在一定的联系,RNN也有一定的局限性,那就是RNN具有长距离依赖,很难处理长序列的数据,而且由于其模型的特性,它比起神经网络更容易出现梯度消失和梯度爆炸的问题。

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

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

相关文章

网站TDK三大标签SEO优化

网站TDK三大标签SEO优化 SEO(Search Engine Optimization)汉译为搜索引擎优化,是一种利用搜索引擎的规则提高网站在有关搜索引擎内自然排名的方式 SEO的目的是对网站进行深度的优化,从而帮助网站获取免费的流量,进而在搜索引擎上提升网站的排…

day39 CSRFSSRF协议玩法内网探针漏洞利用

前言: #知识点: 1、CSRF-原理&危害&探针&利用等 2、SSRF-原理&危害&探针&利用等 3、CSRF&SSRF-黑盒下漏洞探针点 详细点: CSRF 全称:Cross-site request forgery,即,跨站…

java计算机毕业设计ssm兴发农家乐服务管理系统n159q(附源码、数据库)

java计算机毕业设计ssm兴发农家乐服务管理系统n159q(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&…

RK3568平台开发系列讲解(系统优化篇)如何进行内存优化

🚀返回专栏总目录 文章目录 一、设备分级二、Bitmap 优化三、内存泄漏沉淀、分享、成长,让自己和他人都能有所收获!😄 📢内存优化,应该从哪里着手呢?我通常会从设备分级、Bitmap 优化和内存泄漏这三个方面入手。 一、设备分级 内存优化首先需要根据设备环境来综合考虑…

硬件基础

目录 一、Cisco Packet Tracer 8.1.1安装 二、汉化 一、Cisco Packet Tracer 8.1.1安装 官方汉化包的Ciscohttps://www.netacad.com/portal/resources/browse/341e11c1-d03f-4433-9413-29b9d207e7eb 直接在官网下载但是官网有时候比较慢 思科数据包跟踪器 - 网络仿真工具 (n…

北斗/GNSS高精度数据处理暨GAMIT/GLOBK v10.75软件

随着GNSS导航定位技术在不同领域的广泛应用和技术更新的飞速发展,在大型工程项目的设计、施工、运行和管理各个阶段对工程测量提出了更高的要求,许多测绘、勘测、规划、市政、交通、铁道、水利水电、建筑、矿山、道桥、国土资源、气象、地震等行业部门在…

【实时数仓】介绍、需求分析、统计架构分析和ods层日志行为数据采集

文章目录一 电商实时数仓介绍1 普通实时计算与实时2 实时电商数仓分层二 实时数仓需求分析1 离线计算与实时计算的比较2 应数场景(1)日常统计报表或分析图中需要包含当日部分(2)实时数据大屏监控(3)数据预警…

不同系列的 ESP 芯片的 GPIO 默认初始状态

ESP 系列芯片的 GPIO 上电状态的含义: wpu: weak pull-up(为弱上拉模式)wpd: weak pull-down(为弱下拉模式)ie: input enable(输入使能模式)oe: output enable(输出使能模式&#x…

【Docker】第三章 镜像管理

3.1 镜像是什么 简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统。 3.2 镜像从哪里来 Docker Hub 是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。 https://hub.docker.…

碳中和科普

什么叫碳达峰和碳中和? 我国在2020年第75届联合国大会上宣布,二氧化碳排放量努力争取于2030年前达到峰值,2060年前实现碳中和。 碳达峰和碳中和中的碳指的都是以二氧化碳为代表的温室气体 碳达峰 碳达峰指的是碳排放达到峰值后进入平稳下降…

洛谷入门赛 202212F 宇宙密码 ——深搜

题目描述 经历十九年的探索,人们终于找到了宇宙中的那份瑰宝。 这份瑰宝被装在一个密码箱里,按照情报,密码应为一串长度为 nn 的数字 aa。 人们满怀希望地输入了密码,但是密码箱没有任何反应。 这时人们意识到,在十…

迈向高算力、跨域融合新拐点,智能座舱各路玩家如何卡位?

当前,中国车联网发展进入平稳增长周期,5G、V2X市场迎来拐点。 借助数字化转型驱动,互联化、数字化、个性化的智能座舱,以及与之强关联的座舱域控制器方案正实现快速发展和落地。 高工智能汽车研究院监测数据显示,202…

[附源码]Python计算机毕业设计SSM基于人脸识别和测温的宿舍管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

使用ESPRIT,LS-ESPRIT,Music以及Root-Music四种算法进行角度估计matlab仿真

目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 1.1ESPRIT ESPRIT算法全称为:Estimation of Signal Parameters using Rotational Invariance Techniques.与Root_MUSIC算法相同,也是一种参数估计技术。ESPRIT算法在旋转矢量中&#xff0…

Jetpack组件(三)Lifecycle

本篇是Jetpack组件系列文章的第三篇,将介绍第二个组件Lifecycle。Lifecycle为开发者管理 Activity 和 Fragment 生命周期提供了极大的便利,帮助开发者书写更轻量、易于维护的代码 一、Lifecycle简介 Lifecycle用于存储有关组件(如 activity …

UE实现指北针效果

文章目录 1.实现目标2.实现过程2.1 设计指北针Widget2.2 实时指北2.3 添加到页面显示3.参考资料1.实现目标 在UE中实现指北针效果,GIF图如下。 2.实现过程 实现思路较为简单,即获取到当前场景的Rotation,来设置UMG的旋转角度即可。 2.1 设计指北针Widget 包括底图圆环,…

嵌入式开发学习之--通讯的基本概念

提示:本章主要了解一下通讯的基本概念,无代码 文章目录前言一、通讯的基本概念1.1串行通讯与并行通讯1.2全双工、半双工及单工通讯1.3同步通讯与异步通讯1.4通讯速率总结前言 对于嵌入式开发来说,基本就是在传递信息和解析信息,根…

Kafka高级特性解析之物理存储

1、日志存储概述 Kafka 消息是以主题为单位进行归类,各个主题之间是彼此独立的,互不影响。每个主题又可以分为一个或多个分区。每个分区各自存在一个记录消息数据的日志文件。图中,创建了一个 tp_demo_01 主题,其存在6个 Paritio…

《四叶游戏》:梦想执念·棒球1号位

《幸运四叶草》又名《四叶游戏》,是日本漫画家安达充的代表作品之一。 2005年 – 2010年在《周刊少年Sunday》上连载。是小学馆漫画赏第54回(平成20年度)少年向部门得奖作品。作品亦改编为同名电视动画和游戏。 中文名 幸运四叶草 原版名称 …

海带软件分享——玩转OpenAI聊天机器人ChatGPT(免费中文版)

目录 2022 地表最强AI聊天机器人ChatGPT诞生! 一、前言 🎄🎈 ChatGPT是OpenAI开发的一个大型预训练语言模型。它是GPT-3模型的变体,GPT-3经过训练,可以在对话中生成类似人类的文本响应。ChatGPT旨在用作聊天机器人&a…