# 想請教學姐的幾個問題 學姐好, 我的研究後來也是學姐延續學姐的題目,謝謝學姐的發想,讓我有這個研究的題目。我目前遇上的瓶頸是沒辦法把iteration number降低,也難以將loss壓的更低。想請教學姐我該怎麼做來減少iteration number?嘗試減少loss這個方向正確嗎?或是我根本上有出了什麼錯?想請學姐給我一些建議。 > 資料來源是用fractional step method 寫的 lid driven cavity 程式每一個時間步的 $\nabla \cdot \mathbf{u^{**}}$ 以及 $p$ , $\Delta t=0.001$, timespan=0~1s,size=1000。(學姐的data set是不是比這個大上許多?想請問學姐是怎麼在自己的機器上面塞下這麼大的資料量?) 目前我依照不同的資料前處理訓練的model有兩種,分別是: $$ \hat{p}=model(\nabla \cdot \mathbf{u^{**}}) $$ 以及 $$ \delta \hat{p}=model(\delta (\nabla \cdot \mathbf{u^{**}})) $$ ## 第一種資料前處理訓練的模型 這個方法中,model input= $\nabla \cdot \mathbf{u^{**}}$, output= $p$。CNN比起FCN需要的iteration number比較少([結果](https://i.imgur.com/I8vWIvn.png)),但是需要的iteration number皆比 $p^n_{init}=p^{n-1}$ 還多。 ![](https://i.imgur.com/cEsaH4y.png =400x) 上圖的 From zero 是將 $p_{init}^n=0$ ,綠線是 $p_{init}^n=p^{n-1}$ ,藍線,灰線,以及黃線則是 $p_{init}^n=model(\mathbf{u^{**}})$,分別用了不同的 loss function。 > Supervised的loss function: $loss= MSE(\hat{p}, p)$ //用labelled data PINN-CNN的loss function: $loss= MSE(\nabla^2 \hat{p} \cdot \Delta t, \nabla \cdot \mathbf{u^{**}})$ //用unlabelled data+physics PINN w/ Data-CNN的loss function: $loss= MSE(\hat{p}, p) + MSE(\nabla^2 \hat{p} \cdot \Delta t, \nabla \cdot \mathbf{u^{**}})$ //用labelled data+physics PINN w/ Data-CNN 的表現稍比 Supervised 好,最差的是PINN-CNN。 > 加入的物理限制條件- **P**hysics INN: $$ \nabla \cdot \frac{\mathbf{u^{**}}}{\Delta t}= \nabla^2 p $$ ## 第二種資料前處理訓練的模型 這個方法中 model input= $\delta(\nabla \cdot \mathbf{u^{**}})$, output= $\delta p$,感覺是學姐論文中採取的方法(?)但我目前沒有用上VAE,只用了FCN與CNN,iteration number雖然有減少,但不見理想,我在想會不會是loss不夠低造成的?下方是我的一些結果: ![](https://i.imgur.com/e4qHyDH.png =400x) 上圖的藍線是將 $p_{init}^n=0$ ,綠線是$p_{init}^n=p^{n-1}$ ,紅線,灰線與黃線,則是 $p_{init}^n=p^{n-1}+model(\mathbf{u^{**}})$,分別用了不同的loss function。 > PINN-CNN的loss function: $loss= MSE(\nabla^2 \delta\hat{p} \cdot \Delta t \delta(\nabla \cdot \mathbf{u^{**}}))$ //用unlabelled data PINN w/ Data-CNN的loss function: $loss= MSE(\delta\hat{p}, \delta p) + MSE(\nabla^2 \delta \hat{p} \cdot \Delta t, \delta(\nabla \cdot \mathbf{u^{**}}))$ //用labelled data+physics 在不同的hyper-parameter之下表現,model的沒有明顯的差異。 > 加入的物理限制條件- **P**hysics INN: $$ \nabla \cdot \frac{\mathbf{u^{**, n}}}{\Delta t}= \nabla^2 p^n \\ \nabla \cdot \frac{\mathbf{u^{**, n+1}}}{\Delta t}= \nabla^2 p^{n+1} \\ \rightarrow \delta(\nabla \cdot \frac{\mathbf{u^{**}}}{\Delta t})= \delta(\nabla^2 p) \\ \rightarrow \frac{\delta(\nabla \cdot\mathbf{u^{**}})}{\Delta t}= \nabla^2 \delta p $$ ## 我所嘗試過壓低loss的方法 學姐我設置的訓練的停損點是`epoch=2000`,這邊是我程式的連結 [link](https://colab.research.google.com/drive/1ivLc0dLUIxdFpdJXeuZmkkhv4K930tXz),資料的位址是 [link](https://drive.google.com/drive/folders/1hqPgoIcYVIkhV_n3tMtCWsDfsfcyFykM?usp=sharing)。 ### 增加model complexity 前 ``` (Layout): ConvNet( (conv1): Conv2d(1, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (conv2): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (conv3): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (conv4): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (conv5): Conv2d(3, 1, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (fc1): Linear(in_features=6400, out_features=6400, bias=True) ) Activation functions: F.hardtanh(self.conv1(x), min_val=- 5.0, max_val=5.0) ``` 後 ``` (Layout): ConvNet( (conv1): Conv2d(1, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (conv2): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (conv3): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (conv4): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (conv5): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (conv6): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (conv7): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (conv8): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (conv9): Conv2d(3, 1, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (fc1): Linear(in_features=6400, out_features=6400, bias=True) ) Activation functions: F.hardtanh(self.conv1(x), min_val=- 5.0, max_val=5.0) ``` ### 改 activation function 前面的模型我activation function都是用`relu`,但後來想到`relu`會消除所有的負值,也許造成了影響,所以我嘗試用`softplus`, `leaky_relu`, `sigmoid`, 和 `tanh`,但都沒有改善問題,在`epoch=2,000`時的loss反而比較大。 ## 另一個問題 學姐因為前面的model我都讓他在 0~ 0.1 秒區間做測試,而這區間表現不理想,我於是想說是不是剛好loss小的區間是在 0.1~ 1 秒的區間,我讓其中一個model執行整比資料的區間,也就是 0~ 1 秒區間,但後面的表現反而更不理想,跟我印象中學姐訓練的模型表現相差甚遠,想請教學姐是否有什麼想法? ![](https://i.imgur.com/ZYx77s9.png =400x) ## Advice 2023-02-20 + 改動model | CNN、VAE、loss function、activation,效果改善都不大。因為單純的CNN沒法反映流場劇烈的變化,尤其是一開始的時間 | attempted + 從資料集下手 | + More data, RAM 讀不夠的話就別增加 `batch size` 就是了,`batch size=1`的例子也是有的([*link*](https://stackoverflow.com/a/71871933)) + 加入前面時間的壓力場 + Data augmentation + 改動聚焦範圍 | 前面的時間流場不太穩定且和之後的差異特大 所以如果要用原model,最好用之後的時間train 然後試試能否讓不同re之下 之後時間的iteration 縮小 + Forest | 多train幾個然後投票 + Pre-train model | 可以試試看用一些其他現有比較複雜的圖像辨識model | keyword: image recognition pretrained + 加Reinforment layer | 讓model根據data影響大小訓練 + 前後參數不平衡 ## Plan + 加入reinforcement layer試試看 + 重建 dataset,聚焦在後面的流場 +