王鵬 徐小輝 肖萍 李淑 郭怡曉

[摘 要]近年來,隨著人工智能技術的發展應用,機器學習的框架及研究工具逐漸成熟。其中,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.