01 什麼時候需要切割?
1.需要化整為零處理數據。
地震勘探數據常常有一個重要的特點就是數據量很大,大到直接對整個資料進行處理不太現實,而且計算效率也比較低。比如在深度學習的過程中,每個批次訓練一般都是用的小塊數據。各位聰明的同學肯定想到了一個方法,就是化整為零。在實際資料的處理過程中,我們常常需要把大塊數據切小,處理完之後再組合回去。
這類需求常常在使用深度學習模型預測的時候使用,一般流程是這樣的:即對于一個大工區的數據塊,先将數據拆分為小塊數據,然後分别使用神經網絡模型進行預測,再将預測結果組合回原數據尺寸,得到整體的預測效果。
2.生成訓練集數據。
搞深度學習的同學都知道我們需要準備訓練集,而且訓練集的數量一般都希望比較大,數據的形态希望比較豐富。如果每個訓練數據都手工準備,顯然太費時間。這個時候一個自動生成訓練數據的方案成為了剛需。
有一種比較高效的生成訓練數據集的流程是這樣的:一是生成或找一些形态豐富的大尺寸數據。二是使用程序将所有的大尺寸數據切割為小塊。三是對小塊進行尺度變換、翻轉等操作豐富形态。四是整合所有小塊形成訓練數據集。
切割和組合的思路聽起來很簡單,但是在實際操作過程中會遇到一些問題,比如怎樣切分小塊的數量保證是整數,怎樣實現小塊組合的邊緣能夠連續等等問題。下面我們将給大家講解用Python來做怎樣實現。還是以前面課程使用的數據為示範,分别給大家講解二維剖面和三維數據體的切割和組合的方法。
02 二維剖面切割和組合。
1.首先,我們考慮生成訓練集的場景。
假如我們找到了一個1000*1200的剖面數據,想生成10000個小塊數據,怎樣來操作呢?可以使用如下的程序:
這裡用datagenerator函數生成了小塊數據,其中參數的含義包括:
一是data_dir,程序将讀取指定文件夾裡面所有的地震數據來形成訓練集。
二是patch_size,指定切割的小塊尺寸。對于深度學習來說,一般小塊尺寸從32開始,不大于128。
三是stride,指移動的步長。
四是train_data_num,指想生成訓練小塊的數量。
五是aug_times,指定随機翻轉的次數。
六是scales,指定數據縮放的比例,可以指定很多個,程序将從中選擇。
七是verbose,顯示處理進度。
八是jump,指定随機跳躍地震道。
處理完之後,我們随機選幾個小塊看看啥樣,就可以發現小塊的形态是非常豐富的。
2.現在我們考慮為預測數據而進行的切割和組合。
比如我們的大塊數據尺寸是1000*1200,原始數據剖面看起來是這樣的:
現在想切割為40*40的小塊,可以這樣做:
這裡的參數需要指定輸入的數據源,輸入數據的尺寸,切割小塊的尺寸,切割标志1。slice2D函數将自動切割小塊數據。
這裡為了保障切割時不出錯,一定要注意(大塊-小塊)÷步長是整數。切割結果就是這樣的:
切割的小塊看起來是這樣的:
要将小塊組合回原始數據,程序這樣寫:
參數與切割的程序相比基本沒有區别,就是把标志指定為0。組合後的數據剖面看起來是這樣的:
與原數據剖面圖沒啥區别,證明了程序的可靠性。
03 三維剖面切割和組合。
三維體的切割和組合與二維剖面相比,基本原理都是不變的,區别就是複雜度增高,計算資源要求更高。
1.準備數據集的場景。
假如我們找的是一個200*500*500的數據體,要想生成1000個32*32*32的小數據體,程序可以這樣寫:
這段程序中關鍵的函數是datagenerator3D,有幾點要說明一下:
一是程序整體設計思路和datagenerator二維切割程序差不多,但是由于增加了一個維度,生成小塊數據耗費的時間和存儲空間都是指數倍上升,建議生成的小塊三維體數量不要太多。
二是在三維體的切割的計算程序中,維度計算,邏輯運算,尺度縮放等程序都要改造,這些部分與二維剖面計算程序還是有比較大的差别。
現在我們來看其中的一個小塊,是這樣的:
2. 預測數據的場景。
比如我們的三維數據體尺寸是200*500*500,我們指定inline為100來進行切片,二維剖面看起來是這樣的 :
現在想切割為30*30*30的小塊,可以這樣做:
參數的設置和二維數據體切割的方法差不多。但是由于多了一個維度,函數slice3D的内部程序進行了比較複雜的改動。
切割的小塊的一個剖面看起來是這樣的:
要将小塊組合回原始數據,程序這樣寫:
對于恢複的三維體,也看看inline為100的二維剖面。可以看到與原數據剖面圖沒啥區别,證明程序是比較可靠的。
今天的課程就到這裡。這節課給大家講解了在不同需求場景下,怎樣對二維和三維地震數據進行切割和組合,這些技巧在深度學習研究中非常有用。詳細程序可以聯系我獲取,歡迎關注我交流,再見。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!