王鹏 徐小辉 肖萍 李淑 郭怡晓
[摘 要]近年来,随着人工智能技术的发展应用,机器学习的框架及研究工具逐渐成熟。其中,TensorFlow.js是由Google的AI团队发布的一款基于硬件加速的JavaScript库,用于训练和部署机器学习,用户在浏览器端就可以利用应用程序编程接口(Application Programming Interface,API)完成机器学习的基本任务。在油气田开发领域中,产生的生产及分析数据具有数据量小、相关性强的特点,在机器学习过程中,大部分业务通过浏览器就能进行简单的数据线性回归、分类、目标识别、可视化等处理操作,具有简单、快速、易学等特点。文章以线性回归模型为例,对探井试油过程中的油管压力数据采用前端机器学习方法进行线性回归拟合,并实现压力预测。
[关键词]TensorFlow.js;前端机器学习;线性回归;压力预测
doi:10.3969/j.issn.1673 - 0194.2020.24.047
[中图分类号]F270.7;TM715[文献标识码]A[文章编号]1673-0194(2020)24-0-02
0 引 言
油气田开发领域建立了很多关系型数据库,在进行探井或区块业务分析过程中,实际使用的数据量并不大,不需要采用图形处理器(Graphics Processing Unit,GPU)进行加速学习运算,在浏览器端就能营造一个回归、神经网络、长短期记忆网络(Long Short-Term Memory,LSTM)等模型的训练环境,让用户通过便捷的浏览器操作就能实现机器学习的整个过程,从而达到数据预测、分类、图像识别等目的。
1 浅神经网络和直线线性回归拟合
神经网络是机器学习中的一种模型,是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,达到处理信息的目的。
浅神经网络只包含一到两层隐藏层,如图1所示,包括输入层、隐藏层和输出层。神经元是神经网络中的原子单元,给定神经元一个输入x,它将得到对应的输出a,并将其作为下一层的输入。一个神经元可以认为是以下两部分的结合:第一部分根据输入和权重计算得到Z;第二部分在Z上施加激活函数得到神经元的最终输出a。
直线线性回归拟合是多项式曲线拟合的一个特例,即:一元一次多项式,由给定的一组数据点(xi,yi)去描绘直线y=w×x+b的近似图像。直线拟合方法就是从给出的一大堆看上去杂乱无章的数据中找出规律,设法构造一条直线,反映所给数据点的趋势,以消除所给数据的局部波动。TensorFlow.js就是通过训练数据,实现一元线性回归模型训练,推测出线性回归函数y=w×x+b中w和b的值,并通过验证数据,验证得到的函数是否符合预期。
2 TensorFlow.js前端机器学习的过程及方法
2.1 构建学习环境
在JavaScript项目中,TensorFlow.js的安装方法有两种:一种是通过script标签引入;另外一种是通过npm安装。
方法1:只需将以下脚本包含在html文件的header中即可自动加载最新版本的TensorFlow.js。其中,使用Script Tag如下。
方法2:使用yarn或npm將TensorFlow.js添加到您的项目中。注意:因为使用ES2017语法(如import),所以此工作流程假定您使用打包程序/转换程序将代码转换为浏览器可以理解的内容。
yarn add @tensorflow/tfjs或npm install @tensorflow/tfjs
在js文件中输入以下代码:
import * as tf from '@tensorflow/tfjs';
2.2 准备训练数据
训练数据的初始化如下,这里tx是所有点数据的x坐标,ty是所有点数据的y坐标。
const train_x = tf.tensor1d(tx);
const train_y = tf.tensor1d(ty);
2.3 构建一个模型
TensorFlow.js有两种创建机器学习的方法。
2.3.1 用Layers API创建模型
通过tf.model()创建LayersModel,这个方式适用于单独测试每一层并检查它们的输出。
可以通过model.layers使用模型中的每一层,用model.inputLayers和model.outputLayers调用输入层和输出层。使用LayersModels让验证更方便:要求您定义输入形状,并用您定义的形状验证您对模型的输入。LayersModel会自动计算模型中所有张量的形状。知道张量的形状后,模型可以自动创建需要的参数。
const input = tf.input({shape: [784]});
const dense1 = tf.layers.dense({units: 32, activation: 'relu'}).apply(input);
const dense2 = tf.layers.dense({units: 10, activation: 'softmax'}).apply(dense1);
const model = tf.model({inputs: input, outputs: dense2});
2.3.2 用Core API创建模型
用Core API创建的模型包含一系列函数。这些函数以一个或多个张量作为输入,并输出另一个张量。可以利用Core API定义的模型,创造自己的序列化方法。
const w = tf.variable(tf.scalar(Math.random()));
const b = tf.variable(tf.scalar(Math.random()));
function model(x) {return x.mul(w) .add(b);};
在Core API中,需要自己创建和初始化权重。每个权重都是一个Variable,TensorFlow.js会把Variable权重设为可训练张量。可以用tf.variable()创建Variable或把一个已存在的张量放到Variable中。
2.4 训练模型
一个训练好的模型将提供从输入数据到所需输出数据的准确映射。训练包含以下4个步骤:获取一批数据到模型、根据模型得出预测值、对比预测值与真实值、确定每个参数的变更值,以便后期模型将来可以更好地预测该批次。
用Layers API创建的模型在训练前必须先进行编译,编译LayersModel通过调用model.compile()与提供的优化器、损失函数、指标等选项,在编译过程中,模型将进行一些验证,以确保您选择的选项彼此兼容,如下所示。
model.compile({optimizer:'sgd',loss: 'categoricalCrossentropy',metrics: ['accuracy']});
模型训练则通过调用model.fit()方法实现,在后台能自动对大的数据张量进行拆分调用,并将数据集分为训练集和验证集,且使用验证集衡量训练期间的进度,在计算有关数据批次的模型损失时调用optimizer.minimize()等各项操作,用法如下所示。
model.fit(xData,yData,{batchSize:20,epochs:5,});
用Core API创建的模型则需要用户自行遍历所有的批处理数,在每个批处理内,循环遍历所有批次数据,在每个批次中,都会调用optimizer.minimize(),通过计算先前定义的变量梯度,实现最小化输出,并通过模型定义的损失函数计算预测值和真实值的损失。
3 油井压力实例预测
在准噶尔盆地南缘勘探井试油生产过程中,受到结蜡、含水、地层、产液量等因素影响,某勘探井的油管压力在相同生产制度下随着时间不斷变化,每天的数据有一定的波动性,需要采取线性回归的方式进行后期稳定生产的压力递减预测。收集某一制度下油井的上千条压力和时间数据,并将日期时间通过JavaScript内置函数Date()将日期处理转换为时长作为xData进行训练,该油井油压数据小于100 MPa,因此可将油压数据均除以100后进行归一化处理,并作为yData进行训练,以便在训练过程中数据具有更好的收敛性。
4 结 语
本文提出了一种基于TensorFlow.js前端机器学习进行油压压力预测的方法,该方法通过建立浅神经网络模型,对历史数据进行直线线性回归拟合,对未来的压力变化进行可靠预测。利用TensorFlow.js建立多层神经网络模型,如Layers模型进行数据回归分类,油气井压裂后实现产能预测;卷积神经网络模型训练图像进行抽油机示功图的智能识别等,在油气田开发领域具有巨大的应用空间。
主要参考文献
[1]J Schmidhuber.Deep Learning in Neural Networks:An Overview
[J].Neural Networks,2015,61:85-117.
[2]王全,梁敬文.基于TensorFlow的交通标志识别方法研究[J].价值工程,2019(27):204-206.
[3]刘巍,刘威,谷建伟.基于机器学习方法的油井日产油量预测[J].石油钻采工艺,2020(1):70-75.
[4]彭岩,王万森,王旭仁,等.基于机器学习的风险预测方法研究[J].计算机科学,2009(4):205-207.
[5]段泽英,肖春林,游莉,等.基于油田生产数据的油井生产趋势预测方法研究[C]//2013数字与智能油气田(国际)会议暨展会论文集,2013.
[6]游莉,肖春林,段泽英,等.基于油田生产数据的油井产量趋势预测方法研究[J].中国管理信息化,2014(4):58-62.