主要内容

基于深度学习的化工过程故障检测

此示例说明如何使用模拟数据训练可以在化学过程中检测故障的神经网络。网络以高精度检测模拟过程中的故障。典型的工作流程如下:

  1. 对数据进行预处理

  2. 设计层架构

  3. 培训网络

  4. 执行验证

  5. 测试网络

下载数据集

此示例使用MathWorks®从田纳西州伊斯曼过程(TEP)模拟数据转换的MATLAB格式文件[1]。这些文件在MathWorks支持文件网站上提供。请参阅万博1manbetx免责声明.

数据集由四个组件组成 - 无故障培训,无故障测试,训练,故障检测。单独下载每个文件。

URL =.'//www.tianjin-qmedu.com/万博1manbetxsupportfiles/predmaint/chemical-process-fault-detection-data/faultytesting.mat'; 韦伯萨夫(“faultytesting.mat”,url);url='//www.tianjin-qmedu.com/万博1manbetxsupportfiles/predmaint/chemical-process-fault-detection-data/faultytraining.mat'; 韦伯萨夫(“错误训练,垫子”,url);url='//www.tianjin-qmedu.com/万博1manbetxsupportfiles/predmaint/chemical-process-fault-detection-data/faultfreetesting.mat'; 韦伯萨夫(“无故障测试。mat”,url);url='//www.tianjin-qmedu.com/万博1manbetxsupportfiles/predmaint/chemical-process-fault-detection-data/faultfreetraining.mat'; 韦伯萨夫(“无故障训练,mat”,网址);

将下载的文件加载到MATLAB®工作区。

装载(“无故障测试。mat”);装载(“无故障训练,mat”);装载(“faultytesting.mat”);装载(“错误训练,垫子”);

每个组件包含针对两个参数的每个排列运行的模拟数据:

  • 故障编号-对于故障数据集,表示不同模拟故障的1到20之间的整数值。对于无故障数据集,值为0。

  • 模拟运行-对于所有数据集,为1到500之间的整数值,其中每个值表示模拟的唯一随机生成器状态。

每个模拟的长度取决于数据集。每三分钟都抽样所有模拟。

  • 训练数据集包含来自25小时模拟的500个时间样本。

  • 测试数据集包含来自48小时的模拟中的960个时间样本。

每个数据帧的列中都有以下变量:

  • 第1列(故障)指示故障类型,从0到20不等。故障编号0表示无故障,而故障编号1至20表示TEP中的不同故障类型。

  • 第2列(模拟运行)指示TEP模拟运行以获取完整数据的次数。在训练和测试数据集中,所有故障编号的运行次数从1到500不等。每个模拟运行值表示用于模拟的不同随机发生器状态。

  • 第3栏(样品)表示每次模拟记录TEP变量的次数。训练数据集的记录次数从1到500不等,测试数据集的记录次数从1到960不等。训练和测试数据集的TEP变量(第4列到第55列)每3分钟采样一次,持续时间分别为25小时和48小时。

  • 第4-44栏(圣诞节1通过圣诞节41)包含TEP的测量变量。

  • 第45-55栏(XMV_1通过xmv_11)包含TEP的操纵变量。

检查其中两个文件的子部分。

