29、AI与物联网:数字孪生开发全解析

AI与物联网:数字孪生开发全解析

1. 机器学习相关技术

开发机器学习(ML)模型的过程十分复杂,存在多种高效构建和维护ML模型的技术,如超参数调优、折叠、指标评估、不平衡数据管理、生成模型、基于人类反馈的强化学习、可解释AI、持续学习和不确定性量化等。

1.1 Scikit-learn框架

Scikit-learn(https://scikit-learn.org/)是开发经典ML算法的常用框架,支持超100种线性和非线性模型、分类和回归模型,以及监督和无监督模型,还支持字符串转换管道来转换和预处理数据。其重要方法总结如下:
| 方法 | 描述 | 用途 |
| — | — | — |
| fit(X,y) | 模型或转换器训练 | 分类、回归、降维、聚类和预处理 |
| predict(X) | 模型或转换器评估 | 分类和回归 |
| fit_transform(X,y) | 预处理器训练和数据转换 | 降维与预处理 |
| transform(X) | 预处理器数据转换 | 降维与预处理 |
| predict_proba(X) | 概率评估 | 分类 |

Scikit-learn适用于经典ML,但要开发更高级的模型,就需要深度学习(DL)技术。

2. 深度学习技术

2010年,DL成为实现神经网络(NNs)的重要新方法。通过多层的分层分布式表示应用,NNs重获辉煌。

2.1 神经网络原理

NN是多个神经元全(或部分)连接的网络。单个神经元的数学函数是前一层神经元输出的加权和,输出可(可选)发送到激活函数,再传递到下一层。训练阶段,权重会自动更新:先进行前馈输入,然后比较输出与预期输出得到误差,最后使用梯度下降(GD)等优化方法反向传播误差,更新所有神经元的权重和偏置。

2.2 梯度下降相关算法

从数学角度看,反向传播算法基于GD方法,即沿梯度反方向寻找最小误差。为便于计算,通常对小批量数据迭代应用GD,这就是小批量GD或随机梯度下降(SGD)。SGD是将GD应用于单个点,而小批量GD是将GD应用于一组点(小批量)。SGD的下降速度由学习率(LR)控制,LR是0到1之间的标量,值越小,所需迭代次数越多;LR过大则可能导致算法无法收敛到最小值。为避免过多关注LR,可使用Adam优化器,它采用启发式方法优化LR并避免局部最小值。常见的优化器有Adam、AdamW、Adamax、RSProp、SGD等,这里仅使用Adam(https://pytorch.org/docs/stable/optim.html)。

3. 常用深度学习库
3.1 TensorFlow

TensorFlow(https://www.tensorflow.org/)是用于ML算法的开源库,对GPU或张量处理单元(TPUs)有很好的支持。使用TensorFlow最简便的方式是通过Keras和Python,也可直接用其他语言(如C++)。

3.2 PyTorch

PyTorch(https://pytorch.org/)是开发NNs的常用框架,广泛用于DL,特别是生成式AI(GenAI)。后续将用PyTorch开发数字孪生模型。

4. 生成式AI与通用人工智能
4.1 生成式AI(GenAI)

GenAI是ML和DL的子集。自2023年起,随着ChatGPT、DALL - E和大语言模型(LLM)的普及,GenAI在工业物联网(IIoT)领域备受关注。GenAI能根据给定指令生成内容,首个GenAI模型是变分自编码器(VAE),随后生成对抗网络(GANs)让GenAI获得科学界高度关注,随着Transformer、稳定扩散和基于人类反馈的强化学习的引入,GenAI迈向新高度,朝着通用人工智能(AGI)发展。

4.2 通用人工智能(AGI)

AGI即强AI,目标是达到人类水平的AI性能。其基本思想是构建通用模型(基础模型),能在多个领域工作,且模型再训练成本低。目前人类学习只需几步,而现有AI需要大量数据。AGI旨在开发强大且通用的模型,能复用已获取的模式,在少量数据(少样本学习)或无数据(零样本学习)的新环境中自适应。AGI之旅刚刚起步,预计2030年出现首个真正的AGI,但目前仍有争议,部分研究者认为GPT - 4可视为AGI,另一些人则认为要等到2050年。

5. 数字孪生开发实践

接下来将使用Python、PyTorch和pandas开发数字孪生模型。

5.1 准备开发环境

有两种方式准备环境:
- 命令行安装

$ pip3 install seaborn scikit-learn pandas matplotlib notebook 
$ pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
$ jupyter lab --allow-root --NotebookApp.token='' --NotebookApp.password=''

最后连接到http://localhost:8888。
- 使用Docker镜像
从https://github.com/PacktPublishing/Hands-On-Industrial-Internet-of-Things-Second-Edition 的Chapter 14目录下,执行以下命令:

$ docker compose build
$ docker compose up
5.2 评估100台发动机的剩余使用寿命(RUL)

使用NASA提供的免费涡轮风扇发动机退化模拟数据集来估计喷气发动机的RUL。
- 步骤0和1:问题陈述与数据集
数据集可从https://data.nasa.gov/Aerospace/CMAPSS-Jet-Engine-Simulated-Data/ff5v-kuh6/about_data 下载,简化练习仅使用train_FD001.txt文件。NASA的挑战是计算列出的100台发动机的RUL。数据为压缩格式,有26列,包括单元编号、时间周期、操作设置和传感器测量值等。

import pandas as pd
import numpy as np
columns = ['unitid', 'time', 'set_1','set_2','set_3']
columns.extend(['sensor_' + str(i) for i in range(1,22)])
df_train = pd.read_csv('./train_FD001.txt', delim_whitespace=True, names=columns)
df_test = pd.read_csv('./test_FD001.txt', delim_whitespace=True, names=columns)
unitid = 1
df_train = df_train[df_train['unitid']==unitid]
df_test = df_test[df_test['unitid']==unitid]
  • 步骤2:探索性数据分析(EDA)
    分析发现set_3、sensor_1、sensor_5、sensor_10、sensor_16、sensor_18和sensor_19的标准差为0,可移除这些变量。
df_train.std()
X_columns =['set_1', 'set_2', 'sensor_2', 'sensor_3', 'sensor_4','sensor_7', 'sensor_8', 'sensor_9','sensor_11', 'sensor_12','sensor_13', 'sensor_14', 'sensor_15','sensor_17', 'sensor_20','sensor_21']
df_train=df_train[X_columns]
df_test=df_test[X_columns]

还可分析传感器之间的相关性:

import matplotlib.pyplot as plt
import seaborn as sns
sns.pairplot(df, vars=X_columns)
plt.show()

也能查看前五个发动机的趋势:

import matplotlib.pyplot as plt
import seaborn as sns
i=0
for column in df1:
    if ('sensor' in column):
        i=i+1
        ax= plt.subplot(5,5,i)
        ax = sns.lineplot(x="time", y=column, hue='unitid', legend=False, data=df, ax=ax)
  • 步骤3:构建模型
    • 构建数据集 :假设从数据集的40%开始线性退化,以此作为标签。
def create_train_dataset(dataset):
    dataX, dataY = [], []
    n = len(dataset)
    start=int(len(dataset)/10*4)
    for i in range(start):
        a = dataset[i]
        b = (n-start) / n
        dataX.append(a)
        dataY.append(b)
    for i in range(start, n):
        a=dataset[i]
        b=(n-i) / n
        dataX.append(a)
        dataY.append(b)
    return np.array(dataX).astype('float32'), np.array(dataY).astype('float32')
X_train,y_train = create_train_dataset(df_train.values)
n = len(X_train)
X_test,_ = create_train_dataset(df_test.values)
- **选择变量**:NASA提供的数据集有四个训练文件和四个测试文件,可按其建议用训练文件训练,测试文件验证。
- **定义模型**:使用PyTorch构建基于NN的数字孪生模型,步骤如下:
    1. 将数据集缩放到[0,1]区间。
from sklearn.preprocessing import MinMaxScaler
def scale_dataset(ds_train, ds_test):
    scaler = MinMaxScaler(feature_range=(0, 1))
    ds_train = scaler.fit_transform(ds_train)
    ds_test = scaler.transform(ds_test)
    return ds_train, ds_test
X_train, X_test = scale_dataset(X_train, X_test)
    2. 构建NN。
import torch.nn as nn
class JetDigitalTiwnModel(nn.Module):
    def __init__(self, input_size, hidden_size=16):
        super().__init__()
        self.hidden1 = nn.Linear(input_size, hidden_size)
        self.act1 = nn.ReLU()
        self.hidden2 = nn.Linear(hidden_size, hidden_size*2)
        self.act2= nn.ReLU()
        self.out = nn.Linear(hidden_size*2, 1)
        self.act = nn.ReLU()
    def forward(self, x):
        x = self.act1( self.hidden1 (x) )
        x = self.act2( self.hidden2 (x) )
        x = self.act( self.out(x) )
        return x
    3. 训练模型。
import torch
from torch.utils.data import Dataset
class MyDataset(Dataset):
    def __init__(self, x, y):
        super(MyDataset, self).__init__()
        self.x = x
        self.y = y
    def __len__(self):
        return self.y.shape[0]
    def __getitem__(self, index):
        return self.x[index], self.y[index]
def train_model(model, X_train, y_train, num_epochs = 1000, learning_rate = 1e-4, batch_size=64):
    X_train = torch.tensor(X_train, dtype=torch.float32)
    y_train = torch.tensor(y_train, dtype=torch.float32).reshape(-1,1)
    criterion = torch.nn.MSELoss()
    optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
    loader = torch.utils.data.DataLoader(MyDataset(X_train, y_train), batch_size=batch_size, shuffle=True)
    history = {'loss':[]}
    for epoch in range(num_epochs):
        for batch_idx, (_X, _y) in enumerate(loader):
            model.train()
            outputs = model(_X)
            optimizer.zero_grad()
            loss = criterion(outputs, _y)
            loss.backward()
            optimizer.step()
        if epoch % 100 == 0:
            print("Epoch: %d, loss: %1.5f" % (epoch, loss.item()))
            history['loss'].append(loss.item())
    return model, history
model = JetDigitalTiwnModel(input_size=X_train.shape[1])
model, history = train_model(model, X_train, y_train)
    4. 测试模型。
model.eval()
with torch.no_grad():
    out_data = model(torch.tensor(X, dtype=torch.float32))
rul = (out_data*n).numpy().flat[-1]

估计的RUL为113个周期,预期答案是112个周期,误差约1%。最后分析损失:

import matplotlib.pyplot as plt
plt.plot(history['loss'])
6. 与基线模型比较

通常用简单模型与复杂模型比较。本练习使用高斯过程回归(GPR)作为基线模型,它采用贝叶斯方法,对噪声数据鲁棒。实现步骤如下:
1. 定义模型。
2. 调用fit方法训练模型。
3. 调用predict方法评估模型。

import sklearn
from sklearn.gaussian_process.kernels import RBF, WhiteKernel
from sklearn.utils import shuffle

通过以上步骤,我们完成了从机器学习基础技术到数字孪生模型开发及评估的整个过程,对AI与物联网领域的相关技术有了更深入的理解和实践。

AI与物联网:数字孪生开发全解析

7. 模型评估与分析

在完成数字孪生模型的开发后,对模型进行评估和分析是至关重要的,它能让我们了解模型的性能和效果。

7.1 损失分析

在训练模型时,我们记录了损失值的变化。通过绘制损失曲线,可以直观地观察模型的学习过程。

import matplotlib.pyplot as plt
plt.plot(history['loss'])

从损失曲线中,我们可以看到误差逐渐减小,但由于使用了随机梯度下降(SGD),曲线会呈现出不断振荡的状态,直到最终收敛。这是SGD的典型行为,与我们之前所学的深度学习知识相符合。

7.2 剩余使用寿命(RUL)估计误差

在本次练习中,我们估计的RUL为113个周期,而预期答案是112个周期,误差约为1%。这个误差表明我们的模型在估计RUL方面具有较高的准确性,但仍有一定的提升空间。我们可以通过调整模型的参数、增加训练数据或改进特征工程等方法来进一步降低误差。

8. 模型优化建议

为了提高数字孪生模型的性能和准确性,我们可以考虑以下优化建议:

8.1 调整超参数

超参数的选择对模型的性能有很大影响。例如,学习率(LR)、批量大小(batch size)和训练轮数(num epochs)等。我们可以通过网格搜索或随机搜索等方法来寻找最优的超参数组合。

# 示例:调整学习率和批量大小
model, history = train_model(model, X_train, y_train, num_epochs = 1500, learning_rate = 5e-5, batch_size=32)
8.2 增加训练数据

更多的训练数据可以让模型学习到更丰富的特征和模式,从而提高模型的泛化能力。我们可以尝试使用NASA提供的其他数据集文件,或者收集更多相关的数据。

8.3 改进特征工程

特征工程是提高模型性能的关键步骤。我们可以对原始数据进行进一步的处理和转换,提取更有价值的特征。例如,对传感器数据进行归一化、标准化或特征组合等操作。

# 示例:对数据进行标准化处理
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
9. 总结与展望

通过本次实践,我们深入了解了机器学习、深度学习在物联网领域的应用,特别是数字孪生模型的开发过程。从数据的准备、模型的构建到训练和评估,每一个步骤都需要我们认真对待。

在未来,随着人工智能和物联网技术的不断发展,数字孪生模型将在更多领域得到应用,如工业制造、智能交通、能源管理等。我们可以进一步探索如何将数字孪生模型与其他技术相结合,如区块链、边缘计算等,以实现更高效、智能的系统。

同时,我们也需要关注模型的可解释性和安全性。在实际应用中,我们需要确保模型的决策是可解释的,并且能够抵御各种安全威胁。

以下是本次数字孪生模型开发的主要步骤总结表格:
| 步骤 | 操作内容 |
| — | — |
| 准备开发环境 | 使用命令行安装或Docker镜像安装所需的库和工具 |
| 评估RUL | 下载NASA数据集,进行数据预处理和探索性分析 |
| 构建模型 | 构建数据集、选择变量、定义模型并进行训练和测试 |
| 模型评估与分析 | 分析损失曲线和RUL估计误差 |
| 模型优化 | 调整超参数、增加训练数据和改进特征工程 |

为了更清晰地展示整个流程,下面是一个mermaid格式的流程图:

graph LR
    A[准备开发环境] --> B[评估RUL]
    B --> C[构建模型]
    C --> D[模型评估与分析]
    D --> E[模型优化]

通过以上的学习和实践,我们可以在AI与物联网领域不断探索和创新,为未来的智能世界做出贡献。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值