王鵬 徐小輝 肖萍 李淑 郭怡曉
[摘 要]近年來(lái),隨著人工智能技術(shù)的發(fā)展應(yīng)用,機(jī)器學(xué)習(xí)的框架及研究工具逐漸成熟。其中,TensorFlow.js是由Google的AI團(tuán)隊(duì)發(fā)布的一款基于硬件加速的JavaScript庫(kù),用于訓(xùn)練和部署機(jī)器學(xué)習(xí),用戶在瀏覽器端就可以利用應(yīng)用程序編程接口(Application Programming Interface,API)完成機(jī)器學(xué)習(xí)的基本任務(wù)。在油氣田開發(fā)領(lǐng)域中,產(chǎn)生的生產(chǎn)及分析數(shù)據(jù)具有數(shù)據(jù)量小、相關(guān)性強(qiáng)的特點(diǎn),在機(jī)器學(xué)習(xí)過(guò)程中,大部分業(yè)務(wù)通過(guò)瀏覽器就能進(jìn)行簡(jiǎn)單的數(shù)據(jù)線性回歸、分類、目標(biāo)識(shí)別、可視化等處理操作,具有簡(jiǎn)單、快速、易學(xué)等特點(diǎn)。文章以線性回歸模型為例,對(duì)探井試油過(guò)程中的油管壓力數(shù)據(jù)采用前端機(jī)器學(xué)習(xí)方法進(jìn)行線性回歸擬合,并實(shí)現(xiàn)壓力預(yù)測(cè)。
[關(guān)鍵詞]TensorFlow.js;前端機(jī)器學(xué)習(xí);線性回歸;壓力預(yù)測(cè)
doi:10.3969/j.issn.1673 - 0194.2020.24.047
[中圖分類號(hào)]F270.7;TM715[文獻(xiàn)標(biāo)識(shí)碼]A[文章編號(hào)]1673-0194(2020)24-0-02
0? ? ?引 言
油氣田開發(fā)領(lǐng)域建立了很多關(guān)系型數(shù)據(jù)庫(kù),在進(jìn)行探井或區(qū)塊業(yè)務(wù)分析過(guò)程中,實(shí)際使用的數(shù)據(jù)量并不大,不需要采用圖形處理器(Graphics Processing Unit,GPU)進(jìn)行加速學(xué)習(xí)運(yùn)算,在瀏覽器端就能營(yíng)造一個(gè)回歸、神經(jīng)網(wǎng)絡(luò)、長(zhǎng)短期記憶網(wǎng)絡(luò)(Long Short-Term Memory,LSTM)等模型的訓(xùn)練環(huán)境,讓用戶通過(guò)便捷的瀏覽器操作就能實(shí)現(xiàn)機(jī)器學(xué)習(xí)的整個(gè)過(guò)程,從而達(dá)到數(shù)據(jù)預(yù)測(cè)、分類、圖像識(shí)別等目的。
1? ? ?淺神經(jīng)網(wǎng)絡(luò)和直線線性回歸擬合
神經(jīng)網(wǎng)絡(luò)是機(jī)器學(xué)習(xí)中的一種模型,是一種模仿動(dòng)物神經(jīng)網(wǎng)絡(luò)行為特征,進(jìn)行分布式并行信息處理的算法數(shù)學(xué)模型。這種網(wǎng)絡(luò)依靠系統(tǒng)的復(fù)雜程度,通過(guò)調(diào)整內(nèi)部大量節(jié)點(diǎn)之間相互連接的關(guān)系,達(dá)到處理信息的目的。
淺神經(jīng)網(wǎng)絡(luò)只包含一到兩層隱藏層,如圖1所示,包括輸入層、隱藏層和輸出層。神經(jīng)元是神經(jīng)網(wǎng)絡(luò)中的原子單元,給定神經(jīng)元一個(gè)輸入x,它將得到對(duì)應(yīng)的輸出a,并將其作為下一層的輸入。一個(gè)神經(jīng)元可以認(rèn)為是以下兩部分的結(jié)合:第一部分根據(jù)輸入和權(quán)重計(jì)算得到Z;第二部分在Z上施加激活函數(shù)得到神經(jīng)元的最終輸出a。
直線線性回歸擬合是多項(xiàng)式曲線擬合的一個(gè)特例,即:一元一次多項(xiàng)式,由給定的一組數(shù)據(jù)點(diǎn)(xi,yi)去描繪直線y=w×x+b的近似圖像。直線擬合方法就是從給出的一大堆看上去雜亂無(wú)章的數(shù)據(jù)中找出規(guī)律,設(shè)法構(gòu)造一條直線,反映所給數(shù)據(jù)點(diǎn)的趨勢(shì),以消除所給數(shù)據(jù)的局部波動(dòng)。TensorFlow.js就是通過(guò)訓(xùn)練數(shù)據(jù),實(shí)現(xiàn)一元線性回歸模型訓(xùn)練,推測(cè)出線性回歸函數(shù)y=w×x+b中w和b的值,并通過(guò)驗(yàn)證數(shù)據(jù),驗(yàn)證得到的函數(shù)是否符合預(yù)期。
2? ? ?TensorFlow.js前端機(jī)器學(xué)習(xí)的過(guò)程及方法
2.1? ?構(gòu)建學(xué)習(xí)環(huán)境
在JavaScript項(xiàng)目中,TensorFlow.js的安裝方法有兩種:一種是通過(guò)script標(biāo)簽引入;另外一種是通過(guò)npm安裝。
方法1:只需將以下腳本包含在html文件的header中即可自動(dòng)加載最新版本的TensorFlow.js。其中,使用Script Tag如下。
方法2:使用yarn或npm將TensorFlow.js添加到您的項(xiàng)目中。注意:因?yàn)槭褂肊S2017語(yǔ)法(如import),所以此工作流程假定您使用打包程序/轉(zhuǎn)換程序?qū)⒋a轉(zhuǎn)換為瀏覽器可以理解的內(nèi)容。
yarn add @tensorflow/tfjs或npm install @tensorflow/tfjs
在js文件中輸入以下代碼:
import * as tf from '@tensorflow/tfjs';
2.2? ?準(zhǔn)備訓(xùn)練數(shù)據(jù)
訓(xùn)練數(shù)據(jù)的初始化如下,這里tx是所有點(diǎn)數(shù)據(jù)的x坐標(biāo),ty是所有點(diǎn)數(shù)據(jù)的y坐標(biāo)。
const train_x = tf.tensor1d(tx);
const train_y = tf.tensor1d(ty);
2.3? ?構(gòu)建一個(gè)模型
TensorFlow.js有兩種創(chuàng)建機(jī)器學(xué)習(xí)的方法。
2.3.1? ?用Layers API創(chuàng)建模型
通過(guò)tf.model()創(chuàng)建LayersModel,這個(gè)方式適用于單獨(dú)測(cè)試每一層并檢查它們的輸出。
可以通過(guò)model.layers使用模型中的每一層,用model.inputLayers和model.outputLayers調(diào)用輸入層和輸出層。使用LayersModels讓驗(yàn)證更方便:要求您定義輸入形狀,并用您定義的形狀驗(yàn)證您對(duì)模型的輸入。LayersModel會(huì)自動(dòng)計(jì)算模型中所有張量的形狀。知道張量的形狀后,模型可以自動(dòng)創(chuàng)建需要的參數(shù)。
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創(chuàng)建模型
用Core API創(chuàng)建的模型包含一系列函數(shù)。這些函數(shù)以一個(gè)或多個(gè)張量作為輸入,并輸出另一個(gè)張量??梢岳肅ore API定義的模型,創(chuàng)造自己的序列化方法。
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中,需要自己創(chuàng)建和初始化權(quán)重。每個(gè)權(quán)重都是一個(gè)Variable,TensorFlow.js會(huì)把Variable權(quán)重設(shè)為可訓(xùn)練張量??梢杂胻f.variable()創(chuàng)建Variable或把一個(gè)已存在的張量放到Variable中。
2.4? ?訓(xùn)練模型
一個(gè)訓(xùn)練好的模型將提供從輸入數(shù)據(jù)到所需輸出數(shù)據(jù)的準(zhǔn)確映射。訓(xùn)練包含以下4個(gè)步驟:獲取一批數(shù)據(jù)到模型、根據(jù)模型得出預(yù)測(cè)值、對(duì)比預(yù)測(cè)值與真實(shí)值、確定每個(gè)參數(shù)的變更值,以便后期模型將來(lái)可以更好地預(yù)測(cè)該批次。
用Layers API創(chuàng)建的模型在訓(xùn)練前必須先進(jìn)行編譯,編譯LayersModel通過(guò)調(diào)用model.compile()與提供的優(yōu)化器、損失函數(shù)、指標(biāo)等選項(xiàng),在編譯過(guò)程中,模型將進(jìn)行一些驗(yàn)證,以確保您選擇的選項(xiàng)彼此兼容,如下所示。
model.compile({optimizer:'sgd',loss: 'categoricalCrossentropy',metrics: ['accuracy']});
模型訓(xùn)練則通過(guò)調(diào)用model.fit()方法實(shí)現(xiàn),在后臺(tái)能自動(dòng)對(duì)大的數(shù)據(jù)張量進(jìn)行拆分調(diào)用,并將數(shù)據(jù)集分為訓(xùn)練集和驗(yàn)證集,且使用驗(yàn)證集衡量訓(xùn)練期間的進(jìn)度,在計(jì)算有關(guān)數(shù)據(jù)批次的模型損失時(shí)調(diào)用optimizer.minimize()等各項(xiàng)操作,用法如下所示。
model.fit(xData,yData,{batchSize:20,epochs:5,});
用Core API創(chuàng)建的模型則需要用戶自行遍歷所有的批處理數(shù),在每個(gè)批處理內(nèi),循環(huán)遍歷所有批次數(shù)據(jù),在每個(gè)批次中,都會(huì)調(diào)用optimizer.minimize(),通過(guò)計(jì)算先前定義的變量梯度,實(shí)現(xiàn)最小化輸出,并通過(guò)模型定義的損失函數(shù)計(jì)算預(yù)測(cè)值和真實(shí)值的損失。
3? ? ?油井壓力實(shí)例預(yù)測(cè)
在準(zhǔn)噶爾盆地南緣勘探井試油生產(chǎn)過(guò)程中,受到結(jié)蠟、含水、地層、產(chǎn)液量等因素影響,某勘探井的油管壓力在相同生產(chǎn)制度下隨著時(shí)間不斷變化,每天的數(shù)據(jù)有一定的波動(dòng)性,需要采取線性回歸的方式進(jìn)行后期穩(wěn)定生產(chǎn)的壓力遞減預(yù)測(cè)。收集某一制度下油井的上千條壓力和時(shí)間數(shù)據(jù),并將日期時(shí)間通過(guò)JavaScript內(nèi)置函數(shù)Date()將日期處理轉(zhuǎn)換為時(shí)長(zhǎng)作為xData進(jìn)行訓(xùn)練,該油井油壓數(shù)據(jù)小于100 MPa,因此可將油壓數(shù)據(jù)均除以100后進(jìn)行歸一化處理,并作為yData進(jìn)行訓(xùn)練,以便在訓(xùn)練過(guò)程中數(shù)據(jù)具有更好的收斂性。
4? ? 結(jié) 語(yǔ)
本文提出了一種基于TensorFlow.js前端機(jī)器學(xué)習(xí)進(jìn)行油壓壓力預(yù)測(cè)的方法,該方法通過(guò)建立淺神經(jīng)網(wǎng)絡(luò)模型,對(duì)歷史數(shù)據(jù)進(jìn)行直線線性回歸擬合,對(duì)未來(lái)的壓力變化進(jìn)行可靠預(yù)測(cè)。利用TensorFlow.js建立多層神經(jīng)網(wǎng)絡(luò)模型,如Layers模型進(jìn)行數(shù)據(jù)回歸分類,油氣井壓裂后實(shí)現(xiàn)產(chǎn)能預(yù)測(cè);卷積神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練圖像進(jìn)行抽油機(jī)示功圖的智能識(shí)別等,在油氣田開發(fā)領(lǐng)域具有巨大的應(yīng)用空間。
主要參考文獻(xiàn)
[1]J Schmidhuber.Deep Learning in Neural Networks:An Overview
[J].Neural Networks,2015,61:85-117.
[2]王全,梁敬文.基于TensorFlow的交通標(biāo)志識(shí)別方法研究[J].價(jià)值工程,2019(27):204-206.
[3]劉巍,劉威,谷建偉.基于機(jī)器學(xué)習(xí)方法的油井日產(chǎn)油量預(yù)測(cè)[J].石油鉆采工藝,2020(1):70-75.
[4]彭巖,王萬(wàn)森,王旭仁,等.基于機(jī)器學(xué)習(xí)的風(fēng)險(xiǎn)預(yù)測(cè)方法研究[J].計(jì)算機(jī)科學(xué),2009(4):205-207.
[5]段澤英,肖春林,游莉,等.基于油田生產(chǎn)數(shù)據(jù)的油井生產(chǎn)趨勢(shì)預(yù)測(cè)方法研究[C]//2013數(shù)字與智能油氣田(國(guó)際)會(huì)議暨展會(huì)論文集,2013.
[6]游莉,肖春林,段澤英,等.基于油田生產(chǎn)數(shù)據(jù)的油井產(chǎn)量趨勢(shì)預(yù)測(cè)方法研究[J].中國(guó)管理信息化,2014(4):58-62.