主管(培训,4)
ans =.4×55表数字模拟运行样本样本量量量模拟运行样本量模拟量模拟量模拟量模拟量模拟量模拟量模拟量样本量研究1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-2-1-1-1-1-1-2-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-U 31圣诞节32圣诞节33圣诞节34圣诞节35圣诞节36 x在37个圣诞节期间,有38个圣诞节和38个圣诞节以及40个圣诞节的8个圣诞节和38个圣诞节的8个圣诞节和38个圣诞节的8个圣诞节和38个圣诞节的8个圣诞节和38个圣诞节的8个圣诞节和38个圣诞节的8个圣诞节和38个圣诞节和40个圣诞节的8个圣诞节和40个圣诞节的8个8个圣诞节的8个圣诞节的8个圣诞节和38个圣诞节的8个圣诞节和38个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节和8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节和8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节和8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞节的8个圣诞的UUU厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄(小标题)(小标题)(小标题)(小标题)(小标题)(小标题)(小标题)(小标题)(小标题)小标题________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ 0 1 1 0.25038 3674 4529 9.232 26.889 42.402 2704.3 74.863 120.41 0.33818 80.044 51.435 2632.9 25.029 50.528 3101.1 22.819 65.732 229.61 341.22 94.64 77.047 32.188 8.8933 26.383 6.882 18.776 1.6567 32.958 13.823 23.978 1.2565 18.579 2.2633 4.8436 2.2986 0.017866 0.8357 0.098577 53.724 43.828 62.881 53.744 24.657 62.544 22.137 39.935 42.323 47.757 47.51 41.258 18.447 0 1 2 0.25109 3659.4 4556.6 9.4264 26.721 42.576 2705 75 120.41 0.3362 80.078 50.154 2633.8 24.419 48.772 3102 23.333 65.716 230.54 341.3 94.595 77.434 32.188 8.8933 26.383 6.882 18.776 1.6567 32.958 13.823 23.978 1.2565 18.579 2.2633 4.8436 2.2986 0.017866 0.8357 0.098577 53.724 43.828 63.132 53.414 24.588 59.259 22.084 40.176 38.554 43.692 47.427 41.359 17.194 0 1 3 0.25038 3660.3 4477.8 9.4426 26.875 42.07 2706.2 74.771 120.42 0.33563 80.22 50.302 2635.5 25.244 50.071 3103.5 21.924 65.732 230.08 341.38 94.605 77.466 31.767 8.7694 26.095 6.8259 18.961 1.6292 32.985 13.742 23.897 1.3001 18.765 2.2602 4.8543 2.39 0.017866 0.8357 0.098577 53.724 43.828 63.117 54.357 24.666 61.275 22.38 40.244 38.99 46.699 47.468 41.199 20.53 0 1 4 0.24977 3661.3 4512.1 9.4776 26.758 42.063 2707.2 75.224 120.39 0.33553 80.305 49.99 2635.6 23.268 50.435 3102.8 22.948 65.781 227.91 341.71 94.473 77.443 31.767 8.7694 26.095 6.8259 18.961 1.6292 32.985 13.742 23.897 1.3001 18.765 2.2602 4.8543 2.39 0.017866 0.8357 0.098577 53.724 43.828 63.1 53.946 24.725 59.856 22.277 40.257 38.072 47.541 47.658 41.643 18.089
头(致致训练,4)
ans =.4×55表数字模拟运行样本样本量量量模拟运行样本量模拟量模拟量模拟量模拟量模拟量模拟量模拟量样本量研究1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-2-1-1-1-1-1-2-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-U 31圣诞节32圣诞节33圣诞节34圣诞节35圣诞节36在37个圣诞节前,有37个圣诞节的圣诞圣诞活动和38个圣诞节的圣诞活动和40个圣诞节的圣诞活动和40个圣诞节的圣诞圣诞活动和1个1个1个2个2个圣诞节的2个圣诞4个圣诞5个圣诞5个圣诞8个圣诞节的圣诞活动和37个8个圣诞节的圣诞圣诞圣诞活动和8个圣诞圣诞圣诞圣诞圣诞圣诞圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞10个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞8个圣诞UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ________ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ ______ 1 1 1 0.25038 3674 4529 9.232 26.889 42.402 2704.3 74.863 120.41 0.33818 80.044 51.435 2632.9 25.029 50.528 3101.1 22.819 65.732 229.61 341.22 94.64 77.047 32.188 8.8933 26.383 6.882 18.776 1.6567 32.958 13.823 23.978 1.2565 18.579 2.2633 4.8436 2.2986 0.017866 0.8357 0.098577 53.724 43.828 62.881 53.744 24.657 62.544 22.137 39.935 42.323 47.757 47.51 41.258 18.447 1 1 2 0.25109 3659.4 4556.6 9.4264 26.721 42.576 2705 75 120.41 0.3362 80.078 50.154 2633.8 24.419 48.772 3102 23.333 65.716 230.54 341.3 94.595 77.434 32.188 8.8933 26.383 6.882 18.776 1.6567 32.958 13.823 23.978 1.2565 18.579 2.2633 4.8436 2.2986 0.017866 0.8357 0.098577 53.724 43.828 63.132 53.414 24.588 59.259 22.084 40.176 38.554 43.692 47.427 41.359 17.194 1 1 3 0.25038 3660.3 4477.8 9.4426 26.875 42.07 2706.2 74.771 120.42 0.33563 80.22 50.302 2635.5 25.244 50.071 3103.5 21.924 65.732 230.08 341.38 94.605 77.466 31.767 8.7694 26.095 6.8259 18.961 1.6292 32.985 13.742 23.897 1.3001 18.765 2.2602 4.8543 2.39 0.017866 0.8357 0.098577 53.724 43.828 63.117 54.357 24.666 61.275 22.38 40.244 38.99 46.699 47.468 41.199 20.53 1 1 4 0.24977 3661.3 4512.1 9.4776 26.758 42.063 2707.2 75.224 120.39 0.33553 80.305 49.99 2635.6 23.268 50.435 3102.8 22.948 65.781 227.91 341.71 94.473 77.443 31.767 8.7694 26.095 6.8259 18.961 1.6292 32.985 13.742 23.897 1.3001 18.765 2.2602 4.8543 2.39 0.017866 0.8357 0.098577 53.724 43.828 63.1 53.946 24.725 59.856 22.277 40.257 38.072 47.541 47.658 41.643 18.089

干净数据

在训练和测试数据集中删除具有故障编号3,9和15的数据条目。这些故障编号无法识别,相关的仿真结果是错误的。

FaultyTest(FaultyTest.faultNumber==3,:)=[];FaultyTest(FaultyTest.faultNumber==9,:)=[];FaultyTest(FaultyTest.faultNumber==15,:)=[];faultytraining(faultytraining.faultNumber==3,:)=[];faultytraining(faultytraining.faultNumber==9,:)=[];faultytraining(faultytraining.faultNumber==15,:)=[];

划分数据

通过保留20%的培训数据进行验证,将培训数据分为培训数据和验证数据。通过使用验证数据集,可以在优化模型超参数时评估训练数据集上的模型拟合。数据拆分通常用于防止网络过拟合和欠拟合。

获取故障和无故障训练数据集中的总行数。

H1=高度(无故障训练);H2=高度(断层训练);

仿真运行是TEP处理用特定故障类型重复的次数。从训练数据集以及从测试数据集中获取最大仿真。

mstrain = max(DealferfreeTraining.simulationRun);MSTEST = MAX(故障敏感.SimulationRun);

计算验证数据的最大模拟运行。

rTrain=0.80;msVal=ceil(msTrain*(1-rTrain));msTrain=msTrain*rTrain;

获取最大采样数或时间步长(即TEP模拟期间记录数据的最大次数)。

sampleTrain=最大值(无故障训练.sample);sampleTest=最大值(无故障测试样本);

获取无故障和故障训练数据集中的分割点(行号),以从训练数据集中创建验证数据集。

rowLim1=ceil(rTrain*H1);rowLim2=ceil(rTrain*H2);trainingData=[faultfreetraining{1:rowLim1,:};faultytraining{1:rowLim2,:}];validationData=[faultfreetraining{rowLim1+1:end,:};faultytraining{rowLim2+1:end,:}];testingData=[faultfreetesting{:,:};faultytesting{:,:}];

网络设计与预处理

最终数据集(由训练、验证和测试数据组成)包含52个信号,具有500个统一的时间步长。因此,需要将信号或序列分类为其正确的故障编号,这使其成为序列分类问题。

  • 长短时记忆(LSTM)网络适合于序列数据的分类。

  • LSTM网络适用于时间序列数据,因为它们倾向于记住过去信号的唯一性,以便对新信号进行分类

  • LSTM网络使您可以将序列数据输入网络中输入到网络中,并基于序列数据的各个时间步长进行预测。有关LSTM网络的更多信息,请参阅长短时记忆网络.

  • 训练网络使用Trainnetwork.函数时,必须首先预处理数据。数据必须在单元阵列中,单元阵列的每个元素都是一个矩阵,表示单个模拟中52个信号的集合。单元阵列中的每个矩阵都是TEP特定模拟的信号集合,可以是故障的,也可以是无故障的。每组信号指向一个特定的fic故障等级从0到20。

正如前面在“数据集”部分中所述,数据包含52个变量,这些变量的值在模拟中的一定时间内被记录。这个样品变量表示在一次模拟运行中记录这52个变量的次数。的最大值样品变量为训练数据集500,测试数据集中为960。因此,对于每个模拟,存在一组长度为500或960的52个信号。每组信号属于TEP的特定模拟运行,并且指向范围0-20中的特定故障类型。

培训和测试数据集都包含每个故障类型的500个模拟。将2%(来自训练)保持验证,验证将培训数据设置为每次故障类型的400次模拟和验证数据,每个故障类型100次模拟。使用辅助功能辅助再处理创建信号集,其中每个信号集是表示单个TEP模拟的单元阵列单个元素中的双矩阵。因此,最终培训、验证和测试数据集的大小如下:

  • 大小Xtrain:(模拟总数)X(故障类型总数)=400 X 18=7200

  • 大小xval.:(模拟总数)X(故障类型总数)=100 X 18=1800

  • 大小分值:(仿真总数)x(故障类型总数)= 500 x 18 = 9000

在数据集中,前500种模拟是0错误类型(无故障)和随后的错误模拟的顺序是已知的。此知识可以创建培训,验证和测试数据集的真正响应。

Xtrain=帮助程序重新处理(训练数据,样本训练);Ytrain=分类([0(msTrain,1);repmat([1,2,4:8,10:14,16:20],1,msTrain]);XVal=帮助程序重新处理(validationData,sampleTrain);YVal=分类([Zero(msVal,1);repmat([1,2,4:8,10:14,16:20],1,msVal)]);Xtest=帮助程序重新处理(testingData,sampleTest);Y测试=分类([0(msTest,1);repmat([1,2,4:8,10:14,16:20],1,msTest]);

规范化数据集

标准化是一种将数据集中的数值按通用比例缩放的技术,不会扭曲数值范围中的差异.该技术可确保具有更大值的变量不会在训练中占据其他变量。它还将数值在较高范围内转换为较小的范围(通常为-1到1),而不会丢失培训所需的任何重要信息。

使用训练数据集中所有模拟的数据计算52个信号的平均值和标准偏差。

tmean =均值(TrainingData(:,4:结束))';Tsigma = STD(TrainingData(:,4:结束))';

使用辅助功能帮助标准化根据训练数据的平均值和标准偏差,对三个数据集中的每个单元格进行归一化处理。

XTrain = Helpernormalize(Xtrain,Tmean,Tsigma);xval = Helpernormalize(xval,tmean,tsigma);XTEST = Helpernormalize(XTEST,TMean,Tsigma);

可视化数据

这个Xtrain数据集包含400个无故障模拟,后跟6800个错误的模拟。维度无故障和故障数据。首先,创建无故障数据的曲线。出于此示例的目的,绘图和标签仅10个信号Xtrain数据集以创建易于读取的数字。

图;splot=10;绘图(Xtrain{1}(1:10,:)';xlabel(“时间步长”);头衔(“非故障数据的培训观察”);传奇(“信号 ”+字符串(1:splot),“位置”,“东北外”);

现在,通过在400之后绘制任何单元格数组元素来将故障绘图与故障绘图进行比较。

图形绘图(Xtrain{1000}(1:10,:)');xlabel(“时间步长”);头衔(“培训有错误数据的观察”);传奇(“信号 ”+字符串(1:splot),“位置”,“东北外”);

层体系结构和培训选项

LSTM层是序列分类的良好选择,因为LSTM层往往只记住输入序列的重要方面。

  • 指定输入层序列输入层与输入信号的数量相同的大小(52)。

  • 指定3个LSTM隐藏层,包含52、40和25个单位。此规范的灵感来源于在中执行的实验[2]. 有关使用LSTM网络进行序列分类的更多信息,请参阅基于深度学习的序列分类.

  • 在LSTM层之间添加3个下拉层,以防止过度拟合。辍学层以给定的概率将下一层的输入元素随机设置为零,这样网络就不会对该层中的一小部分神经元敏感

  • 最后,对于分类,包括与输出类数量(18)相同大小的完全连接层。在完全连接层之后,包括分配小数概率(预测可能性)的softmax层多类问题中的每个类和分类层,以根据softmax层的输出输出最终故障类型。

numSignals=52;numHiddenUnits2=52;numHiddenUnits3=40;numHiddenUnits4=25;numClass=18;层=[...sequenceInputLayer(numSignals)lstmLayer(numHiddenUnits2,“输出模式”,“顺序”)dropoutLayer(0.2)第一层(numhiddenuts3,“输出模式”,“顺序”)dropoutLayer(0.2)第一层(numHiddenUnits4,“输出模式”,“最后”)dropoutLayer(0.2)fullyConnectedLayer(NumClass)softmaxLayer classificationLayer];

设置所需的培训选项Trainnetwork.用途。

保持名称值对的默认值“执行环境”“自动”. 通过此设置,软件将自动选择执行环境。默认情况下,Trainnetwork.如果GPU可用,则使用GPU,否则使用CPU。在GPU上进行培训需要并行计算工具箱™ 和支持的GPU设备。有关支持的设备的信息,请参阅万博1manbetxGPU通万博1manbetx过发布支持(并行计算工具箱).因为本例使用了大量数据,所以使用GPU可以大大加快训练时间。

设置名称-值参数对“洗牌”“每个时代”避免每个历元丢弃相同的数据。

有关深度学习培训选项的更多信息,请参阅培训选项.

maxEpochs=30;最小批量大小=50;选项=培训选项(“亚当”,...“执行环境”,“自动”,...'gradientthreshold',1,...“MaxEpochs”,maxEpochs,...“MiniBatchSize”,小批量,...“洗牌”,“每个时代”,...'verbose',0,...“情节”,“培训进度”,...'vightationdata',{XVal,YVal});

列车网络

使用Trainnetwork..

net = trainnetwork(xtrain,ytrain,图层,选项);

训练进度数字显示网络精度的曲线图。在图的右侧,查看有关培训时间和设置的信息。

测试网络

在测试集上运行经过训练的网络,并预测信号中的故障类型。

ypred =分类(net,xtest,...“MiniBatchSize”,小批量,...“执行环境”,“自动”);

计算准确度。准确度是测试数据中与中的分类相匹配的真实标签数分类除以测试数据中的图像数。

acc=总和(Ypred==Ytest)。/numel(Ypred)
acc=0.9992

高精度表示神经网络成功地能够以最小的错误识别未经检验信号的故障类型。因此,准确性越高,网络的准确性越好。

使用测试信号的真实类别标签绘制混淆矩阵,以确定网络识别每个故障的能力。

混淆图(Ytest,Ypred);

使用混淆矩阵,您可以评估分类网络的有效性。困惑矩阵在其他地方的主要对角线和零中具有数值。此示例中的训练网络是有效的,并正确分类超过99%的信号。

工具书类

[1] 里思,C.A.,B.D.阿姆塞尔,R.Tran.,和B.Maia。“用于异常检测评估的附加田纳西-伊斯曼过程模拟数据”,《哈佛数据宇宙》,2017年第1版。https://doi.org/10.7910/DVN/6C3JR1.

[2] 使用人工神经网络的故障检测和分类〉,韩国高级科学技术研究所化学和生物分子工程系。

辅助函数

辅助再处理

辅助函数辅助再处理使用最大样本数预处理数据。样本号表示整个数据集一致的信号长度。for循环使用信号长度滤波器遍历数据集,形成52个信号集。每个集合都是单元格数组的一个元素。每个单元阵列表示一个模拟。

作用已处理= HelperPreprocess(MyData,Limit)H =大小(MyData);处理= {};对于ind=1:limit:hx=mydata(ind:ind+(limit-1)),4:end);processed=[processed;x'];终止终止

帮助标准化

辅助函数帮助标准化使用数据、平均值和标准偏差来规范化数据。

作用数据=helperNormalize(数据,m,s)对于IND = 1:大小(数据)数据{ind} =(数据{ind}  -  m)./ s;终止终止

另见

|||

相关话题