-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
2616 lines (2613 loc) · 801 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>Physics-informed neural networks:Translation Part I</title>
<url>/2021/05/07/10.1016j.jcp.2018.10.045_a/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><p>原文地址:<a href="https://www.sciencedirect.com/science/article/pii/S0021999118307125">PINN:深度学习框架下求解含有非线性偏微分方程的正问题、反问题</a><br>doi:<a href="http://sci-hub.ren/10.1016/j.jcp.2018.10.045">10.1016/j.jcp.2018.10.045</a></p>
<h1 id="ABSTRACT"><a href="#ABSTRACT" class="headerlink" title="ABSTRACT"></a>ABSTRACT</h1><p>本文介绍了PINN(Physics-informed neural networks,物理信息神经网络),其能够在解决监督学习任务的同时遵守由一般的非线性偏微分方程描述的物理约束。在这项工作中,我们主要从数据驱动解和偏微分方程的数据驱动解两方面探讨。根据可用数据的性质和排列(nature and arrangement),我们设计了两种不同类型的算法,即连续时间模型和离散时间模型。第一类模型形成了一族数据高效(data-efficient)的时空函数逼近器(spatio-temporal function approximators),而后一类模型能以任意精度的隐式Runge-Kutta时间递推格式(with unlimited number of stages)。通过流体、量子力学、反应扩散系统和非线性浅水波的传播等一系列经典问题,证明了该框架的有效性。</p>
<h1 id="Introduction"><a href="#Introduction" class="headerlink" title="Introduction"></a>Introduction</h1><p>随着可用数据量和计算资源的爆炸式增长,机器学习与数据挖掘的最新成果在不同领域的应用产生了变革性影响,流入图像识别<sup id="fnref:1"><a href="#fn:1" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="A. Krizhevsky, I. Sutskever, G.E. Hinton, Imagenet classifification with deep convolutional neural networks, in: Advances in Neural Information Processing Systems, 2012, pp. 1097–1105.
">[1]</span></a></sup>、认知科学<sup id="fnref:2"><a href="#fn:2" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="B.M. Lake, R. Salakhutdinov, J.B. Tenenbaum, Human-level concept learning through probabilistic program induction, Science 350 (2015) 1332–1338.
">[2]</span></a></sup>、基因组学<sup id="fnref:3"><a href="#fn:3" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="B. Alipanahi, A. Delong, M.T. Weirauch, B.J. Frey, Predicting the sequence specifificities of DNA- and RNA-binding proteins by deep learning, Nat. Biotechnol. 33 (2015) 831–838.
">[3]</span></a></sup>等。然而,在分析复杂的物理、生物或工程系统的过程中,数据采集的成本往往过高,有时我们不得不使用有限的信息作出决策。在这种小数据环境下,绝大多数最先进的机器学习技术(如深度/卷积/递归神经网络)缺乏鲁棒性,无法保证收敛性。<br>乍一看,训练一个神经网络,使其能够从几个可能是高维的输入和输出中学习到非线性映射是非常幼稚的。在许多物理和生物系统建模相关的案例中,往往存在有大量的先验知识,而这些知识还没有应用于现有的机器学习中。假设它是控制系统随时间变化的动力学物理定律,或一些已经经过经验验证的规则或其他领域的专业知识,这些先验信息可以作为正则化约束,将解限制在可以接受的范围内(例如,在不可压缩流体中,舍弃任何违背质量守恒定律的不现实的流动解)。将这种结构化信息编码为学习算法会放大算法所看到的数据中的信息含量,使其能够快速地向正确方向收敛,并且即使只有少数训练数据也能获得较好的泛化性。<br>近期许多研究<sup id="fnref:4"><a href="#fn:4" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Raissi, P. Perdikaris, G.E. Karniadakis, Inferring solutions of differential equations using noisy multi-fifidelity data, J. Comput. Phys. 335 (2017) 736–746.
">[4]</span></a></sup><sup id="fnref:5"><a href="#fn:5" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Raissi, P. Perdikaris, G.E. Karniadakis, Machine learning of linear differential equations using Gaussian processes, J. Comput. Phys. 348 (2017) 683–693.
">[5]</span></a></sup><sup id="fnref:6"><a href="#fn:6" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="H. Owhadi, Bayesian numerical homogenization, Multiscale Model. Simul. 13 (2015) 812–828.
">[6]</span></a></sup>已经展示了如何利用结构化先验信息构建数据高效和物理可靠(physical-informed)的模型。这里,我们利用高斯过程回归(Gaussian Process Regression)<sup id="fnref:7"><a href="#fn:7" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="C.E. Rasmussen, C.K. Williams, Gaussian Processes for Machine Learning, vol. 1, MIT Press, Cambridge, 2006.
">[7]</span></a></sup>设计了一个适合于给定线性算子的函数表示,其能够准确推断解并为多个数学物理问题提供不精确的解。在推理和系统辨识的背景下,Raissi 等人<sup id="fnref:8"><a href="#fn:8" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Raissi, P. Perdikaris, G.E. Karniadakis, Numerical Gaussian processes for time-dependent and non-linear partial differential equations, 2017, arXiv: 1703.10230.
">[8]</span></a></sup><sup id="fnref:9"><a href="#fn:9" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Raissi, G.E. Karniadakis, Hidden physics models: machine learning of nonlinear partial differential equations, 2017, arXiv:1708.00588.
">[9]</span></a></sup>在后续研究中提出了非线性问题的推广。尽管高斯过程在编码先验信息时具有灵活性和数学优雅性,但其对非线性问题的处理有两个重要的限制。首先,在<sup id="fnref:8"><a href="#fn:8" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Raissi, P. Perdikaris, G.E. Karniadakis, Numerical Gaussian processes for time-dependent and non-linear partial differential equations, 2017, arXiv: 1703.10230.
">[8]</span></a></sup><sup id="fnref:9"><a href="#fn:9" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Raissi, G.E. Karniadakis, Hidden physics models: machine learning of nonlinear partial differential equations, 2017, arXiv:1708.00588.
">[9]</span></a></sup>中,作者必须在时间上对任何非线性项进行局部线性化,从而限制了所提出方法在离散时域的适用性,并损害了它们在强非线性状态下预测的准确性。其次,高斯过程回归的贝叶斯性质有一定的先验假设,这些假设可能限制模型的表达能力,并产生鲁棒性/脆性(robustness/brittleness)问题,特别是对于非线性问题的处理<sup id="fnref:10"><a href="#fn:10" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="H. Owhadi, C. Scovel, T. Sullivan, et al., Brittleness of Bayesian inference under fifinite information in a continuous world, Electron. J. Stat. 9 (2015) 1–79.
">[10]</span></a></sup>。</p>
<h1 id="Problem-setup"><a href="#Problem-setup" class="headerlink" title="Problem setup"></a>Problem setup</h1><p>在这项工作中,我们采取了一种不同的方法:利用深度神经网络和它们众所周知的作为普适函数逼近器的能力<sup id="fnref:11"><a href="#fn:11" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="K. Hornik, M. Stinchcombe, H. White, Multilayer feedforward networks are universal approximators, Neural Netw. 2 (1989) 359–366.
">[11]</span></a></sup>。在这种情况下,我们可以直接处理非线性问题,而无需任何先验假设,线性化,或局部时间递推。我们利用自动微分技术的最新发展<sup id="fnref:12"><a href="#fn:12" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="A.G. Baydin, B.A. Pearlmutter, A.A. Radul, J.M. Siskind, Automatic differentiation in machine learning: a survey, 2015, arXiv:1502.05767.
">[12]</span></a></sup>——这是科学计算中最有用但可能利用不足的技术之一——根据输入坐标和模型参数对神经网络进行微分,以获得物理可靠的神经网络。这类神经网络被约束为遵守任何对称性、不变性或守恒原理,这些原理源于控制观测数据的物理定律,如一般的时间相关和非线性偏微分方程所模拟的那样。这种简单而强大的结构使我们能够解决计算科学中的一大类问题,并引入了一种潜在的变革性技术,从而开发出新的数据高效和物理可靠的学习机,新的偏微分方程数值解算器,以及用于模型反演和系统辨识的数据驱动方法。<br>为此,我们的手稿分为两部分,旨在介绍我们在两大类问题背景下的发展:数据驱动的偏微分方程解和数据驱动的偏微分方程求解。论文相关的代码和数据集地址<a href="https://github%20.com%20/maziarraissi%20/PINNs">Github</a>。在这项工作中,我们只使用了相对简单的深度前馈神经网络结构,其具有双曲正切激活函数,并且没有额外的正则化(例如,L1/L2惩罚、Dropout等)。手稿中的每个数值例子都附有关于我们所采用的神经网络结构的详细讨论,以及关于其训练过程的详细信息(例如优化器、学习率等)。最后,附录A和附录B中提供了一系列全面的系统研究,旨在证明所提出方法的性能。<br>在这项工作中,我们考虑一般形式的参数化和非线性偏微分方程</p>
<script type="math/tex; mode=display">u_t+\mathcal{N}[u;\lambda]=0,x\in\Omega,t\in[0,T] \tag{1}</script><p>其中,$u(t, x)$表示隐式解(latent, hidden),$\mathcal{N}[·;\lambda]$为以$\lambda$为参数的非线性算子,$\Omega$为$\R^N$的子集。上述公式表示了数学物理中的一系列问题,包括守恒定律、扩散过程、平流-扩散-反应系统以及动力学方程等。本文以一维空间中的Burgers方程<sup id="fnref:13"><a href="#fn:13" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="C. Basdevant, M. Deville, P. Haldenwang, J. Lacroix, J. Ouazzani, R. Peyret, P. Orlandi, A. Patera, Spectral and fifinite difference solutions of the Burgers equation, Comput. Fluids 14 (1986) 23–41.
">[13]</span></a></sup>为例,其中$\mathcal{N}[u;\lambda]=\lambda_1uu_x-\lambda_2u_{xx}$、$\lambda=(\lambda_1,\lambda_2)$,下标表示对时间或空间的偏微分。考虑到系统的噪声测量,我们对以下两种情况下的解感兴趣:<br>1.给定模型参数$\lambda$,怎样描述系统的隐态$u(t, x)$;此类问题涉及到推理、滤波、平滑或者数据驱动的偏微分方程求解<sup id="fnref:4"><a href="#fn:4" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Raissi, P. Perdikaris, G.E. Karniadakis, Inferring solutions of differential equations using noisy multi-fifidelity data, J. Comput. Phys. 335 (2017) 736–746.
">[4]</span></a></sup><sup id="fnref:8"><a href="#fn:8" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Raissi, P. Perdikaris, G.E. Karniadakis, Numerical Gaussian processes for time-dependent and non-linear partial differential equations, 2017, arXiv: 1703.10230.
">[8]</span></a></sup></p>
<ol>
<li>模型参数$\lambda$为何值时能够最好地描述观测数据;第二类问题涉及到学习、系统识别、数据驱动的偏微分方程反问题<sup id="fnref:5"><a href="#fn:5" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Raissi, P. Perdikaris, G.E. Karniadakis, Machine learning of linear differential equations using Gaussian processes, J. Comput. Phys. 348 (2017) 683–693.
">[5]</span></a></sup><sup id="fnref:9"><a href="#fn:9" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Raissi, G.E. Karniadakis, Hidden physics models: machine learning of nonlinear partial differential equations, 2017, arXiv:1708.00588.
">[9]</span></a></sup><sup id="fnref:14"><a href="#fn:14" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="S.H. Rudy, S.L. Brunton, J.L. Proctor, J.N. Kutz, Data-driven discovery of partial differential equations, Sci. Adv. 3 (2017).
">[14]</span></a></sup>。<h1 id="3-Data-driven-solutions-of-partial-differential-equations"><a href="#3-Data-driven-solutions-of-partial-differential-equations" class="headerlink" title="3 Data-driven solutions of partial differential equations"></a>3 Data-driven solutions of partial differential equations</h1>首先我们来看如何利用数据驱动的方式计算偏微分方程的解:<script type="math/tex; mode=display">u_t+\mathcal{N}[u]=0,x\in\Omega,t\in[0,T] \tag{2}</script>其中,$u(t, x)$表示隐式解(latent, hidden),$\mathcal{N}[·;\lambda]$为以$\lambda$为参数的非线性算子,$\Omega$为$\R^N$的子集。在如下章节中,我们提出了两种不同的算法,分别命名连续时间模型和离散时间模型。分别通过不同的基准问题来突出它们的特性和性能。在我们研究的第二部分(下一节),我们将注意力转移到偏微分方程的数据驱动发现问题上<sup id="fnref:5"><a href="#fn:5" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Raissi, P. Perdikaris, G.E. Karniadakis, Machine learning of linear differential equations using Gaussian processes, J. Comput. Phys. 348 (2017) 683–693.
">[5]</span></a></sup><sup id="fnref:9"><a href="#fn:9" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Raissi, G.E. Karniadakis, Hidden physics models: machine learning of nonlinear partial differential equations, 2017, arXiv:1708.00588.
">[9]</span></a></sup><sup id="fnref:14"><a href="#fn:14" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="S.H. Rudy, S.L. Brunton, J.L. Proctor, J.N. Kutz, Data-driven discovery of partial differential equations, Sci. Adv. 3 (2017).
">[14]</span></a></sup>。<h2 id="3-1-连续时间模型"><a href="#3-1-连续时间模型" class="headerlink" title="3.1 连续时间模型"></a>3.1 连续时间模型</h2>我们定义$f(t, x)$由方程$2$左侧给出,即<script type="math/tex; mode=display">f:=u_t+\mathcal{N}[u] \tag{3}</script>然后用神经网络逼近$u(t, x)$。这个假设和方程$3$共同构成了一个PINN $f(t, x)$。该网络可通过链式求导法则[12],并且与网络表示$u(t, x)$具有相同的参数,尽管由于微分算子$N$的作用而具有不同的激活函数。神经网络$u(t, x)$和$f(t, x)$之间的共享参数可通过最小化均方误差(MSE)函数来学习。<script type="math/tex; mode=display">MSE = MSE_u+MSE_f\tag{4}</script>其中<script type="math/tex; mode=display">MSE_u=\frac{1}{N_u}\sum_{i=1}^{N_u} \mid u(t^i_u, x^u_i)-u^i \mid^2</script><script type="math/tex; mode=display">MSE_f=\frac{1}{N_f}\sum_{i=1}^{N_u} \mid f(t_f^i, x^f_i) \mid^2</script>这里,$\lbrace t_{u}^{i}, x_{u}^{i}, u^{i} \rbrace$表示$u(t, x)$的初始和边界训练数据,$\lbrace t_{f}^{i}, x_{f}^{i}\rbrace$表示$f(t, x)$的collocations points。损失函数$MSE_u$对应初始和边界数据,$MSE_f$在配置点的有限集合上加强了方程$2$所施加的结构(????)。尽管在以前的研究<sup id="fnref:15"><a href="#fn:15" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="I.E. Lagaris, A. Likas, D.I. Fotiadis, Artifificial neural networks for solving ordinary and partial differential equations, IEEE Trans. Neural Netw. 9 (1998) 987–1000.
">[15]</span></a></sup><sup id="fnref:16"><a href="#fn:16" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="D.C. Psichogios, L.H. Ungar, A hybrid neural network-fifirst principles approach to process modeling, AIChE J. 38 (1992) 1499–1511.
">[16]</span></a></sup>中已经探讨了使用物理定律约束神经网络的类似想法,但在这里我们使用现代计算工具重新讨论了它们,并将它们应用于与时间相关的非线性偏微分方程描述等更具挑战性的动力学问题中。<br>在这里,我们强调这一工作与文献中现有的机器学习在计算物理中的应用之间的重要区别。Wang等人<sup id="fnref:17"><a href="#fn:17" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="J.-X. Wang, J. Wu, J. Ling, G. Iaccarino, H. Xiao, A comprehensive physics-informed machine learning framework for predictive turbulence modeling, 2017, arXiv:1701.07102.
">[17]</span></a></sup>最近在湍流建模的背景下也使用了术语“物理信息机器学习”。<sup id="fnref:18"><a href="#fn:18" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="Y. Zhu, N. Zabaras, Bayesian deep convolutional encoder-decoder networks for surrogate modeling and uncertainty quantifification, 2018, arXiv:1801. 06879.
">[18]</span></a></sup><sup id="fnref:19"><a href="#fn:19" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="T. Hagge, P. Stinis, E. Yeung, A.M. Tartakovsky, Solving differential equations with unknown constitutive relations as recurrent neural networks, 2017, arXiv:1710.02242.
">[19]</span></a></sup><sup id="fnref:20"><a href="#fn:20" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="R. Tripathy, I. Bilionis, Deep UQ: learning deep neural network surrogate models for high dimensional uncertainty quantifification, 2018, arXiv:1802. 00850.
">[20]</span></a></sup><sup id="fnref:21"><a href="#fn:21" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="P.R. Vlachas, W. Byeon, Z.Y. Wan, T.P. Sapsis, P. Koumoutsakos, Data-driven forecasting of high-dimensional chaotic systems with long-short term memory networks, 2018, arXiv:1802.07486.
">[21]</span></a></sup><sup id="fnref:22"><a href="#fn:22" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="E.J. Parish, K. Duraisamy, A paradigm for data-driven predictive modeling using field inversion and machine learning, J. Comput. Phys. 305 (2016) 758–774.
">[22]</span></a></sup><sup id="fnref:23"><a href="#fn:23" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="K. Duraisamy, Z.J. Zhang, A.P. Singh, New approaches in turbulence and transition modeling using data-driven techniques, in: 53rd AIAA Aerospace Sciences Meeting, 2018, p. 1284.
">[23]</span></a></sup><sup id="fnref:24"><a href="#fn:24" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="J. Ling, A. Kurzawski, J. Templeton, Reynolds averaged turbulence modelling using deep neural networks with embedded invariance, J. Fluid Mech. 807 (2016) 155–166.
">[24]</span></a></sup><sup id="fnref:25"><a href="#fn:25" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="Z.J. Zhang, K. Duraisamy, Machine learning methods for data-driven turbulence modeling, in: 22nd AIAA Computational Fluid Dynamics Conference, 2015, p. 2460.
">[25]</span></a></sup><sup id="fnref:26"><a href="#fn:26" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Milano, P. Koumoutsakos, Neural network modeling for near wall turbulent flow, J. Comput. Phys. 182 (2002) 1–26.
">[26]</span></a></sup><sup id="fnref:27"><a href="#fn:27" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="P. Perdikaris, D. Venturi, G.E. Karniadakis, Multififidelity information fusion algorithms for high-dimensional systems and massive data sets, SIAM J. Sci. Comput. 38 (2016) B521–B538.
">[27]</span></a></sup><sup id="fnref:28"><a href="#fn:28" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="R. Rico-Martinez, J. Anderson, I. Kevrekidis, Continuous-time nonlinear signal processing: a neural network based approach for gray box identification, in: Neural Networks for Signal Processing IV. Proceedings of the 1994 IEEE Workshop, IEEE, 1994, pp. 596–605.
">[28]</span></a></sup><sup id="fnref:29"><a href="#fn:29" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="J. Ling, J. Templeton, Evaluation of machine learning algorithms for prediction of regions of high Reynolds averaged Navier Stokes uncertainty, Phys. Fluids 27 (2015) 085103.
">[29]</span></a></sup>等也使用了物理系统预测建模的机器学习方法。所有这些方法都使用机器学习算法,例如支持向量机、随机森林、高斯过程和前馈/卷积/递归神经网络,仅仅将这些算法作为“黑盒子”来使用,即只建立了模型但模型所代表的的物理含义不明。如上所述,本文工作旨在更进一步,为基础微分算子重新构造“定制”激活函数和“定制”损失函数。这使我们能够在理解和欣赏自动微分在深度学习领域中所起的关键作用的同时打开机器学习的黑匣子。一般来说,自动微分,特别是反向传播算法,是目前训练深度模型的主要方法,其通过对模型的参数(如权重和偏差)求导。在这里,我们与使用深度学习中完全相同的自动微分技术求取PINN相对于输入空间坐标和时间的导数,其中的物理过程由偏微分方程所描述。我们观察到,这种结构化方法引入了一种正则化机制,允许我们使用相对简单的前馈神经网络结构,并用少量数据对其进行训练。这个简单想法的有效性可能与Lin、Tegmark和Rolnick<sup id="fnref:30"><a href="#fn:30" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="H.W. Lin, M. Tegmark, D. Rolnick, Why does deep and cheap learning work so well? J. Stat. Phys. 168 (2017) 1223–1247.
">[30]</span></a></sup>提出的评论有关,并提出了许多有趣的问题,有待在未来的研究中定量解决。感谢<sup id="fnref:15"><a href="#fn:15" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="I.E. Lagaris, A. Likas, D.I. Fotiadis, Artifificial neural networks for solving ordinary and partial differential equations, IEEE Trans. Neural Netw. 9 (1998) 987–1000.
">[15]</span></a></sup><sup id="fnref:16"><a href="#fn:16" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="D.C. Psichogios, L.H. Ungar, A hybrid neural network-fifirst principles approach to process modeling, AIChE J. 38 (1992) 1499–1511.
">[16]</span></a></sup><sup id="fnref:31"><a href="#fn:31" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="R. Kondor, N-body networks: a covariant hierarchical neural network architecture for learning atomic potentials, 2018, arXiv:1803.01588.
">[31]</span></a></sup><sup id="fnref:32"><a href="#fn:32" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="R. Kondor, S. Trivedi, On the generalization of equivariance and convolution in neural networks to the action of compact groups, 2018, arXiv:1802. 03690.
">[32]</span></a></sup><sup id="fnref:33"><a href="#fn:33" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Hirn, S. Mallat, N. Poilvert, Wavelet scattering regression of quantum chemical energies, Multiscale Model. Simul. 15 (2017) 827–863.
">[33]</span></a></sup><sup id="fnref:34"><a href="#fn:34" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="S. Mallat, Understanding deep convolutional networks, Philos. Trans. R. Soc. A 374 (2016) 20150203.
">[34]</span></a></sup>等人为本文所提供的灵感。<br>在所有数据驱动求解偏微分方程的例子中,训练数据$N_u$的总数<br>相对较小(几百点到几千点),我们选择使用L-BFGS优化所有损失函数,L-BFGS是一种基于拟牛顿、全批次梯度的优化算法<sup id="fnref:35"><a href="#fn:35" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="D.C. Liu, J. Nocedal, On the limited memory BFGS method for large scale optimization, Math. Program. 45 (1989) 503–528.
">[35]</span></a></sup>。对于更大的数据集,如下一章节中讨论的数据驱动模型,可以使用随机梯度下降及其变种等计算效率更高的小批量优化算法<sup id="fnref:36"><a href="#fn:36" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="I. Goodfellow, Y. Bengio, A. Courville, Deep Learning, MIT Press, 2016.
">[36]</span></a></sup><sup id="fnref:37"><a href="#fn:37" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="D. Kingma, J. Ba, Adam: a method for stochastic optimization, 2014, arXiv:1412.6980.
">[37]</span></a></sup>。尽管理论上不能保证这个过程收敛到一个全局极小值,但我们的经验证据表明,如果给定的偏微分方程是适定的且其解是唯一的,在神经网络结构表达能力充分且有足够数量的配置点$N_f$的前提下我们的方法能够达到良好的预测精度。这一观察结果与方程$4$的均方误差损失所导致的优化景观密切相关,并定义了一个与深度学习的最新理论发展同步的研究开放问题<sup id="fnref:38"><a href="#fn:38" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="A. Choromanska, M. Henaff, M. Mathieu, G.B. Arous, Y. LeCun, The loss surfaces of multilayer networks, in: Artifificial Intelligence and Statistics, pp. 192–204.
">[38]</span></a></sup><sup id="fnref:39"><a href="#fn:39" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="R. Shwartz-Ziv, N. Tishby, Opening the black box of deep neural networks via information, 2017, arXiv:1703.00810.
">[39]</span></a></sup>。为此,我们将使用本文提供的一系列系统敏感性研究来测试所提出方法的稳健性(见附录A和B)。<h3 id="3-1-1-例子(Schrodinger-equation)"><a href="#3-1-1-例子(Schrodinger-equation)" class="headerlink" title="3.1.1 例子(Schrodinger equation)"></a>3.1.1 例子(Schrodinger equation)</h3>这个例子旨在强调我们的方法在处理周期性边界条件、复值解以及控制不同类型非线性偏微分方程中的能力。一维非线性薛定谔方程是研究量子力学系统的经典方程,包括非线性波在光纤和/或波导中的传播、玻色-爱因斯坦凝聚和等离子体波。在光学中,非线性项来源于给定材料的强度相关折射率效应。类似地,玻色-爱因斯坦凝聚的非线性项是N体系统的平均场相互作用的结果。非线性薛定谔方程和周期性边界条件由下式给出<script type="math/tex; mode=display">ih_t+0.5h_{xx}+\mid h \mid^{2}h=0, x\in[-5, 5], t\in[0, \pi/2] \tag{5}</script><script type="math/tex; mode=display">h(0, x)=2sech(x)</script><script type="math/tex; mode=display">h(t, -5)=h(t, 5)</script><script type="math/tex; mode=display">h_x(t, -5)=h_x(t, 5)</script>其中$h(t, x)$为复值解。我们定义$f(t, x)$由下式给出<script type="math/tex; mode=display">f:=ih_t+0.5h_{xx}+\mid h \mid^{2}h</script>然后在$h(t, x)$之前设置一个复值神经网络。事实上,如果将$u$和$v$分别表示$h$的实部和虚部,相当于建立了一个多输出神经网络$h(t, x)=[u(t, x) v(t, x)]$,这就形成了复值多输出PINN-$f(t, x)$。$h(t, x)$和$f(t, x)$的共享参数可以通过最小化如下目标函数来优化得到<script type="math/tex; mode=display">MSE = MSE_0+MSE_b+MSE_f\tag{6}</script><script type="math/tex; mode=display">MSE_0=\frac{1}{N_0}\sum_{i=1}^{N_0}\mid h(0, x_0^{i})-h_0^i\mid^2</script><script type="math/tex; mode=display">MSE_b=\frac{1}{N_b}\sum_{i=1}^{N_b}(\mid h^i( t_b^{i}, -5)-h^i(t_b^i, 5)\mid^2+\mid h^i_x(t^i_b, -5)-h^i_x(t^i_b, 5) \mid^2)</script><script type="math/tex; mode=display">MSE_f = \frac{1}{N_f}\sum_{i=1}^{N_f}\mid f(t_f^{i}, x^i_f)\mid^2</script>这里,$\lbrace x^i_0, h^i_0\rbrace_{i=1}^{N_0}$表示初始值,$\lbrace t_b^i \rbrace_{i=1}^{N_b}$表示边界上的collocation points,$\lbrace t_f^i, x_f^i \rbrace_{i=1}^{N_f}$表示$f(t, x)$上的collocation points。因此,$MSE_0$表示初始数据上的$loss$,$MSE_b$表示周期性边界条件,$MSE_f$为惩罚项,在collocation points上不满足薛定谔方程。<br>为了评估我们的方法的准确性,我们用传统的光谱方法模拟了方程$5$以创建高分辨率数据集。特别地,设初始状态$h(0,x)=2sech(x)$且假设周期性边界条件$h(t -5)=h(t, 5)$,$h_x(t, -5)=h_x(t, 5)$。使用Chebfun package<sup id="fnref:40"><a href="#fn:40" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="T.A. Driscoll, N. Hale, L.N. Trefethen, Chebfun Guide, 2014.
">[40]</span></a></sup>的pectral Fourier discretization with 256 modes和显式$Runge–Kutta$时间积分器以时间间隔$\Delta t=\pi/2·10^-6$对公式$5$积分到时间$t=\pi/2$。通过以上数据驱动设置,我们记录latent function $h(t,x)$在$t=0$时的测量值$\lbrace x^i_0, h^i_0 \rbrace_{i=1}^{N_0}$。特别地,训练集包含从高分辨率数据集中随机选取的$N_0=50$个数据点,以及$N_b=50$ 个配置点$\lbrace t^i_b \rbrace^{N_b}_{i=1}$以确保满足周期边界条件。此外,我们还假设$N_f=20,000$个随机采样配置点以确保方程$5$在解空间内。所有随机采样点的空间位置均通过空间填充Latin Hypercude 采样策略获得<sup id="fnref:41"><a href="#fn:41" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Stein, Large sample properties of simulations using Latin hypercube sampling, Technometrics 29 (1987) 143–151.
">[41]</span></a></sup>。<br>我们的最终目标是推断薛定谔方程$5$在整个时空域的解$h(t, x)$。我们选择使用深度为5、每层包含100个神经元以及激活函数为双曲正切的神经网络来表示latent function$h(t, x) = [u(t, x) v(t,x)]$。一般来说,神经网络应该具有足够的近似能力以满足$u(t, x)$的复杂性。尽管可以采用更系统的处理流程,如贝叶斯优化<sup id="fnref:42"><a href="#fn:42" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="J. Snoek, H. Larochelle, R.P. Adams, Practical bayesian optimization of machine learning algorithms, in: Advances in Neural Information Processing Systems, 2012, pp. 2951–2959.
">[42]</span></a></sup>,以微调神经网络的设计,但在缺乏理论误差/收敛估计的情况下,神经结构/训练过程和基本微分方程的复杂性之间的相互作用仍然不清楚。评估预测解的准确性的一个可行途径是采用贝叶斯方法并监测预测后验分布的方差,但这超出了目前工作的范围,这是今后的研究方向。<br>在这个例子中,我们的设置旨在强调所提出方法相对于过拟合问题的鲁棒性。具体来讲,公式$6$中的$MSE_f$这一项起到了正则化的作用,它对不满足方程$5$的解起到惩罚的作用。因此,在物理系统中经常遇到数据采集成本非常高的情况,而PINN可以采用小样本容量的数据集进行训练。图1总结了我们的实验结果。特别的,图1上图展示了预测的时空解$\mid h(t, x) \mid=\sqrt{u^2({t, x})+v^2({t, x})}$的幅值,以及初始和边界训练数据的位置。使用测试数据获得预测误差,实测$L_2$误差为$1.97·10^{-3}$。预测解的更详细评估如图1的底部图例所示。特别地,我们在$t=0.59,0.79,0.98$的不同时刻对精确解和预测解进行了比较。基于物理信息的神经网络只需要少量的初始数据,就可以准确地捕捉薛定谔方程复杂的非线性特性。<br>到目前为止,连续时间神经网络模型的一个潜在局限性是,为了在整个时空域中实施物理信息约束,需要使用大量的配置点$N_f$。尽管在一维和二维情况中没有太大问题,但它可能会在高维问题中出现问题,因为全局执行物理约束(例如上述偏微分方程)所需的配置点总数将呈指数增长。尽管可以在一定程度上利用稀疏网格或准蒙特卡罗采样方案来解决这一限制<sup id="fnref:43"><a href="#fn:43" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="H.-J. Bungartz, M. Griebel, Sparse grids, Acta Numer. 13 (2004) 147–269.
">[43]</span></a></sup><sup id="fnref:44"><a href="#fn:44" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="I.H. Sloan, H. Wo´zniakowski, When are quasi-Monte Carlo algorithms effiffifficient for high dimensional integrals? J. Complex. 14 (1998) 1–33.
">[44]</span></a></sup>,但在下一节中,我们提出了一种不同的方法,通过引入更结构化的神经网络表示,利用经典的$Runge-Kutta$时间递推方案来规避配置点的需要<sup id="fnref:45"><a href="#fn:45" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="A. Iserles, A First Course in the Numerical Analysis of Differential Equations, vol. 44, Cambridge University Press, 2009.
">[45]</span></a></sup>。<br><img src="/2021/05/07/10.1016j.jcp.2018.10.045_a/fig01.png" alt="fig01"><h2 id="3-2-离散时间模型"><a href="#3-2-离散时间模型" class="headerlink" title="3.2 离散时间模型"></a>3.2 离散时间模型</h2>对方程$2$应用$q$阶Runge-Kutta方法得到以下公式:<script type="math/tex; mode=display">\begin{align}
\notag
&u^{n+c_i}=u^n-\Delta t\sum_{j=1}^q a_ij\mathcal{N}[u^{n+c_j}], i=1,...,q, \\\\
\notag
&u^{n+1}=u^n-\Delta t \sum_{j=1}^q b_j \mathcal{N}[u^{n+c_j}].
\end{align}\tag 7</script></li>
</ol>
<p>其中,$u^{n+c_j}(x)=u(t^n+c_j\Delta t, x)$($j=1,…,q$)。这一通用格式封装了显式和隐式时间递推格式,该格式取决于参数${a_ij, b_j, c_j}$。公式$7$可以被等价地表示为:</p>
<script type="math/tex; mode=display">u^n=u^n_i, i=1,...,q,\\
u^n=u^n_{q+1} \tag{8}</script><p>其中:</p>
<script type="math/tex; mode=display">\begin{align}
\notag
&u^n_j:=u^{n+c_i}+\Delta t \sum^q_{j=1}a_ij \mathcal{N}[u^{n+c_j}], i=1,...,q \\\\
&u^n_{q+1}:=u^{n+1}+\Delta t \sum^q_{j=1}b_j \mathcal{N}[u^{n+c_j}]
\end{align}\tag{9}</script><p>我们将多输出神经网络置于以下公式之前</p>
<script type="math/tex; mode=display">[u^{n+c_1}(x),...,u^{n+c_q}(x), u^{n+1}(x)] \tag{10}</script><p>上述先验信息以及公式$9$共同构成了以$x$为输入、以公式$11$为输出的PINN:</p>
<script type="math/tex; mode=display">[u^n_1(x),...,u^n_q(x), u^{n}_{q+1}(x)] \tag{11}</script><h3 id="3-2-1-例子(Allen-Cahn方程)"><a href="#3-2-1-例子(Allen-Cahn方程)" class="headerlink" title="3.2.1 例子(Allen-Cahn方程)"></a>3.2.1 例子(Allen-Cahn方程)</h3><p>这个例子旨在强调以上提出的离散时间模型处理不同类型非线性偏微分方程的能力。为此,让我们考虑Allen-Cahn和周期边界条件</p>
<script type="math/tex; mode=display">u_t-0.0001u_{xx}+5u^3-5u=0, x\in [-1, 1], t \in[0, 1]</script><script type="math/tex; mode=display">u(0, x)=x^2cos(\pi x)</script><script type="math/tex; mode=display">u(t, -1)=u(t, 1) \tag{12}</script><script type="math/tex; mode=display">u_x(t, -1)=u_x(t,1)</script><p>Allen-Cahn方程是反散-扩散系统的著名方程。它描述了多组分合金体系的相分离过程,包括有序-无序转变。对于Allen-Cahn方程,公式$9$中的非线性算子为</p>
<script type="math/tex; mode=display">\mathcal{N}[u^{n+c_j}]=-0.0001u_{xx}^{n+c_j}+5(u^{n+c_j})^3-5u^{n+c_j}</script><p>公式$10$和$11$中的共享参数可通过最小化平方误差(公式$13$)学习来得到</p>
<script type="math/tex; mode=display">SSE=SSE_n+SSE_b</script><p>其中,</p>
<script type="math/tex; mode=display">SSE_n=\sum_{j=1}^{q+1} \sum_{i=1}^{N_n} \mid u_j^n(x^{n,i}-u^{n, i}) \mid ^2</script><script type="math/tex; mode=display">\begin{align}
\notag
SSE_b&=\sum_{i=1}^q\mid u^{n+c_i}(-1)-u^{n+c_i}(1)\mid ^2+
\mid u^{n+1}(-1)-u^{n+1}(1) \mid ^2 \\\\
\notag
&+\sum_{i=1}^q \mid u^{n+c_i}_x(-1)-u^{n+c_i}_x(1) \mid ^2 +
\mid u_x^{n+1}(-1)-u^{n+1}_x(1)\mid ^2.
\end{align}</script><p> $\lbrace x^{n, i}, u^{n, i}\rbrace _{i=1}^{N_n}$表示$t^n$时刻的数据。<br> 在经典的数值分析中,受显式格式的稳定性约束或隐式公式的计算复杂性约束,时间步长通常被限制为较小值。随着Runge–Kutta阶数$q$增加,这些限制变得更加严格,并且对于大多数实际问题,需要进行数千到数百万个时间步长以达到最终时间。与经典方法形成鲜明对比的是,这里我们可以使用隐式Runge–Kutta格式,其中包含任意阶数,需要额外付出的成本非常小。这使得我们能够在保证稳定性和高预测精度的同时采取非常大的时间步长,所以允许我们仅通过一次递推就完成整个时空域求解。<br> 在这个例子中,我们使用传统光谱法模拟$Allen-Cahn$方程得到了训练数据和测试数据。具体来讲,设初始条件为$u(0, x)=x^2cos(\pi x)$,周期性边界条件$u(t, -1)=u(t, 1)$和$u_x(t, -1)=u_x(t, 1)$,使用Chebfun包<sup id="fnref:40"><a href="#fn:40" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="T.A. Driscoll, N. Hale, L.N. Trefethen, Chebfun Guide, 2014.
">[40]</span></a></sup>以512modes的傅里叶光谱离散和四阶显式$Runge-Kutta$时间积分器($\Delta t=10^{-5}$)对公式$12$积分到$t=1.0$。<br>训练集包含$N_n=200$个从精确解中随机抽取的初始数据点,我们的目标是使用$\Delta t =0.8$的一次递推来预测$t=0.9$的解。为此,我们设计了一个包含4个隐藏层和每层200个神经元的PINN,输出则预测了101个感兴趣的数据,其中包含$q=100$的Runge-Kutta阶数$u^{n+c_i}(x), i=1,..,q$以及最终时刻的解$u^{n+1}_x$。该方案的理论误差估计预测了$O(\Delta t^{2q})$<sup id="fnref:45"><a href="#fn:45" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="A. Iserles, A First Course in the Numerical Analysis of Differential Equations, vol. 44, Cambridge University Press, 2009.
">[45]</span></a></sup>的时间误差累积,在我们的例子中,其转化为低于机器精度的误差,即,$\Delta ^{2q}=0.8200≈ 10^{−20}$。据我们所知,这是第一次使用这种高阶隐式$Runge-Kutta$格式。值得注意的是,从$t=0.1$的光滑初始数据出发,我们可以在一个时间步长内预测t=0.9的近似不连续解,其相对$L_2$误差为$6.99·10−3$,如图2所示。这种误差完全归因于神经网络逼近$u(t, x)$的能力,以及误差平方和允许对训练数据进行插值的程度。<br>控制离散时间算法性能的关键参数是龙格库塔算法的阶数$q$和时间步长$\Delta t$。正如我们在附录A和附录B中提供的系统研究中所证明的,低阶方法,例如对应于经典梯形规则的情况$q=1$,以及对应于四阶$Gauss–Legendre$方法的情况$q=2$,不能保留它们对大时间步长的预测精度,因此,需要将其拆分成多个小时间步长。另一方面,将$Runge–Kutta$阶数设置为32个甚至更高,允许我们采取非常大的时间步长,并在不牺牲预测准确性的情况下使用一次地推有效地解决问题。此外,该方法能够充分保证数值稳定性,因为隐式$Gauss–Legendre$是唯一一类无论阶数如何都保持A-stable的时间递推格式,因此非常适合于刚性问题<sup id="fnref:45"><a href="#fn:45" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="A. Iserles, A First Course in the Numerical Analysis of Differential Equations, vol. 44, Cambridge University Press, 2009.
">[45]</span></a></sup>。这些特性对于实现如此简单的算法来说是前所未有的,并且说明了我们离散时间方法的一个关键亮点。</p>
<span id="more"></span>
<p><details><summary>参考文献</summary></details></p>
<div id="footnotes"><hr><div id="footnotelist"><ol style="list-style: none; padding-left: 0; margin-left: 40px"><li id="fn:1"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">1.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">A. Krizhevsky, I. Sutskever, G.E. Hinton, Imagenet classifification with deep convolutional neural networks, in: Advances in Neural Information Processing Systems, 2012, pp. 1097–1105.<a href="#fnref:1" rev="footnote"> ↩</a></span></li><li id="fn:2"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">2.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">B.M. Lake, R. Salakhutdinov, J.B. Tenenbaum, Human-level concept learning through probabilistic program induction, Science 350 (2015) 1332–1338.<a href="#fnref:2" rev="footnote"> ↩</a></span></li><li id="fn:3"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">3.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">B. Alipanahi, A. Delong, M.T. Weirauch, B.J. Frey, Predicting the sequence specifificities of DNA- and RNA-binding proteins by deep learning, Nat. Biotechnol. 33 (2015) 831–838.<a href="#fnref:3" rev="footnote"> ↩</a></span></li><li id="fn:4"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">4.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Raissi, P. Perdikaris, G.E. Karniadakis, Inferring solutions of differential equations using noisy multi-fifidelity data, J. Comput. Phys. 335 (2017) 736–746.<a href="#fnref:4" rev="footnote"> ↩</a></span></li><li id="fn:5"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">5.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Raissi, P. Perdikaris, G.E. Karniadakis, Machine learning of linear differential equations using Gaussian processes, J. Comput. Phys. 348 (2017) 683–693.<a href="#fnref:5" rev="footnote"> ↩</a></span></li><li id="fn:6"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">6.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">H. Owhadi, Bayesian numerical homogenization, Multiscale Model. Simul. 13 (2015) 812–828.<a href="#fnref:6" rev="footnote"> ↩</a></span></li><li id="fn:7"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">7.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">C.E. Rasmussen, C.K. Williams, Gaussian Processes for Machine Learning, vol. 1, MIT Press, Cambridge, 2006.<a href="#fnref:7" rev="footnote"> ↩</a></span></li><li id="fn:8"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">8.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Raissi, P. Perdikaris, G.E. Karniadakis, Numerical Gaussian processes for time-dependent and non-linear partial differential equations, 2017, arXiv: 1703.10230.<a href="#fnref:8" rev="footnote"> ↩</a></span></li><li id="fn:9"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">9.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Raissi, G.E. Karniadakis, Hidden physics models: machine learning of nonlinear partial differential equations, 2017, arXiv:1708.00588.<a href="#fnref:9" rev="footnote"> ↩</a></span></li><li id="fn:10"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">10.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">H. Owhadi, C. Scovel, T. Sullivan, et al., Brittleness of Bayesian inference under fifinite information in a continuous world, Electron. J. Stat. 9 (2015) 1–79.<a href="#fnref:10" rev="footnote"> ↩</a></span></li><li id="fn:11"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">11.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">K. Hornik, M. Stinchcombe, H. White, Multilayer feedforward networks are universal approximators, Neural Netw. 2 (1989) 359–366.<a href="#fnref:11" rev="footnote"> ↩</a></span></li><li id="fn:12"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">12.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">A.G. Baydin, B.A. Pearlmutter, A.A. Radul, J.M. Siskind, Automatic differentiation in machine learning: a survey, 2015, arXiv:1502.05767.<a href="#fnref:12" rev="footnote"> ↩</a></span></li><li id="fn:13"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">13.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">C. Basdevant, M. Deville, P. Haldenwang, J. Lacroix, J. Ouazzani, R. Peyret, P. Orlandi, A. Patera, Spectral and fifinite difference solutions of the Burgers equation, Comput. Fluids 14 (1986) 23–41.<a href="#fnref:13" rev="footnote"> ↩</a></span></li><li id="fn:14"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">14.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">S.H. Rudy, S.L. Brunton, J.L. Proctor, J.N. Kutz, Data-driven discovery of partial differential equations, Sci. Adv. 3 (2017).<a href="#fnref:14" rev="footnote"> ↩</a></span></li><li id="fn:15"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">15.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">I.E. Lagaris, A. Likas, D.I. Fotiadis, Artifificial neural networks for solving ordinary and partial differential equations, IEEE Trans. Neural Netw. 9 (1998) 987–1000.<a href="#fnref:15" rev="footnote"> ↩</a></span></li><li id="fn:16"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">16.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">D.C. Psichogios, L.H. Ungar, A hybrid neural network-fifirst principles approach to process modeling, AIChE J. 38 (1992) 1499–1511.<a href="#fnref:16" rev="footnote"> ↩</a></span></li><li id="fn:17"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">17.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">J.-X. Wang, J. Wu, J. Ling, G. Iaccarino, H. Xiao, A comprehensive physics-informed machine learning framework for predictive turbulence modeling, 2017, arXiv:1701.07102.<a href="#fnref:17" rev="footnote"> ↩</a></span></li><li id="fn:18"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">18.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">Y. Zhu, N. Zabaras, Bayesian deep convolutional encoder-decoder networks for surrogate modeling and uncertainty quantifification, 2018, arXiv:1801. 06879.<a href="#fnref:18" rev="footnote"> ↩</a></span></li><li id="fn:19"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">19.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">T. Hagge, P. Stinis, E. Yeung, A.M. Tartakovsky, Solving differential equations with unknown constitutive relations as recurrent neural networks, 2017, arXiv:1710.02242.<a href="#fnref:19" rev="footnote"> ↩</a></span></li><li id="fn:20"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">20.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">R. Tripathy, I. Bilionis, Deep UQ: learning deep neural network surrogate models for high dimensional uncertainty quantifification, 2018, arXiv:1802. 00850.<a href="#fnref:20" rev="footnote"> ↩</a></span></li><li id="fn:21"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">21.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">P.R. Vlachas, W. Byeon, Z.Y. Wan, T.P. Sapsis, P. Koumoutsakos, Data-driven forecasting of high-dimensional chaotic systems with long-short term memory networks, 2018, arXiv:1802.07486.<a href="#fnref:21" rev="footnote"> ↩</a></span></li><li id="fn:22"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">22.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">E.J. Parish, K. Duraisamy, A paradigm for data-driven predictive modeling using field inversion and machine learning, J. Comput. Phys. 305 (2016) 758–774.<a href="#fnref:22" rev="footnote"> ↩</a></span></li><li id="fn:23"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">23.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">K. Duraisamy, Z.J. Zhang, A.P. Singh, New approaches in turbulence and transition modeling using data-driven techniques, in: 53rd AIAA Aerospace Sciences Meeting, 2018, p. 1284.<a href="#fnref:23" rev="footnote"> ↩</a></span></li><li id="fn:24"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">24.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">J. Ling, A. Kurzawski, J. Templeton, Reynolds averaged turbulence modelling using deep neural networks with embedded invariance, J. Fluid Mech. 807 (2016) 155–166.<a href="#fnref:24" rev="footnote"> ↩</a></span></li><li id="fn:25"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">25.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">Z.J. Zhang, K. Duraisamy, Machine learning methods for data-driven turbulence modeling, in: 22nd AIAA Computational Fluid Dynamics Conference, 2015, p. 2460.<a href="#fnref:25" rev="footnote"> ↩</a></span></li><li id="fn:26"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">26.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Milano, P. Koumoutsakos, Neural network modeling for near wall turbulent flow, J. Comput. Phys. 182 (2002) 1–26.<a href="#fnref:26" rev="footnote"> ↩</a></span></li><li id="fn:27"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">27.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">P. Perdikaris, D. Venturi, G.E. Karniadakis, Multififidelity information fusion algorithms for high-dimensional systems and massive data sets, SIAM J. Sci. Comput. 38 (2016) B521–B538.<a href="#fnref:27" rev="footnote"> ↩</a></span></li><li id="fn:28"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">28.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">R. Rico-Martinez, J. Anderson, I. Kevrekidis, Continuous-time nonlinear signal processing: a neural network based approach for gray box identification, in: Neural Networks for Signal Processing IV. Proceedings of the 1994 IEEE Workshop, IEEE, 1994, pp. 596–605.<a href="#fnref:28" rev="footnote"> ↩</a></span></li><li id="fn:29"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">29.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">J. Ling, J. Templeton, Evaluation of machine learning algorithms for prediction of regions of high Reynolds averaged Navier Stokes uncertainty, Phys. Fluids 27 (2015) 085103.<a href="#fnref:29" rev="footnote"> ↩</a></span></li><li id="fn:30"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">30.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">H.W. Lin, M. Tegmark, D. Rolnick, Why does deep and cheap learning work so well? J. Stat. Phys. 168 (2017) 1223–1247.<a href="#fnref:30" rev="footnote"> ↩</a></span></li><li id="fn:31"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">31.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">R. Kondor, N-body networks: a covariant hierarchical neural network architecture for learning atomic potentials, 2018, arXiv:1803.01588.<a href="#fnref:31" rev="footnote"> ↩</a></span></li><li id="fn:32"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">32.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">R. Kondor, S. Trivedi, On the generalization of equivariance and convolution in neural networks to the action of compact groups, 2018, arXiv:1802. 03690.<a href="#fnref:32" rev="footnote"> ↩</a></span></li><li id="fn:33"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">33.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Hirn, S. Mallat, N. Poilvert, Wavelet scattering regression of quantum chemical energies, Multiscale Model. Simul. 15 (2017) 827–863.<a href="#fnref:33" rev="footnote"> ↩</a></span></li><li id="fn:34"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">34.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">S. Mallat, Understanding deep convolutional networks, Philos. Trans. R. Soc. A 374 (2016) 20150203.<a href="#fnref:34" rev="footnote"> ↩</a></span></li><li id="fn:35"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">35.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">D.C. Liu, J. Nocedal, On the limited memory BFGS method for large scale optimization, Math. Program. 45 (1989) 503–528.<a href="#fnref:35" rev="footnote"> ↩</a></span></li><li id="fn:36"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">36.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">I. Goodfellow, Y. Bengio, A. Courville, Deep Learning, MIT Press, 2016.<a href="#fnref:36" rev="footnote"> ↩</a></span></li><li id="fn:37"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">37.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">D. Kingma, J. Ba, Adam: a method for stochastic optimization, 2014, arXiv:1412.6980.<a href="#fnref:37" rev="footnote"> ↩</a></span></li><li id="fn:38"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">38.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">A. Choromanska, M. Henaff, M. Mathieu, G.B. Arous, Y. LeCun, The loss surfaces of multilayer networks, in: Artifificial Intelligence and Statistics, pp. 192–204.<a href="#fnref:38" rev="footnote"> ↩</a></span></li><li id="fn:39"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">39.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">R. Shwartz-Ziv, N. Tishby, Opening the black box of deep neural networks via information, 2017, arXiv:1703.00810.<a href="#fnref:39" rev="footnote"> ↩</a></span></li><li id="fn:40"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">40.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">T.A. Driscoll, N. Hale, L.N. Trefethen, Chebfun Guide, 2014.<a href="#fnref:40" rev="footnote"> ↩</a></span></li><li id="fn:41"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">41.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Stein, Large sample properties of simulations using Latin hypercube sampling, Technometrics 29 (1987) 143–151.<a href="#fnref:41" rev="footnote"> ↩</a></span></li><li id="fn:42"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">42.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">J. Snoek, H. Larochelle, R.P. Adams, Practical bayesian optimization of machine learning algorithms, in: Advances in Neural Information Processing Systems, 2012, pp. 2951–2959.<a href="#fnref:42" rev="footnote"> ↩</a></span></li><li id="fn:43"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">43.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">H.-J. Bungartz, M. Griebel, Sparse grids, Acta Numer. 13 (2004) 147–269.<a href="#fnref:43" rev="footnote"> ↩</a></span></li><li id="fn:44"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">44.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">I.H. Sloan, H. Wo´zniakowski, When are quasi-Monte Carlo algorithms effiffifficient for high dimensional integrals? J. Complex. 14 (1998) 1–33.<a href="#fnref:44" rev="footnote"> ↩</a></span></li><li id="fn:45"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">45.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">A. Iserles, A First Course in the Numerical Analysis of Differential Equations, vol. 44, Cambridge University Press, 2009.<a href="#fnref:45" rev="footnote"> ↩</a></span></li><li id="fn:46"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">46.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">T. Von Kármán, Aerodynamics, vol. 9, McGraw-Hill, New York, 1963.<a href="#fnref:46" rev="footnote"> ↩</a></span></li><li id="fn:47"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">47.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">G. Karniadakis, S. Sherwin, Spectral/hp Element Methods for Computational Fluid Dynamics, Oxford University Press, 2013.<a href="#fnref:47" rev="footnote"> ↩</a></span></li><li id="fn:48"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">48.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">T. Dauxois, Fermi, Pasta, Ulam and a mysterious lady, 2008, arXiv:0801.1590.<a href="#fnref:48" rev="footnote"> ↩</a></span></li><li id="fn:49"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">49.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Abadi, A. Agarwal, P. Barham, E. Brevdo, Z. Chen, C. Citro, G.S. Corrado, A. Davis, J. Dean, M. Devin, et al., Tensorflow: large-scale machine learning on heterogeneous distributed systems, 2016, arXiv:1603.04467.<a href="#fnref:49" rev="footnote"> ↩</a></span></li><li id="fn:50"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">50.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">S.L. Brunton, J.L. Proctor, J.N. Kutz, Discovering governing equations from data by sparse identifification of nonlinear dynamical systems, Proc. Natl. Acad. Sci. 113 (2016) 3932–3937.<a href="#fnref:50" rev="footnote"> ↩</a></span></li></ol></div></div><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>文献翻译</category>
</categories>
<tags>
<tag>深度学习与计算地球物理</tag>
</tags>
</entry>
<entry>
<title>Physics-informed neural networks:Translation Part II</title>
<url>/2021/05/14/10.1016j.jcp.2018.10.045_b/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><p>原文地址:<a href="https://www.sciencedirect.com/science/article/pii/S0021999118307125">PINN:深度学习框架下求解含有非线性偏微分方程的正问题、反问题</a><br>doi:<a href="http://sci-hub.ren/10.1016/j.jcp.2018.10.045">10.1016/j.jcp.2018.10.045</a></p>
<h1 id="Data-driven-discovery-of-partial-differential-equations"><a href="#Data-driven-discovery-of-partial-differential-equations" class="headerlink" title="Data-driven discovery of partial differential equations"></a>Data-driven discovery of partial differential equations</h1><p>在我们研究的当前部分,我们将注意力转移到数据驱动的偏微分方程发现问题上<sup id="fnref:5"><a href="#fn:5" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Raissi, P. Perdikaris, G.E. Karniadakis, Machine learning of linear differential equations using Gaussian processes, J. Comput. Phys. 348 (2017) 683–693.
">[5]</span></a></sup><sup id="fnref:9"><a href="#fn:9" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Raissi, G.E. Karniadakis, Hidden physics models: machine learning of nonlinear partial differential equations, 2017, arXiv:1708.00588.
">[9]</span></a></sup><sup id="fnref:14"><a href="#fn:14" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="S.H. Rudy, S.L. Brunton, J.L. Proctor, J.N. Kutz, Data-driven discovery of partial differential equations, Sci. Adv. 3 (2017).
">[14]</span></a></sup>。在第$4.1$节和第$4.2$节中,我们提出了两种不同类型的算法,即连续时间模型和离散时间模型,并通过各种规范问题(canonical problems)的视角强调了它们的性质和性能。</p>
<h1 id="4-1-连续时间模型"><a href="#4-1-连续时间模型" class="headerlink" title="4.1 连续时间模型"></a>4.1 连续时间模型</h1><p>首先,让我们回忆方程$1$并和$3.1$节相类似定义$f(t,x)$由公式$1$左侧给定,即</p>
<script type="math/tex; mode=display">f:=u_t+\mathcal{N}[u:\lambda]\tag{14}</script><p>我们继续使用深度神经网络近似$u(t, x)$。此假设以及公式$14$构建了一个PINN。该网络可以通过使用自动微分来对方程的不同部分应用链式法则推导出来<sup id="fnref:12"><a href="#fn:12" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="A.G. Baydin, B.A. Pearlmutter, A.A. Radul, J.M. Siskind, Automatic differentiation in machine learning: a survey, 2015, arXiv:1502.05767.
">[12]</span></a></sup>。值得注意的是,微分算子$\lambda$的参数变为了PINN$f(t,x)$的参数。</p>
<h2 id="4-1-1-例子(Naiver-Stokes方程)"><a href="#4-1-1-例子(Naiver-Stokes方程)" class="headerlink" title="4.1.1 例子(Naiver-Stokes方程)"></a>4.1.1 例子(Naiver-Stokes方程)</h2><p>我们的下一个例子涉及到不可压缩流体流动的现实场景,由无处不在的Navier-Stokes方程所描述。Naiver-Stokes方程描述了许多具有科学和工程意义的物理现象。它们可以用来模拟天气、洋流、管道中的水流和机翼周围的气流。完整和简化的Navier-Stokes方程有助于飞机和汽车的设计、血液流动的研究、电站的设计、污染物扩散的分析以及许多其他应用。让我们考虑二维的Navier-Stokes方程:</p>
<script type="math/tex; mode=display">u_t+\lambda_1(uu_x+vu_y)=-p_x+\lambda_2(u_{xx}+u_{yy})</script><script type="math/tex; mode=display">v_t+\lambda_1(uv_x+uv_y)=-p_y+\lambda_2(v_{xx}+v_{yy}) \tag{15}</script><p>其中,$u(t, x, y)$表示速度场的$x$分量,$v(t, x, y)$表示速度场$y$分量,$p(t, x, y)$表示压力。$\lambda=(\lambda_1, \lambda_2)$为未知参数。通过在无散度函数集合中搜索$Naiver-Stokes$方程的解,即:</p>
<script type="math/tex; mode=display">u_x+v_y=0\tag{16}</script><p>这个额外的方程是描述流体质量守恒的不可压缩流体的连续性方程。我们假设</p>
<script type="math/tex; mode=display">u=\psi_y, v=-\psi_x</script><p>$\psi(t, x, y)$为隐函数。在此假设下,能够自动满足连续方程$16$。给定速度场的噪声测量</p>
<script type="math/tex; mode=display">\lbrace t^i, x^i, y^i, u^i, v^i\rbrace^N_{i=1}</script><p>我们希望学习到参数$\lambda$以及压力场$p(t, x, y)$。<br>定义$f(t, x, y)$和$g(t, x, y)$为:</p>
<script type="math/tex; mode=display">f:=u_t+\lambda_1(uu_x+vu_y)+p_x-\lambda_2(u_{xx}+u_{yy})</script><script type="math/tex; mode=display">g:=v_t+\lambda_1(uv_x+vv_y)+p_y-\lambda_2(v_{xx}+v_{yy})</script><p>然后使用有两个输出的神经网络近似$[\psi(t, x, y) p(t, x, y)]$。此先验假设以及公式$17$、$18$构成了PINN网络$[f(t, x, y) g(t, x, y)]$。$Navier-Stokes$算子的参数$\lambda$以及神经网络$[\psi(t, x, y), p(t, x, y)]$和$[f(t, x, y), g(t, x, y)]$的参数可以通过最小化均方误差函数$19$来训练得到。</p>
<script type="math/tex; mode=display">MSE:=\frac{1}{N} \sum_{i=1}^N(\mid u(t^i, x^i, y^i)-u^i \mid^2+\mid v(t^i, x^i, y^i)-v^i\mid^2) \\\\ +\frac{1}N \sum_{i=1}^N(\mid f(t^i, x^i, y^i)\mid^2+\mid g(t^i, x^i, y^i)\mid ^2) \tag{19}</script><p> 这里我们讨论不可压缩流体通过圆柱体的问题,aproblem known to exhibit rich dynamic behavior and transitions for different regimes of theReynolds number $Re=u_\infty D/v$。假设一个无量纲自由流体速度为$u_\infty=1$,圆柱直径$D=1$,运动黏度$v=0.01$,该系统呈现周期性稳态行为,其特征是圆柱wake中的不对称涡旋脱落模式,即$Karman vortex street$<sup id="fnref:46"><a href="#fn:46" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="T. Von Kármán, Aerodynamics, vol. 9, McGraw-Hill, New York, 1963.
">[46]</span></a></sup>。<br> 为生成针对该问题的高分辨率数据集,我们采用了光谱/hp元素求解器$NekTar$<sup id="fnref:47"><a href="#fn:47" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="G. Karniadakis, S. Sherwin, Spectral/hp Element Methods for Computational Fluid Dynamics, Oxford University Press, 2013.
">[47]</span></a></sup>。具体来说,将解空间在空间域离散为包含412个三角形元素的曲面细分,在每个元素中,解都被近似为十阶分层半正交$Jacobi$多项式展开式的线性组合。我们假设左边界有均匀的自由流体速度剖面,在圆柱体下游25直径处的右边界施加零压力流出条件,并在上下边界$[-15, 25]\times[-8, 8]$的区域添加周期边界条件。我们是用三阶刚性稳定方法对公式$15$进行积分,直到该系统达到周期稳定状态,如图3(a)所示。在接下来的内容中,与这个稳态解相对应的数据集的一小部分将被用于模型训练,而剩余数据则用于模型预测。为简单起见,我们选择将采样限制在圆柱体下游的矩形区域,如图3(a)所示。<br><img src="/2021/05/14/10.1016j.jcp.2018.10.045_b/fig03.png" alt="fig03"><br>给定动沿流向$u(t, x, y)$和横向$v(t, x , y)$速度分量上的散射和势噪声数据,我们的目标是确定未知参数$\lambda_1$和$\lambda_2$,并定性地、准确地重建圆柱wake中的整个压力场$p(t, x, y)$,该场只能被识别为常数。为此,我们随机从高分辨率数据中进行降采样来得到训练数据。为了突出我们的方法在散射和稀疏数据中的学习能力,我们选取了$N=5,000$。仅相当于图3(b)所示的可用数据总数1%的数据。此外,我们还绘制了模型训练后预测速度分量$u(t, x, y)$和$v(t, x, y)$的代表性快照。这里使用的神经网络包含9层,每层20个神经元。<br>此例子结果的总结如图4所示。我们发现,即使训练数据中有非常多的噪声,PINN依旧能够非常准确地确定未知参数$\lambda_1$、$\lambda_2$。具体来说,对于无噪声的训练数据,估计误差$\lambda_1$和$\lambda_2$分别为$0.078\%$和$4.67\%$。当训练数据中包含$1\%$的不相关高斯噪声时,预测仍然是鲁棒的,两系数的预测误差分别为$0.17\%$和$5.70\%$。<br>一个更有趣的结果来自于该网络在没有任何关于压力本身的训练数据的情况下对整个压力场$p(t, x, y)$的高精度定性预测能力。与精确压力场的对比如图4所示。精确压力场和预测压力场之间的大小差异是由不可压缩Navier–Stokes系统的本质所决定的,因为压力场只有在一个常数以内才可被识别。通过利用基础物理从辅助测量值中推断出感兴趣的连续变量值,这是PINN所提供的更强能力的表现,展示了它们在求解高维度反问题中的潜力。<br>到目前为止,我们均假设数据点在整个时空域中可用。在许多实际情况下,人们可能只能在不同的时刻观察系统。在下一节中,我们将介绍一种不同的方法,该方法仅使用两个数据快照来解决数据驱动的发现问题。我们将看到,通过利用经典的Runge-Kutta时间递推方案,人们可以构建离散时间的PINN,即使数据快照之间的时间间隔非常大,其也可以保持较高的预测精度。</p>
<h1 id="4-2-离散时间模型"><a href="#4-2-离散时间模型" class="headerlink" title="4.2 离散时间模型"></a>4.2 离散时间模型</h1><p>对公式$1$应用$q$阶Runge-Kutta方法得到以下公式</p>
<script type="math/tex; mode=display">u^{n+c_i}=u^n-\Delta t \sum_{j=1}^qa_ij \mathcal{N}[u^{n+c_j}; \lambda], i=1,...,q,</script><script type="math/tex; mode=display">u^{n+1}=u^{n}-\Delta t \sum_{j=1}^{q}b_j \mathcal{N}[u^{n+c_j};\lambda] \tag{20}</script><p>其中,$u^{n+c_j}(x)=u(t^n+c_j\Delta t, x)$是系统在$t^n+c_j$($j=1,…,q$)时刻的隐藏状态。该通用形式包含了显式和隐式的时间递推格式,该格式取决于参数$\lbrace {a_ij, b_j, c_j}\rbrace$的选取。公式$20$可等价为:</p>
<script type="math/tex; mode=display">u^n=u_i^n, i=1....,q,\\
u^{n+1}=u_i^{n+1},i=1,...,q \tag{21}</script><p>其中</p>
<script type="math/tex; mode=display">u_i^n:=u^{n+c_i}+\Delta t \sum_{j=1}^{q}a_{ij}\mathcal{N}[c^{n+c_j};\lambda],i=1,...,q,</script><script type="math/tex; mode=display">u_i^{n+1}:=u^{n+c_i}+\Delta t \sum_{j=1}^{q}(a_ij-b_j) \mathcal{N}[u^{n+c_j};\lambda], i=1,...,q \tag{22}</script><p>将多输出神经网络置于</p>
<script type="math/tex; mode=display">[u^{n+c_1}(x),...,u^{n+c_q}(x)] \tag{23}</script><p>之前,<br>先验假设以及公式$22$形成了两个PINN:</p>
<script type="math/tex; mode=display">[u_1^n(x),...,u_q^n(x), u_{q+1}^n(x)] \tag{24}</script><p>以及</p>
<script type="math/tex; mode=display">[u_1^{n+1}(x),...,u_q^{n+1}(x),u_{q+1}^{n+1}(x)] \tag{25}</script><p>给定两个不同时刻$t^n$和$t^{n+1}$的时间切片$\lbrace x^n, u^n \rbrace$和$\lbrace x^{n+1}, u^{n+1} \rbrace$,神经网络$23$、$24$和$25$的共享参数以及微分算子的参数$\lambda$可以通过最小化平方误差$26$得到。</p>
<script type="math/tex; mode=display">SSE=SSE_n+SSE_n+1 \tag{26}</script><p>其中</p>
<script type="math/tex; mode=display">SSE_n:=\sum_{j=1}^q \sum_{i=1}^{N_n} \mid u_j^n(x^{n, i})-u^{n, i}\mid^2</script><script type="math/tex; mode=display">SSE_{n+1}:=\sum_{j=1}^n \sum_{i=1}^{N_{n+1}} \mid u_j^{n+1}(x^{n+1,i}-u^{n+1,i})\mid ^2</script><script type="math/tex; mode=display">x^n=\lbrace x^{n,i} \rbrace _{i=1}^{N_n}, u^n=\lbrace u^{n, i} \rbrace _{i=1}^{N_n}</script><h3 id="4-2-1-例子"><a href="#4-2-1-例子" class="headerlink" title="4.2.1 例子"></a>4.2.1 例子</h3><p>我们的最后一个例子旨在强调所提出的框架在处理涉及高阶导数的偏微分方程的能力。这里,我们考虑浅水表面上波浪的数学模型;$Korteweg–de Vries(KdV)$方程。这个方程也可以看作是带有dispersive项的Burgers方程。KdV方程与物理问题有几方面联系:它描述了长一维波在许多物理环境中的演化。这种物理环境包括具有弱非线性恢复力的浅水波、密度分层海洋中的长内波(long internal waves)、等离子体中的离子声波和晶格上的声波。此外,$KdV$方程是连续极限下$Fermi-Pasta-Ulam$问题<sup id="fnref:48"><a href="#fn:48" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="T. Dauxois, Fermi, Pasta, Ulam and a mysterious lady, 2008, arXiv:0801.1590.
">[48]</span></a></sup>中弦的控制方程。$KdV$公式如下:</p>
<script type="math/tex; mode=display">u_t+\lambda_1uu_x+\lambda_2u_{xxx} = 0 \tag{27}</script><p>$(\lambda_1, \lambda_2)$为未知参数。对于KdV方程,公式$22$中的非线性算子由以下公式给定:</p>
<script type="math/tex; mode=display">\mathcal{N}[u^{n+c_j}]=\lambda_1 u^{n+c_j}u_x^{n+c_j}-\lambda_2u_{xxx}^{n+c_j}</script><p>公式$23$、$24$、$25$的共享参数以及KdV方程的参数$\lambda=(\lambda_1, \lambda_2)$可以通过最小化平方误差公式$26$得到。<br>我们通过使用传统谱方法模拟公式$27$来得到训练数据和测试数据。具体来讲,初始边界条件为$u(0, x)=cos(\pi x)$以及周期性边界条件,使用$Chebfun$包以512个modes的谱傅里叶离散以及四阶显式$Runge-Kutta$时间积分器以离散时间步长$\Delta t=10^{-6}$对公式$27$积分到$t=1.0$。利用该数据集,我们提取$t^n=0.2$和$t^{n+1}=0.8$的两个解的切片,并使用$N_n=199$和$N_{n+1}=201$对其进行随机降采样来生成训练集。然后我们利用这些数据来训练离散时间PINN,loss函数平方误差为$26$,优化器为L-BFGS<sup id="fnref:35"><a href="#fn:35" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="D.C. Liu, J. Nocedal, On the limited memory BFGS method for large scale optimization, Math. Program. 45 (1989) 503–528.
">[35]</span></a></sup>。网络架构包括4个隐藏层,每层有50个神经元,以及一个用于预测q阶Runge-Kutta解(即$u^{n+c_j}(x)$)的输出层($j=1,…,q$)其中,q是生成及其精度阶时间误差累积的经验值,其由以下公式决定:</p>
<script type="math/tex; mode=display">q=0.5log\epsilon /log(\Delta t)</script><p>该例子的时间步长为$\Delta t = 0.6$。<br>实验结果如图5所示。在顶部图例中,我们给出了精确解$u(t, x)$,以及用于训练的两个数据快照的位置。在中间的图例中给出了精确解和训练数据的更详细的概述。方程$27$的复杂非线性动力学是如何导致两个快照之间的解的形式存在显著差异的是需要我们注意的地方。尽管存在这些差异,并且两个训练快照之间存在较大的时间间隔,但是无论训练数据是否被噪声破坏,我们的方法都能够正确确定未知参数。具体来说,对于无噪声的训练数据,估计误差$\lambda_1$和$\lambda_2$分别为$0.023\%$和$0.006\%$,而训练数据中噪声为$1\%$的情况返回的误差分别为$0.057\%$和$0.017\%$。</p>
<span id="more"></span>
<p><details></details></p>
<summary>参考文献</summary>
<div id="footnotes"><hr><div id="footnotelist"><ol style="list-style: none; padding-left: 0; margin-left: 40px"><li id="fn:1"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">1.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">A. Krizhevsky, I. Sutskever, G.E. Hinton, Imagenet classifification with deep convolutional neural networks, in: Advances in Neural Information Processing Systems, 2012, pp. 1097–1105.<a href="#fnref:1" rev="footnote"> ↩</a></span></li><li id="fn:2"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">2.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">B.M. Lake, R. Salakhutdinov, J.B. Tenenbaum, Human-level concept learning through probabilistic program induction, Science 350 (2015) 1332–1338.<a href="#fnref:2" rev="footnote"> ↩</a></span></li><li id="fn:3"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">3.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">B. Alipanahi, A. Delong, M.T. Weirauch, B.J. Frey, Predicting the sequence specifificities of DNA- and RNA-binding proteins by deep learning, Nat. Biotechnol. 33 (2015) 831–838.<a href="#fnref:3" rev="footnote"> ↩</a></span></li><li id="fn:4"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">4.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Raissi, P. Perdikaris, G.E. Karniadakis, Inferring solutions of differential equations using noisy multi-fifidelity data, J. Comput. Phys. 335 (2017) 736–746.<a href="#fnref:4" rev="footnote"> ↩</a></span></li><li id="fn:5"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">5.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Raissi, P. Perdikaris, G.E. Karniadakis, Machine learning of linear differential equations using Gaussian processes, J. Comput. Phys. 348 (2017) 683–693.<a href="#fnref:5" rev="footnote"> ↩</a></span></li><li id="fn:6"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">6.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">H. Owhadi, Bayesian numerical homogenization, Multiscale Model. Simul. 13 (2015) 812–828.<a href="#fnref:6" rev="footnote"> ↩</a></span></li><li id="fn:7"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">7.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">C.E. Rasmussen, C.K. Williams, Gaussian Processes for Machine Learning, vol. 1, MIT Press, Cambridge, 2006.<a href="#fnref:7" rev="footnote"> ↩</a></span></li><li id="fn:8"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">8.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Raissi, P. Perdikaris, G.E. Karniadakis, Numerical Gaussian processes for time-dependent and non-linear partial differential equations, 2017, arXiv: 1703.10230.<a href="#fnref:8" rev="footnote"> ↩</a></span></li><li id="fn:9"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">9.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Raissi, G.E. Karniadakis, Hidden physics models: machine learning of nonlinear partial differential equations, 2017, arXiv:1708.00588.<a href="#fnref:9" rev="footnote"> ↩</a></span></li><li id="fn:10"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">10.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">H. Owhadi, C. Scovel, T. Sullivan, et al., Brittleness of Bayesian inference under fifinite information in a continuous world, Electron. J. Stat. 9 (2015) 1–79.<a href="#fnref:10" rev="footnote"> ↩</a></span></li><li id="fn:11"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">11.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">K. Hornik, M. Stinchcombe, H. White, Multilayer feedforward networks are universal approximators, Neural Netw. 2 (1989) 359–366.<a href="#fnref:11" rev="footnote"> ↩</a></span></li><li id="fn:12"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">12.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">A.G. Baydin, B.A. Pearlmutter, A.A. Radul, J.M. Siskind, Automatic differentiation in machine learning: a survey, 2015, arXiv:1502.05767.<a href="#fnref:12" rev="footnote"> ↩</a></span></li><li id="fn:13"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">13.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">C. Basdevant, M. Deville, P. Haldenwang, J. Lacroix, J. Ouazzani, R. Peyret, P. Orlandi, A. Patera, Spectral and fifinite difference solutions of the Burgers equation, Comput. Fluids 14 (1986) 23–41.<a href="#fnref:13" rev="footnote"> ↩</a></span></li><li id="fn:14"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">14.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">S.H. Rudy, S.L. Brunton, J.L. Proctor, J.N. Kutz, Data-driven discovery of partial differential equations, Sci. Adv. 3 (2017).<a href="#fnref:14" rev="footnote"> ↩</a></span></li><li id="fn:15"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">15.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">I.E. Lagaris, A. Likas, D.I. Fotiadis, Artifificial neural networks for solving ordinary and partial differential equations, IEEE Trans. Neural Netw. 9 (1998) 987–1000.<a href="#fnref:15" rev="footnote"> ↩</a></span></li><li id="fn:16"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">16.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">D.C. Psichogios, L.H. Ungar, A hybrid neural network-fifirst principles approach to process modeling, AIChE J. 38 (1992) 1499–1511.<a href="#fnref:16" rev="footnote"> ↩</a></span></li><li id="fn:17"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">17.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">J.-X. Wang, J. Wu, J. Ling, G. Iaccarino, H. Xiao, A comprehensive physics-informed machine learning framework for predictive turbulence modeling, 2017, arXiv:1701.07102.<a href="#fnref:17" rev="footnote"> ↩</a></span></li><li id="fn:18"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">18.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">Y. Zhu, N. Zabaras, Bayesian deep convolutional encoder-decoder networks for surrogate modeling and uncertainty quantifification, 2018, arXiv:1801. 06879.<a href="#fnref:18" rev="footnote"> ↩</a></span></li><li id="fn:19"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">19.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">T. Hagge, P. Stinis, E. Yeung, A.M. Tartakovsky, Solving differential equations with unknown constitutive relations as recurrent neural networks, 2017, arXiv:1710.02242.<a href="#fnref:19" rev="footnote"> ↩</a></span></li><li id="fn:20"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">20.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">R. Tripathy, I. Bilionis, Deep UQ: learning deep neural network surrogate models for high dimensional uncertainty quantifification, 2018, arXiv:1802. 00850.<a href="#fnref:20" rev="footnote"> ↩</a></span></li><li id="fn:21"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">21.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">P.R. Vlachas, W. Byeon, Z.Y. Wan, T.P. Sapsis, P. Koumoutsakos, Data-driven forecasting of high-dimensional chaotic systems with long-short term memory networks, 2018, arXiv:1802.07486.<a href="#fnref:21" rev="footnote"> ↩</a></span></li><li id="fn:22"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">22.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">E.J. Parish, K. Duraisamy, A paradigm for data-driven predictive modeling using field inversion and machine learning, J. Comput. Phys. 305 (2016) 758–774.<a href="#fnref:22" rev="footnote"> ↩</a></span></li><li id="fn:23"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">23.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">K. Duraisamy, Z.J. Zhang, A.P. Singh, New approaches in turbulence and transition modeling using data-driven techniques, in: 53rd AIAA Aerospace Sciences Meeting, 2018, p. 1284.<a href="#fnref:23" rev="footnote"> ↩</a></span></li><li id="fn:24"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">24.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">J. Ling, A. Kurzawski, J. Templeton, Reynolds averaged turbulence modelling using deep neural networks with embedded invariance, J. Fluid Mech. 807 (2016) 155–166.<a href="#fnref:24" rev="footnote"> ↩</a></span></li><li id="fn:25"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">25.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">Z.J. Zhang, K. Duraisamy, Machine learning methods for data-driven turbulence modeling, in: 22nd AIAA Computational Fluid Dynamics Conference, 2015, p. 2460.<a href="#fnref:25" rev="footnote"> ↩</a></span></li><li id="fn:26"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">26.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Milano, P. Koumoutsakos, Neural network modeling for near wall turbulent flow, J. Comput. Phys. 182 (2002) 1–26.<a href="#fnref:26" rev="footnote"> ↩</a></span></li><li id="fn:27"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">27.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">P. Perdikaris, D. Venturi, G.E. Karniadakis, Multififidelity information fusion algorithms for high-dimensional systems and massive data sets, SIAM J. Sci. Comput. 38 (2016) B521–B538.<a href="#fnref:27" rev="footnote"> ↩</a></span></li><li id="fn:28"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">28.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">R. Rico-Martinez, J. Anderson, I. Kevrekidis, Continuous-time nonlinear signal processing: a neural network based approach for gray box identification, in: Neural Networks for Signal Processing IV. Proceedings of the 1994 IEEE Workshop, IEEE, 1994, pp. 596–605.<a href="#fnref:28" rev="footnote"> ↩</a></span></li><li id="fn:29"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">29.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">J. Ling, J. Templeton, Evaluation of machine learning algorithms for prediction of regions of high Reynolds averaged Navier Stokes uncertainty, Phys. Fluids 27 (2015) 085103.<a href="#fnref:29" rev="footnote"> ↩</a></span></li><li id="fn:30"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">30.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">H.W. Lin, M. Tegmark, D. Rolnick, Why does deep and cheap learning work so well? J. Stat. Phys. 168 (2017) 1223–1247.<a href="#fnref:30" rev="footnote"> ↩</a></span></li><li id="fn:31"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">31.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">R. Kondor, N-body networks: a covariant hierarchical neural network architecture for learning atomic potentials, 2018, arXiv:1803.01588.<a href="#fnref:31" rev="footnote"> ↩</a></span></li><li id="fn:32"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">32.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">R. Kondor, S. Trivedi, On the generalization of equivariance and convolution in neural networks to the action of compact groups, 2018, arXiv:1802. 03690.<a href="#fnref:32" rev="footnote"> ↩</a></span></li><li id="fn:33"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">33.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Hirn, S. Mallat, N. Poilvert, Wavelet scattering regression of quantum chemical energies, Multiscale Model. Simul. 15 (2017) 827–863.<a href="#fnref:33" rev="footnote"> ↩</a></span></li><li id="fn:34"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">34.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">S. Mallat, Understanding deep convolutional networks, Philos. Trans. R. Soc. A 374 (2016) 20150203.<a href="#fnref:34" rev="footnote"> ↩</a></span></li><li id="fn:35"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">35.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">D.C. Liu, J. Nocedal, On the limited memory BFGS method for large scale optimization, Math. Program. 45 (1989) 503–528.<a href="#fnref:35" rev="footnote"> ↩</a></span></li><li id="fn:36"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">36.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">I. Goodfellow, Y. Bengio, A. Courville, Deep Learning, MIT Press, 2016.<a href="#fnref:36" rev="footnote"> ↩</a></span></li><li id="fn:37"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">37.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">D. Kingma, J. Ba, Adam: a method for stochastic optimization, 2014, arXiv:1412.6980.<a href="#fnref:37" rev="footnote"> ↩</a></span></li><li id="fn:38"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">38.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">A. Choromanska, M. Henaff, M. Mathieu, G.B. Arous, Y. LeCun, The loss surfaces of multilayer networks, in: Artifificial Intelligence and Statistics, pp. 192–204.<a href="#fnref:38" rev="footnote"> ↩</a></span></li><li id="fn:39"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">39.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">R. Shwartz-Ziv, N. Tishby, Opening the black box of deep neural networks via information, 2017, arXiv:1703.00810.<a href="#fnref:39" rev="footnote"> ↩</a></span></li><li id="fn:40"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">40.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">T.A. Driscoll, N. Hale, L.N. Trefethen, Chebfun Guide, 2014.<a href="#fnref:40" rev="footnote"> ↩</a></span></li><li id="fn:41"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">41.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Stein, Large sample properties of simulations using Latin hypercube sampling, Technometrics 29 (1987) 143–151.<a href="#fnref:41" rev="footnote"> ↩</a></span></li><li id="fn:42"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">42.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">J. Snoek, H. Larochelle, R.P. Adams, Practical bayesian optimization of machine learning algorithms, in: Advances in Neural Information Processing Systems, 2012, pp. 2951–2959.<a href="#fnref:42" rev="footnote"> ↩</a></span></li><li id="fn:43"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">43.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">H.-J. Bungartz, M. Griebel, Sparse grids, Acta Numer. 13 (2004) 147–269.<a href="#fnref:43" rev="footnote"> ↩</a></span></li><li id="fn:44"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">44.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">I.H. Sloan, H. Wo´zniakowski, When are quasi-Monte Carlo algorithms effiffifficient for high dimensional integrals? J. Complex. 14 (1998) 1–33.<a href="#fnref:44" rev="footnote"> ↩</a></span></li><li id="fn:45"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">45.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">A. Iserles, A First Course in the Numerical Analysis of Differential Equations, vol. 44, Cambridge University Press, 2009.<a href="#fnref:45" rev="footnote"> ↩</a></span></li><li id="fn:46"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">46.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">T. Von Kármán, Aerodynamics, vol. 9, McGraw-Hill, New York, 1963.<a href="#fnref:46" rev="footnote"> ↩</a></span></li><li id="fn:47"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">47.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">G. Karniadakis, S. Sherwin, Spectral/hp Element Methods for Computational Fluid Dynamics, Oxford University Press, 2013.<a href="#fnref:47" rev="footnote"> ↩</a></span></li><li id="fn:48"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">48.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">T. Dauxois, Fermi, Pasta, Ulam and a mysterious lady, 2008, arXiv:0801.1590.<a href="#fnref:48" rev="footnote"> ↩</a></span></li><li id="fn:49"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">49.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Abadi, A. Agarwal, P. Barham, E. Brevdo, Z. Chen, C. Citro, G.S. Corrado, A. Davis, J. Dean, M. Devin, et al., Tensorflow: large-scale machine learning on heterogeneous distributed systems, 2016, arXiv:1603.04467.<a href="#fnref:49" rev="footnote"> ↩</a></span></li><li id="fn:50"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">50.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">S.L. Brunton, J.L. Proctor, J.N. Kutz, Discovering governing equations from data by sparse identifification of nonlinear dynamical systems, Proc. Natl. Acad. Sci. 113 (2016) 3932–3937.<a href="#fnref:50" rev="footnote"> ↩</a></span></li></ol></div></div><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>文献翻译</category>
</categories>
<tags>
<tag>深度学习与计算地球物理</tag>
</tags>
</entry>
<entry>
<title>Wavelet Deep Neural Network for Stripe Noise Removal</title>
<url>/2021/05/21/10.1109ACCESS.2019.2908720/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><p>基于小波深度神经网络的条纹噪声去除<br>原文地址:<a href="https://ieeexplore.ieee.org/document/8678750/authors#authors">https://ieeexplore.ieee.org/document/8678750/authors#authors</a><br>doi:10.1109/ACCESS.2019.2908720</p>
<h1 id="ABSRTACT"><a href="#ABSRTACT" class="headerlink" title="ABSRTACT"></a>ABSRTACT</h1><p>在红外成像系统中,条纹噪声会严重影响图像质量。现有的去条纹算法在噪声抑制、细节保持和实时性等方面仍存在较大的困难,阻碍了其在光谱成像和信号处理领域的应用。为了解决这一问题,本文从变换域的角度提出了一种新颖的小波深层神经网络,它充分考虑了条纹噪声的固有特性和不同小波子带系数之间的互补信息,以较低的计算量准确估计噪声。此外,还定义了一种特殊的方向正则化器,使场景细节与条纹噪声分离更彻底,细节恢复更准确。大量的模拟和真实数据实验表明,本文提出的方法在定量和定性评价上都优于几种经典的去条带方法。</p>
<h1 id="INTRODUCTION"><a href="#INTRODUCTION" class="headerlink" title="INTRODUCTION"></a>INTRODUCTION</h1><p>红外图像在遥感、医学诊断、视觉跟踪、物联网传感等领域有着广泛的应用<sup id="fnref:1"><a href="#fn:1" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="A. Jara et al., ‘‘Joint de-blurring and nonuniformity correction method for infrared microscopy imaging,’’ Infr. Phys. Technol., vol. 90, pp. 199–206, May 2018.
">[1]</span></a></sup><sup id="fnref:2"><a href="#fn:2" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="Y. Cao and Y. Li, ‘‘Strip non-uniformity correction in uncooled long-wave infrared focal plane array based on noise source characterization,’’ Opt. Commun., vol. 339, pp. 236–242, Mar. 2015.
">[2]</span></a></sup><sup id="fnref:3"><a href="#fn:3" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="Y. Huang, C. He, H. Fang, and X. Wang, ‘‘Iteratively reweighted unidirectional variational model for stripe non-uniformity correction,’’ Infr. Phys. Technol., vol. 75, pp. 107–116, Mar. 2016.
">[3]</span></a></sup><sup id="fnref:4"><a href="#fn:4" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="C. Chen, X. Liu, H.-H. Chen, M. Li, and L. Zhao, ‘‘A rear-end collision risk evaluation and control scheme using a Bayesian network model,’’ IEEE Trans. Intell. Transp. Syst., vol. 20, no. 1, pp. 264–284, Jan. 2019.
">[4]</span></a></sup>。由于硬件制作工艺的限制,探测器对同一辐照度的光电响应可能不完全一致,导致观测结果上叠加了固定条纹噪声,严重降低了红外成像系统的灵敏度<sup id="fnref:5"><a href="#fn:5" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="R. Lai, G. Yue, and G. Zhang, ‘‘Total variation based neural network regression for nonuniformity correction of infrared images,’’ Symmetry, vol. 10, no. 5, p. 157, 2018.
">[5]</span></a></sup><sup id="fnref:6"><a href="#fn:6" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="R. Lai, J. Guan, Y. Yang, and A. Xiong, ‘‘Spatiotemporal adaptive nonuniformity correction based on BTV regularization,’’ IEEE Access, vol. 7, pp. 753–762, 2019.
">[6]</span></a></sup><sup id="fnref:7"><a href="#fn:7" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="K. Liang, C.Yang, L. Peng, and B. Zhou, ‘‘Nonuniformity correction based on focal plane array temperature in uncooled long-wave infrared cameras without a shutter,’’ Appl. Opt., vol. 56, no. 4, pp. 884–889, 2017.
">[7]</span></a></sup>。因此,在去除条纹噪声的同时保持真实场景的结构是非常关键的。条纹噪声衰减模型可以表示为</p>
<script type="math/tex; mode=display">y(i, j)=x(i, j)+n(i, j)</script><p>其中$y(i,j)$、$x(i, j)$和$n(i, j)$分别表示观测响应、理想响应和由位于$(i,j)$的探测器所产生的条纹状噪声。<br>近年来,基于不同框架的算法被提出用于条纹噪声去噪。大体可以将这些方法分为三种:(1)基于先验信息类方法;(2)基于统计学方法;(3)深度学习方法。<sup id="fnref:8"><a href="#fn:8" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="X. Jian, R. Lu, Q. Guo, and G.-P. Wang, ‘‘Single image non-uniformity correction using compressive sensing,’’ Infr. Phys. Technol., vol. 76, pp. 360–364, May 2016.
">[8]</span></a></sup><sup id="fnref:9"><a href="#fn:9" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="S. Rong, H. Zhou, D. Zhao, K. Cheng, K. Qian, and H. Qin, ‘‘Infrared fix pattern noise reduction method based on shearlet transform,’’ Infr. Phys. Technol., vol. 91, pp. 243–249, Jun. 2018.
">[9]</span></a></sup>基于先验信息方法,主要有块匹配(block-matching)和3D滤波(BM3D)<sup id="fnref:10"><a href="#fn:10" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="K. Dabov, A. Foi, and K. Egiazarian, ‘‘Video denoising by sparse 3D transform-domain collaborative filtering,’’ in Proc. Eur. Signal Process. Conf., Poznan, Poland, Sep. 2007, pp. 145–149.
">[10]</span></a></sup>、TV(Total variation)<sup id="fnref:11"><a href="#fn:11" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="L. I. Rudin, S. Osher, and E. Fatemi, ‘‘Nonlinear total variation based noise removal algorithms,’’ Phys. D, Nonlinear Phenomena, vol. 60, nos. 1–4, pp. 259–268, 1992.
">[11]</span></a></sup>,导向滤波(guided filter, GF)<sup id="fnref:12"><a href="#fn:12" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="K. He, J. Sun, and X. Tang, ‘‘Guided image filtering,’’ IEEE Trans. Pattern Anal. Mach. Intell., vol. 35, no. 6, pp. 1397–1409, Jun. 2013.
">[12]</span></a></sup>,$non-local means(NLM)$滤波<sup id="fnref:13"><a href="#fn:13" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="H. Li and C. Y. Suen, ‘‘A novel non-local means image denoising method based on grey theory,’’ Pattern Recognit., vol. 49, pp. 237–248, Jan. 2016.
VOLUME 7, 2019
">[13]</span></a></sup>以及低秩正则化<sup id="fnref:14"><a href="#fn:14" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="Y. Chang, L. Yan, T. Wu, and S. Zhong, ‘‘Remote sensing image stripe noise removal: From image decomposition perspective,’’ IEEE Trans. Geosci. Remote Sens., vol. 54, no. 12, pp. 7018–7031, Dec. 2016.
">[14]</span></a></sup>等,但是这些方法在消除条纹噪声时也会无差别地消除图片的细节信息,如此一来可能会在输出图片中产生假象。基于统计学的方法,例如$histogram equalization(MHE)$<sup id="fnref:15"><a href="#fn:15" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="Y. Tendero, J. Gilles, S. Landeau, and J. M. Morel, ‘‘Efficient single image non-uniformity correction algorithm,’’ Proc. SPIE, vol. 7834, Oct. 2010, Art. no. 78340E.
">[15]</span></a></sup>等,在相邻列中引入冗余信息来消除条纹噪声,这种方法只适用于较弱的条纹噪声。当前,基于深度学习的方法被广泛应用于图像处理领域,均表现出非凡的效果。Kuang等提出了三层条纹噪声消除卷积神经网络$SNRCNN$,直接将条纹去噪视为图像去噪和超分辨率<sup id="fnref:19"><a href="#fn:19" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="S. G. Chang, B. Yu, and M. Vetterli, ‘‘Adaptive wavelet thresholding for image denoising and compression,’’ IEEE Trans. Image Process., vol. 9, no. 9, pp. 1532–1546, Sep. 2000.
">[19]</span></a></sup>,但并没有考虑条纹噪声的具体特性,因此很难在去除条纹噪声的同时保留高频细节信息。为了消除这一限制,He等提出了具有更大感受野的$DLSNUC$模型来达到更好的消除效果<sup id="fnref:17"><a href="#fn:17" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="Z. He, Y. Cao, Y. Dong, J. Yang, Y. Cao, and C.-L. Tisse, ‘‘Single-imagebased nonuniformity correction of uncooled long-wave infrared detectors: A deep-learning approach,’’ Appl. Opt., vol. 57, no. 18, pp. D155–D164, 2018.
">[17]</span></a></sup>。Xiao等提出$ICSRN$,其将CNN中的局部信息和全局信息结合起来以更好地保留边缘信息。但是仍然很难处理强条纹噪声。总结来讲,现有的深度学习去条纹方法只提取了图像在时间域的信息而忽视了其在时频域的冗余信息,因此限制了条纹去噪算法的应用。<br>过去一段时期内,基于转换域的图像处理方法被广泛应用<sup id="fnref:19"><a href="#fn:19" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="S. G. Chang, B. Yu, and M. Vetterli, ‘‘Adaptive wavelet thresholding for image denoising and compression,’’ IEEE Trans. Image Process., vol. 9, no. 9, pp. 1532–1546, Sep. 2000.
">[19]</span></a></sup><sup id="fnref:20"><a href="#fn:20" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="A. L. da Cunha, J. Zhou, and M. N. Do, ‘‘The nonsubsampled contourlet transform: Theory, design, and applications,’’ IEEETrans. Image Process., vol. 15, no. 10, pp. 3089–3101, Oct. 2006.
">[20]</span></a></sup>。在此基础上,Huang等提出了超分辨率网络来预测图像在小波域的缺失细节信息<sup id="fnref:21"><a href="#fn:21" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="H. Huang, R. He, Z. Sun, and T. Tan, ‘‘Wavelet-SRNet: A wavelet-based CNN for multi-scale face super resolution,’’ in Proc. IEEE Conf. CVPR, Honolulu, HI, USA, Oct. 2017, pp. 1689–1697.
">[21]</span></a></sup>;Kang等利用$Contourlet$变换分析图像特征,在CT图像去噪方面取得了较好的效果<sup id="fnref:22"><a href="#fn:22" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="E. Kang, J. Min, and J. C. Ye, ‘‘A deep convolutional neural network using directional wavelets for low-dose X-ray CT reconstruction,’’ Med. Phys., vol. 44, no. 10, pp. e360–e375, 2017.
">[22]</span></a></sup>。受这些方法的启发,我们提出了基于小波的深度神经网络去除条纹噪声(SNRWDNN),其挖掘了图像在小波域的特征并且将多个频带的信息作为有效补充来更好的去除条纹噪声。本文主要创新点和贡献如下:</p>
<ol>
<li>引入小波域条纹去噪神经网络,其能够自适应的估计噪声强度和分布。</li>
<li>提出方向正则化器来避免模型产生不规则条纹噪声,并更好地恢复场景细节信息。</li>
<li>利用小波分解将输入图像变为一系列四分之一大小的系数,以提升计算效率并提升去噪效果。<br>本文其余部分组织结构如下:在Section2中,我们分析了条纹噪声在小波域的表现形式。Section3详细阐述了SNRWDNN的实现细节。为了更好地展示本文所提方法的效果,模拟数据和真实数据实验均用于分析(Section4)。Section5为结论。<h1 id="PROPERTY-ANALYSIS-OF-STRIPE-NOISE"><a href="#PROPERTY-ANALYSIS-OF-STRIPE-NOISE" class="headerlink" title="PROPERTY ANALYSIS OF STRIPE NOISE"></a>PROPERTY ANALYSIS OF STRIPE NOISE</h1><img src="/2021/05/21/10.1109ACCESS.2019.2908720/fig01.png" alt="fig01"><br>为了准确地估计图像中含有的条纹噪声,关键是要挖掘出条纹噪声分量的属性并使用合理的方式描述它们。如文献<sup id="fnref:23"><a href="#fn:23" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="Y. Chen, T.-Z. Huang, L.-J. Deng, X.-L. Zhao, and M. Wang, ‘‘Group sparsity based regularization model for remote sensing image stripe noise removal,’’ Neurocomputing, vol. 267, pp. 95–106, Dec. 2017.
">[23]</span></a></sup>中所述,条纹噪声具有明显的方向属性,这一属性有利于去噪过程中图像细节和噪声分量的分离。图1展示了含条纹噪声图像的水平梯度和垂向梯度。从结果中我们可以看出,条纹噪声明显存在于水平梯度中,并且严重影响着垂直方向的图像细节信息。与之相反的是,垂向梯度中的条纹噪声分量表现出较好的平滑性质,因此对图像细节影响不大。基于以上简单的分析,可以基于不同方向梯度信息来从含噪图像中去除条纹噪声并可能保留图像的结构信息。<br><img src="/2021/05/21/10.1109ACCESS.2019.2908720/fig02.png" alt="fig02"><br>$Harr$离散小波变换(HDWT)具有提取图像水平方向、垂直方向、对角方向高频信息、以及保留低频结构信息的能力。本文中,$HDWT$被用于提取条纹噪声的梯度信息并更彻底地从条纹噪声中区分场景细节信息。$HDWT$的结果如图2所示。可以明显看出条纹噪声在近似系数(cA)和水平系数(cH)中有明显的响应,与之相对应的,垂向系数(cV)和对角系数(cD)则主要描述了场景的细节信息。总结来讲,不同子频带的补充性信息有助于在去除条纹噪声的同时保留图像的细节信息。<h1 id="THE-PROPOSED-SRNWDNN-MODEL"><a href="#THE-PROPOSED-SRNWDNN-MODEL" class="headerlink" title="THE PROPOSED SRNWDNN MODEL"></a>THE PROPOSED SRNWDNN MODEL</h1>在这一章节中,我们将详细介绍提出的$SNRWDNN$模型结构,然后深入讨论所设计的方向损失函数对于保留图像纹理细节的重要性,最后给出训练策略。<h2 id="A-网络结构"><a href="#A-网络结构" class="headerlink" title="A.网络结构"></a>A.网络结构</h2><img src="/2021/05/21/10.1109ACCESS.2019.2908720/fig03.png" alt="fig03"><br>$SNRWDNN$网络结构如图3所示。与现有的基于深度学习的条纹噪声去除方法不同,我们将条带噪声去除视为小波域的变换系数预测问题。$SNRWDNN$方法包括三个步骤:$HDWT$、小波系数预测和$Haar$离散小波逆变换$IHDWT$。首先,利用$HDWT$得到反映条纹噪声固有特性的四个子带系数。然后将这些系数串联成一个输入张量,送入小波系数预测网络,估计条纹分量,然后将输入张量与估计的条纹分量跳转连接,进行噪声消除,产生去条纹系数。值得注意的是,级联操作融合了不同子带中的信息,并保持了它们之间的一致性。最后,利用$IHDWT$对估计系数进行反变换,重建空间域去噪后结果。通过这种策略,我们提出的网络可以利用条纹的方向特性来抑制噪声,同时减少细节损失。小波系数预测网络由M层具有残差连接的卷积层构成,其中所有卷积滤波器共享大小为$3 \times3$、$stride$为1的卷积核。另外,采用零填充的方法使每个特征映射与输入张量保持相同的大小。除了最后一层输出4通道条纹分量外,每个卷积层的核数被设置为64。此外,将前一卷积层的输出输入到校正线性单元(ReLU)激活函数中进行非线性映射。由于SNRWDNN的输入和输出非常相似,我们采用了残差学习方法,使训练更加稳定、快速和精确。小波分解中的下采样操作有效地扩大了感受野,有利于场景细节的恢复<sup id="fnref:25"><a href="#fn:25" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="H. Chen, X. He, L. Qing, S. Xiong, and T. Q. Nguyen, ‘‘DPW-SDNet: Dual pixel-wavelet domain deep CNNs for soft decoding of JPEG-compressed images,’’ presented at the IEEE Conf. CVPR, Salt Lake City, UT, USA, 2018.
">[25]</span></a></sup>,同时其减少了计算复杂性。此外,小波分解大大降低了计算复杂度。<h2 id="B-方向小波损失函数"><a href="#B-方向小波损失函数" class="headerlink" title="B.方向小波损失函数"></a>B.方向小波损失函数</h2>当前基于深度学习的铜像处理任务通常关注于最小化均方误差目标函数<sup id="fnref:26"><a href="#fn:26" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="C. Ledig et al., ‘‘Photo-realistic single image super-resolution using a generative adversarial network,’’ in Proc. IEEE Conf. CVPR, Honolulu, HI, USA, Jul. 2017, pp. 105–114.
">[26]</span></a></sup>。本文延续前人<sup id="fnref:21"><a href="#fn:21" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="H. Huang, R. He, Z. Sun, and T. Tan, ‘‘Wavelet-SRNet: A wavelet-based CNN for multi-scale face super resolution,’’ in Proc. IEEE Conf. CVPR, Honolulu, HI, USA, Oct. 2017, pp. 1689–1697.
">[21]</span></a></sup><sup id="fnref:25"><a href="#fn:25" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="H. Chen, X. He, L. Qing, S. Xiong, and T. Q. Nguyen, ‘‘DPW-SDNet: Dual pixel-wavelet domain deep CNNs for soft decoding of JPEG-compressed images,’’ presented at the IEEE Conf. CVPR, Salt Lake City, UT, USA, 2018.
">[25]</span></a></sup>工作,引入小波均方误差损失来处理小波域的条纹噪声去除任务。小波均方误差被定义为<script type="math/tex; mode=display">L_W=\mid\mid cA- \overline{cA} \mid\mid_2^2+\mid\mid cV- \overline{cV} \mid\mid+\mid\mid cH- \overline{cH} \mid\mid+\mid\mid cD- \overline{cD} \mid\mid \tag{2}</script>其中,$\mid\mid·\mid\mid_2^2$表示$L2$范数,$cA$,$cV$,$cH$,$cD$分别代表真实图像的近似系数、水平系数、垂向系数和对角系数,$\overline{cA}$,$\overline{cV}$,$\overline{cH}$,$\overline{cD}$,分别表示它们的预测值。<br>从局部角度看,单个条纹内的像素强度在较窄的范围内变化,这意味着条纹的沿条纹方向上具有良好的平滑性。为了更好地估计条纹噪声,我们通过最小化条纹相关子带中条纹分量方向的部分差异来描述其平滑程度<sup id="fnref:27"><a href="#fn:27" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="X. Liu, X. Lu, H. Shen, Q. Yuan, Y. Jiao, and L. Zhang, ‘‘Stripe noise separation and removal in remote sensing images by consideration of the global sparsity and local variational properties,’’ IEEE Trans. Geosci. Remote Sens., vol. 54, no. 5, pp. 3049–3060, May 2016.
">[27]</span></a></sup>。为此,构造方向化正则器<script type="math/tex; mode=display">L_D=\mid\mid \nabla S_{cA} \mid\mid_2^2+\mid\mid \nabla S_{cH}\mid\mid_2^2\tag{3}</script>其中$\nabla$代表沿条纹方向的偏微分算子。$S_{cA}$和$S_{cH}$表示$cA$和$cH$子带的条纹分量。<br>最后,所提出的方向小波损失函数为<script type="math/tex; mode=display">Loss = L_W+\lambda L_D \tag{4}</script>其中,$\lambda$为控制方向损失的常量。<span id="more"></span>
<details><summary>参考文献</summary><div id="footnotes"><hr><div id="footnotelist"><ol style="list-style: none; padding-left: 0; margin-left: 40px"><li id="fn:1"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">1.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">A. Jara et al., ‘‘Joint de-blurring and nonuniformity correction method for infrared microscopy imaging,’’ Infr. Phys. Technol., vol. 90, pp. 199–206, May 2018.<a href="#fnref:1" rev="footnote"> ↩</a></span></li><li id="fn:2"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">2.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">Y. Cao and Y. Li, ‘‘Strip non-uniformity correction in uncooled long-wave infrared focal plane array based on noise source characterization,’’ Opt. Commun., vol. 339, pp. 236–242, Mar. 2015.<a href="#fnref:2" rev="footnote"> ↩</a></span></li><li id="fn:3"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">3.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">Y. Huang, C. He, H. Fang, and X. Wang, ‘‘Iteratively reweighted unidirectional variational model for stripe non-uniformity correction,’’ Infr. Phys. Technol., vol. 75, pp. 107–116, Mar. 2016.<a href="#fnref:3" rev="footnote"> ↩</a></span></li><li id="fn:4"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">4.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">C. Chen, X. Liu, H.-H. Chen, M. Li, and L. Zhao, ‘‘A rear-end collision risk evaluation and control scheme using a Bayesian network model,’’ IEEE Trans. Intell. Transp. Syst., vol. 20, no. 1, pp. 264–284, Jan. 2019.<a href="#fnref:4" rev="footnote"> ↩</a></span></li><li id="fn:5"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">5.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">R. Lai, G. Yue, and G. Zhang, ‘‘Total variation based neural network regression for nonuniformity correction of infrared images,’’ Symmetry, vol. 10, no. 5, p. 157, 2018.<a href="#fnref:5" rev="footnote"> ↩</a></span></li><li id="fn:6"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">6.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">R. Lai, J. Guan, Y. Yang, and A. Xiong, ‘‘Spatiotemporal adaptive nonuniformity correction based on BTV regularization,’’ IEEE Access, vol. 7, pp. 753–762, 2019.<a href="#fnref:6" rev="footnote"> ↩</a></span></li><li id="fn:7"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">7.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">K. Liang, C.Yang, L. Peng, and B. Zhou, ‘‘Nonuniformity correction based on focal plane array temperature in uncooled long-wave infrared cameras without a shutter,’’ Appl. Opt., vol. 56, no. 4, pp. 884–889, 2017.<a href="#fnref:7" rev="footnote"> ↩</a></span></li><li id="fn:8"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">8.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">X. Jian, R. Lu, Q. Guo, and G.-P. Wang, ‘‘Single image non-uniformity correction using compressive sensing,’’ Infr. Phys. Technol., vol. 76, pp. 360–364, May 2016.<a href="#fnref:8" rev="footnote"> ↩</a></span></li><li id="fn:9"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">9.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">S. Rong, H. Zhou, D. Zhao, K. Cheng, K. Qian, and H. Qin, ‘‘Infrared fix pattern noise reduction method based on shearlet transform,’’ Infr. Phys. Technol., vol. 91, pp. 243–249, Jun. 2018.<a href="#fnref:9" rev="footnote"> ↩</a></span></li><li id="fn:10"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">10.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">K. Dabov, A. Foi, and K. Egiazarian, ‘‘Video denoising by sparse 3D transform-domain collaborative filtering,’’ in Proc. Eur. Signal Process. Conf., Poznan, Poland, Sep. 2007, pp. 145–149.<a href="#fnref:10" rev="footnote"> ↩</a></span></li><li id="fn:11"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">11.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">L. I. Rudin, S. Osher, and E. Fatemi, ‘‘Nonlinear total variation based noise removal algorithms,’’ Phys. D, Nonlinear Phenomena, vol. 60, nos. 1–4, pp. 259–268, 1992.<a href="#fnref:11" rev="footnote"> ↩</a></span></li><li id="fn:12"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">12.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">K. He, J. Sun, and X. Tang, ‘‘Guided image filtering,’’ IEEE Trans. Pattern Anal. Mach. Intell., vol. 35, no. 6, pp. 1397–1409, Jun. 2013.<a href="#fnref:12" rev="footnote"> ↩</a></span></li><li id="fn:13"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">13.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">H. Li and C. Y. Suen, ‘‘A novel non-local means image denoising method based on grey theory,’’ Pattern Recognit., vol. 49, pp. 237–248, Jan. 2016.
VOLUME 7, 2019<a href="#fnref:13" rev="footnote"> ↩</a></span></li><li id="fn:14"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">14.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">Y. Chang, L. Yan, T. Wu, and S. Zhong, ‘‘Remote sensing image stripe noise removal: From image decomposition perspective,’’ IEEE Trans. Geosci. Remote Sens., vol. 54, no. 12, pp. 7018–7031, Dec. 2016.<a href="#fnref:14" rev="footnote"> ↩</a></span></li><li id="fn:15"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">15.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">Y. Tendero, J. Gilles, S. Landeau, and J. M. Morel, ‘‘Efficient single image non-uniformity correction algorithm,’’ Proc. SPIE, vol. 7834, Oct. 2010, Art. no. 78340E.<a href="#fnref:15" rev="footnote"> ↩</a></span></li><li id="fn:16"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">16.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">X. Kuang, X. Sui, Q. Chen, and G. Gu, ‘‘Single infrared image stripe noise removal using deep convolutional networks,’’ IEEEPhoton. J., vol. 9, no. 4, Aug. 2017, Art. no. 3900913.<a href="#fnref:16" rev="footnote"> ↩</a></span></li><li id="fn:17"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">17.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">Z. He, Y. Cao, Y. Dong, J. Yang, Y. Cao, and C.-L. Tisse, ‘‘Single-imagebased nonuniformity correction of uncooled long-wave infrared detectors: A deep-learning approach,’’ Appl. Opt., vol. 57, no. 18, pp. D155–D164, 2018.<a href="#fnref:17" rev="footnote"> ↩</a></span></li><li id="fn:18"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">18.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">P. Xiao, Y. Guo, and P. Zhuang, ‘‘Removing stripe noise from infrared cloud images via deep convolutional networks,’’ IEEE Photon. J., vol. 10, no. 4, Aug. 2018, Art. no. 7801114.<a href="#fnref:18" rev="footnote"> ↩</a></span></li><li id="fn:19"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">19.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">S. G. Chang, B. Yu, and M. Vetterli, ‘‘Adaptive wavelet thresholding for image denoising and compression,’’ IEEE Trans. Image Process., vol. 9, no. 9, pp. 1532–1546, Sep. 2000.<a href="#fnref:19" rev="footnote"> ↩</a></span></li><li id="fn:20"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">20.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">A. L. da Cunha, J. Zhou, and M. N. Do, ‘‘The nonsubsampled contourlet transform: Theory, design, and applications,’’ IEEETrans. Image Process., vol. 15, no. 10, pp. 3089–3101, Oct. 2006.<a href="#fnref:20" rev="footnote"> ↩</a></span></li><li id="fn:21"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">21.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">H. Huang, R. He, Z. Sun, and T. Tan, ‘‘Wavelet-SRNet: A wavelet-based CNN for multi-scale face super resolution,’’ in Proc. IEEE Conf. CVPR, Honolulu, HI, USA, Oct. 2017, pp. 1689–1697.<a href="#fnref:21" rev="footnote"> ↩</a></span></li><li id="fn:22"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">22.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">E. Kang, J. Min, and J. C. Ye, ‘‘A deep convolutional neural network using directional wavelets for low-dose X-ray CT reconstruction,’’ Med. Phys., vol. 44, no. 10, pp. e360–e375, 2017.<a href="#fnref:22" rev="footnote"> ↩</a></span></li><li id="fn:23"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">23.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">Y. Chen, T.-Z. Huang, L.-J. Deng, X.-L. Zhao, and M. Wang, ‘‘Group sparsity based regularization model for remote sensing image stripe noise removal,’’ Neurocomputing, vol. 267, pp. 95–106, Dec. 2017.<a href="#fnref:23" rev="footnote"> ↩</a></span></li><li id="fn:24"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">24.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">B. L. Lai and L. W. Chang, ‘‘Adaptive data hiding for images based on harr discrete wavelet transform,’’ in Advances in Image and Video Technology (Lecture Notes in Computer Science), vol. 4319. Berlin, Germany: Springer, 2006, pp. 1085–1093.<a href="#fnref:24" rev="footnote"> ↩</a></span></li><li id="fn:25"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">25.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">H. Chen, X. He, L. Qing, S. Xiong, and T. Q. Nguyen, ‘‘DPW-SDNet: Dual pixel-wavelet domain deep CNNs for soft decoding of JPEG-compressed images,’’ presented at the IEEE Conf. CVPR, Salt Lake City, UT, USA, 2018.<a href="#fnref:25" rev="footnote"> ↩</a></span></li><li id="fn:26"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">26.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">C. Ledig et al., ‘‘Photo-realistic single image super-resolution using a generative adversarial network,’’ in Proc. IEEE Conf. CVPR, Honolulu, HI, USA, Jul. 2017, pp. 105–114.<a href="#fnref:26" rev="footnote"> ↩</a></span></li><li id="fn:27"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">27.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">X. Liu, X. Lu, H. Shen, Q. Yuan, Y. Jiao, and L. Zhang, ‘‘Stripe noise separation and removal in remote sensing images by consideration of the global sparsity and local variational properties,’’ IEEE Trans. Geosci. Remote Sens., vol. 54, no. 5, pp. 3049–3060, May 2016.<a href="#fnref:27" rev="footnote"> ↩</a></span></li><li id="fn:28"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">28.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">W. Luo, J. Li, W. Xu, and J. Yang, ‘‘Learning sparse features in convolutional neural networks for image classification,’’ in Proc. Int. Conf. Intell. Sci. Big Data Eng., Suzhou, China, 2015, pp. 29–38.<a href="#fnref:28" rev="footnote"> ↩</a></span></li><li id="fn:29"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">29.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">K. Simonyan and A. Zisserman. (2014). ‘‘Very deep convolutional networks for large-scale image recognition.’’ [^Online]:. Available: https:// arxiv.org/abs/1409.1556<a href="#fnref:29" rev="footnote"> ↩</a></span></li><li id="fn:30"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">30.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">K. Zhang, W. Zuo, Y. Chen, D. Meng, and L. Zhang, ‘‘Beyond a Gaussian denoiser: Residual learning of deep CNN for image denoising,’’ IEEE Trans. Image Process., vol. 26, no. 7, pp. 3142–3155, Jul. 2017.<a href="#fnref:30" rev="footnote"> ↩</a></span></li><li id="fn:31"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">31.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">D. Graziotin and P. Abrahamsson, ‘‘A Web-based modeling tool for the SEMAT essence theory of software engineering,’’ J. Open Res. Softw., to be published. doi: 10.5334/jors.ad.<a href="#fnref:31" rev="footnote"> ↩</a></span></li><li id="fn:32"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">32.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">D. P. Kingma and J. Ba. (2014). ‘‘Adam: A method for stochastic optimization.’’ [^Online]:. Available: https://arxiv.org/abs/1412.6980<a href="#fnref:32" rev="footnote"> ↩</a></span></li><li id="fn:33"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">33.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">J. Kim, J. K. Lee, and K. M. Lee, ‘‘Accurate image super-resolution using very deep convolutional networks,’’ in Proc. IEEE Conf. CVPR, Las Vegas, NV, USA, Jun. 2016, pp. 1646–1654.<a href="#fnref:33" rev="footnote"> ↩</a></span></li><li id="fn:34"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">34.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">Z. Wang, A. C. Bovik, H. R. Sheikh, and E. P. Simoncelli, ‘‘Image quality assessment: From error visibility to structural similarity,’’ IEEE Trans. Image Process., vol. 13, no. 4, pp. 600–612, Apr. 2004.<a href="#fnref:34" rev="footnote"> ↩</a></span></li><li id="fn:35"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">35.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">Y. Cao, M. Y. Yang, and C.-L. Tisse, ‘‘Effective strip noise removal for low-textured infrared images based on 1-D guided filtering,’’ IEEE Trans. Circuits Syst. Video Technol., vol. 26, no. 12, pp. 2176–2188, Dec. 2016.<a href="#fnref:35" rev="footnote"> ↩</a></span></li><li id="fn:36"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">36.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">N. Liu, L. Wan, Y. Zhang, T. Zhou, H. Huo, and T. Fang, ‘‘Exploiting convolutional neural networks with deeply local description for remote sensing image classification,’’ IEEE Access, vol. 6, pp. 11215–11228, 2018.<a href="#fnref:36" rev="footnote"> ↩</a></span></li><li id="fn:37"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">37.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">Z. Jin et al., ‘‘EEG classification using sparse Bayesian extreme learning machine for brain–computer interface,’’ Neural Comput. Appl., to be published. doi: 10.1007/s00521-018-3735-3.<a href="#fnref:37" rev="footnote"> ↩</a></span></li><li id="fn:38"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">38.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">G. Zhou et al., ‘‘Linked component analysis from matrices to high-order tensors: Applications to biomedical data,’’ Proc. IEEE, vol. 104, no. 2, pp. 310–331, Feb. 2016.<a href="#fnref:38" rev="footnote"> ↩</a></span></li><li id="fn:39"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">39.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">R. Lai, Y. Mo, Z. Liu, and J. Guan, ‘‘Local and nonlocal steering kernel weighted total variation model for image denoising,’’ Symmetry, vol. 11, no. 3, p. 329, 2019.<a href="#fnref:39" rev="footnote"> ↩</a></span></li><li id="fn:40"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">40.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Sandler, A. Howard, M. Zhu, A. Zhmoginov, and L.-C. Chen, ‘‘MobileNetV2: Inverted residuals and linear bottlenecks,’’ in Proc. IEEE
Conf. Comput. Vis. Pattern Recognit., Salt Lake City, UT, USA, Jun. 2018, pp. 4510–4520.<a href="#fnref:40" rev="footnote"> ↩</a></span></li><li id="fn:41"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">41.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">W.-Q. Lim, ‘‘The discrete shearlet transform: A new directional transform and compactly supported shearlet frames,’’ IEEE Trans. Image Process., vol. 19, no. 5, pp. 1166–1180, May 2010.<a href="#fnref:41" rev="footnote"> ↩</a></span></li></ol></div></div></details></li>
</ol>
<link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>文献翻译</category>
</categories>
<tags>
<tag>深度学习与计算地球物理</tag>
</tags>
</entry>
<entry>
<title>Wave physics as an analog recurrent neural network</title>
<url>/2021/04/23/10.1126sciadv.aay6946/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><h1 id="Wave-physics-as-an-analog-recurrent-neural-network"><a href="#Wave-physics-as-an-analog-recurrent-neural-network" class="headerlink" title="Wave physics as an analog recurrent neural network"></a>Wave physics as an analog recurrent neural network</h1><p>原文地址:<a href="https://advances.sciencemag.org/content/5/12/eaay6946.abstract">模拟递归神经网络的波动物理</a><br>doi: <a href="http://sci-hub.ren/10.1126/sciadv.aay6946">10.1126/sciadv.aay6946</a><br>翻译时间:2021年4月23日</p>
<h2 id="ABSTRACTS"><a href="#ABSTRACTS" class="headerlink" title="ABSTRACTS"></a>ABSTRACTS</h2><p>模拟机器学习硬件平台有望比数字平台更快、更节能。声学和光学中的波物理,是为时变信号构建模拟处理器最自然的选择。本文明确了波动物理与RNN(Recurrent neural networks,循环神经网络)之间的映射。这种映射表明,利用标准的神经网络训练技术,可以使物理波动系统学习到时序数据中的复杂特征。例如,我们证明了,当原始音频信号在逆向设计的非均匀介质中散射和传播时,能够实现元音分类(vowel classification),且其性能与RNN的“数字化实现”相当。这些发现为一类新的模拟机器学习平台提供了可能,该平台能够快速有效地对数据在其原有域进行处理(即不通过将问题转化网络训练的方式)。</p>
<h2 id="INTRODUCTION"><a href="#INTRODUCTION" class="headerlink" title="INTRODUCTION"></a>INTRODUCTION</h2><p>近年来,机器学习在执行复杂的信息处理任务方面取得了巨大的成功,例如计算机视觉(CV)<sup id="fnref:1"><a href="#fn:1" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="O. Russakovsky, J. Deng, H. Su, J. Krause, S. Satheesh, S. Ma, Z. Huang, A. Karpathy, A. Khosla, M. Bernstein, A. C. Berg, L. Fei-Fei, Imagenet large scale visual recognition challenge. Int. J. Comput. Vis. 115, 211–252 (2015).
">[1]</span></a></sup>、机器翻译<sup id="fnref:2"><a href="#fn:2" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="I. Sutskever, O. Vinyals, Q. V. Le, Sequence to sequence learning with neural networks, in Advances in Neural Information Processing Systems, NIPS Proceedings, Montreal, CA, 2014.
">[2]</span></a></sup>等传统上难以处理的领域。然而,<br>这些应用的计算需求正呈指数级增长,促使人们不断开发新的、专门的硬件平台,以便快速高效地执行机器学习模型,其中包括从架构上模仿大脑生物电路的神经形态硬件平台<sup id="fnref:3"><a href="#fn:3" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="J. M. Shainline, S. M. Buckley, R. P. Mirin, S. W. Nam, Superconducting optoelectronic circuits for neuromorphic computing. Phys. Rev. Appl. 7, 034013 (2017).
">[3]</span></a></sup><sup id="fnref:4"><a href="#fn:4" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="A. N. Tait, T. F. D. Lima, E. Zhou, A. X. Wu, M. A. Nahmias, B. J. Shastri, P. R. Prucnal, Neuromorphic photonic networks using silicon photonic weight banks. Sci. Rep. 7, 7430 (2017).
">[4]</span></a></sup><sup id="fnref:5"><a href="#fn:5" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Romera, P. Talatchian, S. Tsunegi, F. Abreu Araujo, V. Cros, P. Bortolotti, J. Trastoy, K. Yakushiji, A. Fukushima, H. Kubota, S. Yuasa, M. Ernoult, D. Vodenicarevic, T. Hirtzlin, N. Locatelli, D. Querlioz, J. Grollier, Vowel recognition with four coupled spin-torque nano-oscillators. Nature 563, 230–234 (2018).
">[5]</span></a></sup>等。此外,使用连续物理系统自然演化来执行计算的模拟计算平台也正在成为实现机器学习的一个重要方向<sup id="fnref:6"><a href="#fn:6" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="Y. Shen, N. C. Harris, S. Skirlo, M. Prabhu, T. Baehr-Jones, M. Hochberg, X. Sun, S. Zhao, H. Larochelle, D. Englund, M. Soljačić, Deep learning with coherent nanophotonic circuits. Nat. Photonics 11, 441–446 (2017).
">[6]</span></a></sup><sup id="fnref:7"><a href="#fn:7" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="J. Biamonte, P. Wittek, N. Pancotti, P. Rebentrost, N. Wiebe, S. Lloyd, Quantum machine learning. Nature 549, 195–202 (2017).
">[7]</span></a></sup><sup id="fnref:8"><a href="#fn:8" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="F. Laporte, A. Katumba, J. Dambre, P. Bienstman, Numerical demonstration of neuromorphic computing with photonic crystal cavities. Opt. Express 26, 7955–7964 (2018).
">[8]</span></a></sup><sup id="fnref:9"><a href="#fn:9" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="X. Lin, Y. Rivenson, N. T. Yardimci, M. Veli, Y. Luo, M. Jarrahi, A. Ozcan, All-optical machine learning using diffractive deep neural networks. Science 361, 1004–1008 (2018).
">[9]</span></a></sup><sup id="fnref:10"><a href="#fn:10" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="E. Khoram, A. Chen, D. Liu, L. Ying, Q. Wang, M. Yuan, Z. Yu, Nanophotonic media for artificial neural inference. Photon. Res. 7, 823–827 (2019).
">[10]</span></a></sup>。本项工作中,我们发现了诸如声波、光学等波动物理现象与RNN计算之间的映射关系。RNN是最重要的机器学习模型之一,其已被广泛用于执行自然语言处理<sup id="fnref:11"><a href="#fn:11" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="K. Yao, G. Zweig, M.-Y. Hwang, Y. Shi, D. Yu, Recurrent neural networks for language understanding (Interspeech, 2013), pp. 2524–2528; https://www.microsoft.com/en-us/ research/publication/recurrent-neural-networks-for-language-understanding/.
">[11]</span></a></sup>和时间序列预测<sup id="fnref:12"><a href="#fn:12" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. Hüsken, P. Stagge, Recurrent neural networks for time series classification. Neurocomputing 50, 223–235 (2003).
">[12]</span></a></sup><sup id="fnref:13"><a href="#fn:13" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="G. Dorffner, Neural networks for time series processing. Neural Net. World 6, 447–468 (1996).
">[13]</span></a></sup><sup id="fnref:14"><a href="#fn:14" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="J. T. Connor, R. D. Martin, L. E. Atlas, Recurrent neural networks and robust time series prediction. IEEE Trans. Neural Netw. 5, 240–254 (1994).
">[14]</span></a></sup>等任务。我们证明了基于波的物理系统可以训练成RNN,因此,可以被动地处理数据原有域的信号和信息,而无需进行模数转换,从而有效提升处理效率并降低功耗。在这个框架中,与有意将信号反馈给输入不同的是,递归关系自然地发生在物理本身的时间动力学中,用于信息处理的内存和容量由在空间中传播的波提供。</p>
<h2 id="RESULTS"><a href="#RESULTS" class="headerlink" title="RESULTS"></a>RESULTS</h2><h3 id="波动力学与RNN之间的等效性"><a href="#波动力学与RNN之间的等效性" class="headerlink" title="波动力学与RNN之间的等效性"></a>波动力学与RNN之间的等效性</h3><p>本节中,我们介绍RNN运算与波动力学之间的关系。RNN通过对输入序列逐步应用相同的基本运算来得到输出序列,先前时刻的信息则被编码到RNN的隐藏状态中并在每个时刻进行更新。隐藏状态允许RNN保存历史信息的记忆,并学习到数据的时间结构以及长程依赖关系<sup id="fnref:15"><a href="#fn:15" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="J. L. Elman, Finding structure in time. Cognit. Sci. 14, 179–211 (1990).
">[15]</span></a></sup><sup id="fnref:16"><a href="#fn:16" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="M. I. Jordan, Serial order: A parallel distributed processing approach. Adv. Physcol. 121, 471–495 (1997).
">[16]</span></a></sup>。在给定的时刻$\boldsymbol t$,RNN作用于输入矢量$\boldsymbol x_t$以及隐藏状态矢量$\boldsymbol h_{t-1}$,计算得到输出矢量$\boldsymbol y_t$以及更新后的隐藏状态$\boldsymbol h_t$。<br>RNN有多种表现形式,其中最常见的形式其更新公式如下所示:</p>
<script type="math/tex; mode=display">\boldsymbol h_t = \sigma^{(h)}(\boldsymbol W^{(h)}·\boldsymbol h_{t-1}+\boldsymbol W^{(x)}·\boldsymbol x_t) \tag{1}</script><script type="math/tex; mode=display">\boldsymbol y_t = \sigma^{(y)}(\boldsymbol W^{(y)}·\boldsymbol h_t) \tag{2}</script><p>如图1B所示。稠密矩阵$\boldsymbol W^{(h)}$、$\boldsymbol W^{(x)}$、$\boldsymbol W^{(y)}$是训练过程中不断优化得到的,$\sigma^{(h)}(·)$和$\sigma^{(y)}(·)$为非线性激活函数。当公式1、2所定义的运算作用于输入序列时,有向图如1C所示。<br>接下来我们讨论如式1、2所示的RNN与波动物理系统之间的关系。举个例子,标量波场分布$\boldsymbol u(x, y, z)$由二阶偏微分方程$3$(图1D)控制。</p>
<script type="math/tex; mode=display">\frac{\partial^{2}u}{\partial t^{2}}-c^{2}·\nabla^{2}u=f \tag{3}</script><p>其中,$\nabla^{2}=\frac{\partial^{2}}{\partial x^{2}}+\frac{\partial^{2}}{\partial y^{2}}+\frac{\partial^{2}}{\partial z^{2}}$为拉普拉斯算子,$c=c(x, y, z)$为波速的空间分布,$f=f(x, y, z, t)$为源项。公式3的递推离散形式(以$\Delta t$为时间步长)为:</p>
<script type="math/tex; mode=display">\frac{u_{t+1}-2u_{t}+u_{t-1}}{\Delta t^{2}}-c^{2}·\nabla^{2}u_t=f_t\tag{4}</script><p>其中,下标$t$表示在固定时刻的标量场值。波动系统的<strong>隐藏状态-Hidden stae</strong>被定义为当前时刻和前一时刻波场分布的级联(concatenation),$\boldsymbol h_t \equiv[\boldsymbol u_{t-1}, \boldsymbol u_{t-1}]^T$,其中$\boldsymbol u_t$和$\boldsymbol u_{t-1}$均为定义在离散空间网格上的标量场$u_t$和$u_{t-1}$拉平(flatten)后的矢量。此时,波动方程的更新公式可改写为</p>
<script type="math/tex; mode=display">\boldsymbol h_t=\boldsymbol A(\boldsymbol h_{t-1})·\boldsymbol h_{t-1}+\boldsymbol P^{(i)}·\boldsymbol x_t \tag{5}</script><script type="math/tex; mode=display">\boldsymbol y_t = (\boldsymbol P^{o}·\boldsymbol h_t)^{2}\tag{6}</script><p>其中稀疏矩阵$A$,描述了无源波场$\boldsymbol u_t$和$\boldsymbol u_{t-1}$的更新量(如图1E所示)。公式$5$和$6$推导过程见S1。<br>对于足够大的场强,$A$对$\boldsymbol h_{t-1}$的依赖性可以通过形式为$c=c_lin+u^{2}_t·c_{nl}$的强度依赖波速实现,其中$c_{nl}$表现为介质局部区域中的非线性响应。事实上,这种类型的非线性响应会在各种博物理线性中遇到,例如水波、Kerr效应<sup id="fnref:19"><a href="#fn:19" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="R. W. Boyd, Nonlinear Optics (Academic Press, 2008).
">[19]</span></a></sup>的非线性光学材料、起泡流体以及柔软介质中的声波<sup id="fnref:20"><a href="#fn:20" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="T. Rossing, Springer Handbook of Acoustics (Springer Science & Business Media, 2007).
">[20]</span></a></sup>等。章节S2中提供了非线性材料响应的讨论和分析。正如激活函数$\sigma^{(y)}(·)$之于标准RNN中,当输出为波强度度量时,隐藏状态$\boldsymbol h_t$和输出$\boldsymbol y_t$之间的非线性关系在波动物理中也是非常典型的,正如公式$6$所示。<br>与标准RNN类似,波动方程中隐藏状态以及输入和输出之间的关系是由线性算子定义的,这里给定$\boldsymbol P^{(i)}$和$\boldsymbol P^{(o)}$。这些矩阵给定了空间中的注入(injecting)和测量(measuring)点。与输入和输出均为密集矩阵的标准RNN不同的是,波动方程的输入和输出矩阵都是稀疏的,因为他们只在注入和测量点是非零的。此外,这些矩阵在训练过程中都是不变的。与矩阵构造相关的更多信息请参照章节S3。<br>波动方程中可训练的自由参数为波速$c(x, y, z)$,对应于实际中材料的物理配置和布局。因此,当以离散时间(图1E)进行建模时,波动方程定义了一个映射到RNN的运算(图1B)。与RNN相类似,整个波动方程的动态过程可以被视为一个有向图,但相反的是,拉普拉斯算子的存在(最近邻耦合)使得信息通过隐藏层的速度是有限的。<br><img src="/2021/04/23/10.1126sciadv.aay6946/fig01.png" alt="RNN"><br>图1.标准RNN和基于波动物理系统的概念比较(A)作用于离散输入序列上并产生离散输出序列的RNN单元图(B)RNN单元的内部组成部分,由可训练密集矩阵$\boldsymbol W^{(h)}$、$\boldsymbol W^{(x)}$、$\boldsymbol W^{(y)}$组成。隐态和输出的激活函数分别用$\sigma^{(h)}$和$\sigma^{(y)}$表示(C)RNN单元的有向图(D)连续物理系统在连续输入序列上运行并产生连续输出序列的循环表示图(E)波动方程用有限差分离散时递推关系的内部分量(F)连续物理系统离散时间步长的有向图,以及波扰动如何在空间内传播示意图。</p>
<h2 id="DISCUSSION"><a href="#DISCUSSION" class="headerlink" title="DISCUSSION"></a>DISCUSSION</h2><p>本文提出的基于波动力学的RNN具有许多优点,为其处理时间编码信息提供了可能。与标准RNN不同的是,波动方程从一个时刻到下一个时刻的更新通过拉普拉斯算子(由图1E中的稀疏矩阵表示)强制隐态元素之间的最近邻耦合。这种近邻耦合是由于波动方程是一个双曲偏微分方程,其中信息以有限的速度传播。因此,模拟RNN隐藏状态的大小,以及它的存储容量,直接由传播介质的大小决定。此外,与传统的RNN不同,波动方程加强了能量守恒约束,防止了隐态范数和输出信号的无限增长。相反,定义标准RNN更新关系的无约束稠密矩阵将会导致梯度消失和爆炸,这对传统RNN的训练提出了重大挑战<sup id="fnref:27"><a href="#fn:27" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="L. Jing, Y. Shen, T. Dubcek, J. Peurifoy, S. Skirlo, Y. LeCun, M. Tegmark, M. Soljačić, Tunable Efficient Unitary Neural Networks (EUNN) and their application to RNNs, Proceedings of the 34th International Conference on Machine Learning-Volume 70 (JMLR.org, 2017), pp. 1733–1741.
">[27]</span></a></sup>。</p>
<p>我们已经证明了波动方程动力学在概念上等同于RNN。这种概念上的联系为一类新的模拟硬件平台提供了机会,在这种平台中,演化的时间动力学在物理和数据集中都扮演着重要角色。虽然我们把重点放在最一般的例子波动动力学(标量波动方程),我们的结果可以很容易地扩展到其他类波物理。这种利用物理进行计算的方法<sup id="fnref:9"><a href="#fn:9" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="X. Lin, Y. Rivenson, N. T. Yardimci, M. Veli, Y. Luo, M. Jarrahi, A. Ozcan, All-optical machine learning using diffractive deep neural networks. Science 361, 1004–1008 (2018).
">[9]</span></a></sup><sup id="fnref:28"><a href="#fn:28" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="A. Silva, F. Monticone, G. Castaldi, V. Galdi, A. Alù, N. Engheta, Performing mathematical operations with metamaterials. Science 343, 160–163 (2014).
">[28]</span></a></sup><sup id="fnref:32"><a href="#fn:32" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="N. M. Estakhri, B. Edwards, N. Engheta, Inverse-designed metastructures that solve equations. Science 363, 1333–1338 (2019).
">[32]</span></a></sup>可能会为模拟机器学习设备提供一个新的平台,它有可能比数字设备更自然、更有效地进行计算。该方法的普遍性进一步表明,许多物理系统可能是对动态信号(例如光学、声学或地震学中的信号)执行类似RNN的计算。</p>
<h2 id="MATERIALS-AND-METHODS"><a href="#MATERIALS-AND-METHODS" class="headerlink" title="MATERIALS AND METHODS"></a>MATERIALS AND METHODS</h2><h3 id="Numerical-modeling"><a href="#Numerical-modeling" class="headerlink" title="Numerical modeling"></a>Numerical modeling</h3><p>利用Python编写的自定义软件包对波动方程物理进行了数值模拟和仿真。该软件是在流行的机器学习库PyTorch<sup id="fnref:33"><a href="#fn:33" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="A. Paszke, S. Gross, S. Chintala, G. Chanan, E. Yang, Z. DeVito, Z. Lin, A. Desmaison, L. Antiga, A. Lerer, Automatic differentiation in PyTorch, Workshop on Autodiff (NIPS, 2017).
">[33]</span></a></sup>的基础上开发的,通过逆向模式自动微分计算损失函数相对于材料分布的梯度。在物理和工程领域的逆设计中,这种梯度计算方法通常被称为伴随变量法,并且需要额外进行一次模拟。我们注意到,在地震数据集的全波形反演中,已经提出了使用机器学习框架进行数值模拟的相关方法<sup id="fnref:34"><a href="#fn:34" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="A. Richardson, Seismic full-waveform inversion using deep learning tools and techniques. arXiv:1801.07232 [physics.geo-ph] (22 January 2018).">[34]</span></a></sup>。进行数值模拟和波动方程训练的代码,以及生成本文中给出的图形的代码,可在<a href="https://www.github.com/fancompute/wavetorch/">github</a>上找到。</p>
<p><details><summary>参考文献</summary></details></p>
<div id="footnotes"><hr><div id="footnotelist"><ol style="list-style: none; padding-left: 0; margin-left: 40px"><li id="fn:1"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">1.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">O. Russakovsky, J. Deng, H. Su, J. Krause, S. Satheesh, S. Ma, Z. Huang, A. Karpathy, A. Khosla, M. Bernstein, A. C. Berg, L. Fei-Fei, Imagenet large scale visual recognition challenge. Int. J. Comput. Vis. 115, 211–252 (2015).<a href="#fnref:1" rev="footnote"> ↩</a></span></li><li id="fn:2"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">2.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">I. Sutskever, O. Vinyals, Q. V. Le, Sequence to sequence learning with neural networks, in Advances in Neural Information Processing Systems, NIPS Proceedings, Montreal, CA, 2014.<a href="#fnref:2" rev="footnote"> ↩</a></span></li><li id="fn:3"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">3.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">J. M. Shainline, S. M. Buckley, R. P. Mirin, S. W. Nam, Superconducting optoelectronic circuits for neuromorphic computing. Phys. Rev. Appl. 7, 034013 (2017).<a href="#fnref:3" rev="footnote"> ↩</a></span></li><li id="fn:4"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">4.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">A. N. Tait, T. F. D. Lima, E. Zhou, A. X. Wu, M. A. Nahmias, B. J. Shastri, P. R. Prucnal, Neuromorphic photonic networks using silicon photonic weight banks. Sci. Rep. 7, 7430 (2017).<a href="#fnref:4" rev="footnote"> ↩</a></span></li><li id="fn:5"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">5.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Romera, P. Talatchian, S. Tsunegi, F. Abreu Araujo, V. Cros, P. Bortolotti, J. Trastoy, K. Yakushiji, A. Fukushima, H. Kubota, S. Yuasa, M. Ernoult, D. Vodenicarevic, T. Hirtzlin, N. Locatelli, D. Querlioz, J. Grollier, Vowel recognition with four coupled spin-torque nano-oscillators. Nature 563, 230–234 (2018).<a href="#fnref:5" rev="footnote"> ↩</a></span></li><li id="fn:6"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">6.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">Y. Shen, N. C. Harris, S. Skirlo, M. Prabhu, T. Baehr-Jones, M. Hochberg, X. Sun, S. Zhao, H. Larochelle, D. Englund, M. Soljačić, Deep learning with coherent nanophotonic circuits. Nat. Photonics 11, 441–446 (2017).<a href="#fnref:6" rev="footnote"> ↩</a></span></li><li id="fn:7"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">7.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">J. Biamonte, P. Wittek, N. Pancotti, P. Rebentrost, N. Wiebe, S. Lloyd, Quantum machine learning. Nature 549, 195–202 (2017).<a href="#fnref:7" rev="footnote"> ↩</a></span></li><li id="fn:8"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">8.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">F. Laporte, A. Katumba, J. Dambre, P. Bienstman, Numerical demonstration of neuromorphic computing with photonic crystal cavities. Opt. Express 26, 7955–7964 (2018).<a href="#fnref:8" rev="footnote"> ↩</a></span></li><li id="fn:9"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">9.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">X. Lin, Y. Rivenson, N. T. Yardimci, M. Veli, Y. Luo, M. Jarrahi, A. Ozcan, All-optical machine learning using diffractive deep neural networks. Science 361, 1004–1008 (2018).<a href="#fnref:9" rev="footnote"> ↩</a></span></li><li id="fn:10"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">10.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">E. Khoram, A. Chen, D. Liu, L. Ying, Q. Wang, M. Yuan, Z. Yu, Nanophotonic media for artificial neural inference. Photon. Res. 7, 823–827 (2019).<a href="#fnref:10" rev="footnote"> ↩</a></span></li><li id="fn:11"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">11.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">K. Yao, G. Zweig, M.-Y. Hwang, Y. Shi, D. Yu, Recurrent neural networks for language understanding (Interspeech, 2013), pp. 2524–2528; https://www.microsoft.com/en-us/ research/publication/recurrent-neural-networks-for-language-understanding/.<a href="#fnref:11" rev="footnote"> ↩</a></span></li><li id="fn:12"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">12.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. Hüsken, P. Stagge, Recurrent neural networks for time series classification. Neurocomputing 50, 223–235 (2003).<a href="#fnref:12" rev="footnote"> ↩</a></span></li><li id="fn:13"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">13.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">G. Dorffner, Neural networks for time series processing. Neural Net. World 6, 447–468 (1996).<a href="#fnref:13" rev="footnote"> ↩</a></span></li><li id="fn:14"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">14.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">J. T. Connor, R. D. Martin, L. E. Atlas, Recurrent neural networks and robust time series prediction. IEEE Trans. Neural Netw. 5, 240–254 (1994).<a href="#fnref:14" rev="footnote"> ↩</a></span></li><li id="fn:15"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">15.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">J. L. Elman, Finding structure in time. Cognit. Sci. 14, 179–211 (1990).<a href="#fnref:15" rev="footnote"> ↩</a></span></li><li id="fn:16"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">16.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">M. I. Jordan, Serial order: A parallel distributed processing approach. Adv. Physcol. 121, 471–495 (1997).<a href="#fnref:16" rev="footnote"> ↩</a></span></li><li id="fn:17"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">17.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">I. Goodfellow, Y. Bengio, A. Courville, Deep Learning (MIT Press, 2016).<a href="#fnref:17" rev="footnote"> ↩</a></span></li><li id="fn:18"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">18.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">F. Ursell, The long-wave paradox in the theory of gravity waves. Math. Proc. Camb. Philos. Soc. 49, 685–694 (1953).<a href="#fnref:18" rev="footnote"> ↩</a></span></li><li id="fn:19"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">19.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">R. W. Boyd, Nonlinear Optics (Academic Press, 2008).<a href="#fnref:19" rev="footnote"> ↩</a></span></li><li id="fn:20"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">20.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">T. Rossing, Springer Handbook of Acoustics (Springer Science & Business Media, 2007).<a href="#fnref:20" rev="footnote"> ↩</a></span></li><li id="fn:27"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">27.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">L. Jing, Y. Shen, T. Dubcek, J. Peurifoy, S. Skirlo, Y. LeCun, M. Tegmark, M. Soljačić, Tunable Efficient Unitary Neural Networks (EUNN) and their application to RNNs, Proceedings of the 34th International Conference on Machine Learning-Volume 70 (JMLR.org, 2017), pp. 1733–1741.<a href="#fnref:27" rev="footnote"> ↩</a></span></li><li id="fn:28"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">28.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">A. Silva, F. Monticone, G. Castaldi, V. Galdi, A. Alù, N. Engheta, Performing mathematical operations with metamaterials. Science 343, 160–163 (2014).<a href="#fnref:28" rev="footnote"> ↩</a></span></li><li id="fn:32"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">32.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">N. M. Estakhri, B. Edwards, N. Engheta, Inverse-designed metastructures that solve equations. Science 363, 1333–1338 (2019).<a href="#fnref:32" rev="footnote"> ↩</a></span></li><li id="fn:33"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">33.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">A. Paszke, S. Gross, S. Chintala, G. Chanan, E. Yang, Z. DeVito, Z. Lin, A. Desmaison, L. Antiga, A. Lerer, Automatic differentiation in PyTorch, Workshop on Autodiff (NIPS, 2017).<a href="#fnref:33" rev="footnote"> ↩</a></span></li><li id="fn:34"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">34.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">A. Richardson, Seismic full-waveform inversion using deep learning tools and techniques. arXiv:1801.07232 [physics.geo-ph] (22 January 2018).<a href="#fnref:34" rev="footnote"> ↩</a></span></li></ol></div></div><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>文献翻译</category>
</categories>
<tags>
<tag>深度学习与计算地球物理</tag>
</tags>
</entry>
<entry>
<title>Born散射级数</title>
<url>/2021/06/12/IPTS_BOX11.1/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><h1 id="Born散射级数"><a href="#Born散射级数" class="headerlink" title="Born散射级数"></a>Born散射级数</h1><p>Born散射级数是由Lippmann-Schwinger积分方程推导而来的,在应用这个方程时,除预测地震响应的实际介质外,我们还需要选择一个背景介质(参考介质)。</p>
<p>下面我们从频率域中控制压力场的波动方程开始推导相关方程。若$P({\rm \textbf x}, \omega, {\rm \textbf x}_s)$表示由位于${\rm \textbf x}_s$处点源激发, 在${\rm \textbf x}$处记录的压力场,它遵守以下方程:</p>
<script type="math/tex; mode=display">L({\rm \textbf x}, \omega) P({\rm \textbf x}, \omega, {\rm \textbf x}_s) = -S(\omega)\delta ({\rm \textbf x} - {\rm \textbf x}_s), \tag{11.33}</script><p>其中,</p>
<script type="math/tex; mode=display">L({\rm \textbf x}, \omega) = \omega^2K({\rm \textbf x}) + {\rm {div}}[\sigma({\rm \textbf x}) \textbf{grad}],\tag{11.34}</script><p> $K({\rm \textbf x})$表示压缩系数(体积模量的倒数),$\sigma({\rm \textbf x})$为比容积(密度的倒数),$S(\omega)$为位于${\rm \textbf x}_s$的源。</p>
<p>波在背景介质中传播所产生的压力场$P_0=P_0({\rm \textbf x}, \omega, {\rm \textbf x}_s)$满足如下方程:</p>
<script type="math/tex; mode=display">L_0({\rm \textbf x}, \omega) P_0({\rm \textbf x}, \omega, {\rm \textbf x}_s) = -S(\omega)\delta ({\rm \textbf x} - {\rm \textbf x}_s), \tag{11.33}</script><p>并有:</p>
<script type="math/tex; mode=display">L_0({\rm \textbf x}, \omega)=\omega^2 K_0 + {\rm {div}}[\sigma_0 \textbf{grad}]\tag{11.36}</script><p>上式中$L_0=L_0({\rm \textbf x}, \omega)$为描述背景介质波动方程的微分算子。$K_0$为压缩系数,$\sigma_0$为比容积。</p>
<p>同时,我们还需要背景介质中波动方程的格林函数$G_0=G_0({\rm \textbf x}, \omega, {\rm \textbf x}_s)$, 其定义如下:</p>
<script type="math/tex; mode=display">L_0({\rm \textbf x}, \omega)G_0({\rm \textbf x}, \omega;{\rm \textbf x}^{\prime})=-\delta({\rm \textbf x}-{\rm \textbf x}^{\prime})\tag{11.37}</script><p>所以,</p>
<script type="math/tex; mode=display">P_0({\rm \textbf x}, \omega, {\rm \textbf x}_s)=S(\omega)G_0({\rm \textbf x}, \omega;{\rm \textbf x}_s) \tag{11.38}</script><p>另一个我们需要的量是格林函数的逆:$G_{0}^{-1} = G_{0}^{-1}({\rm \textbf x}, \omega;{\rm \textbf x}_s)$,其由如下公式所定义:</p>
<script type="math/tex; mode=display">\int d{\rm \textbf x}^{\prime}G_0({\rm \textbf x}, \omega;{\rm \textbf x}^{\prime}) G_0^{-1}({\rm \textbf x}^{\prime}, \omega;{\rm \textbf x}^{\prime\prime}) \tag{11.39}</script><p>利用压力场$P_0$和格林函数$G_0$,Lippmann-Schwinger积分方程给出了压力场$P$的一个解,即在实际介质中的任何地方,都有如下积分方程:</p>
<script type="math/tex; mode=display">\begin{align}
\notag
P({\rm \textbf x}, &\omega, {\rm \textbf x}_s) = P_0({\rm \textbf x}, \omega, {\rm \textbf x}_s) \\
\notag
&+\int_D d{\rm \textbf x}^{\prime} G_0({\rm \textbf x}, \omega;{\rm \textbf x}^{\prime}) W({\rm \textbf x}^{\prime}, \omega) P({\rm \textbf x}, \omega;{\rm \textbf x}^{\prime})
\end{align}\tag{11.40}</script><p>其中,</p>
<script type="math/tex; mode=display">W({\rm \textbf x}, \omega) = L({\rm \textbf x}, \omega)-L_0({\rm \textbf x}, \omega)\tag{11.41}</script><p>$D$为$W({\rm \textbf x}, \omega)$的定义域($D$外$W({\rm \textbf x}, \omega)$为<code>null</code>),如图11.6中所示,11.40可用如下更简洁形式表示:</p>
<script type="math/tex; mode=display">P=P_0+G_0WP\tag{11.42}</script><p>或者,</p>
<script type="math/tex; mode=display">P=[I-G_0W]^{-1}P_0\tag{11.43}</script><p> 其中,$G_0({\rm \textbf x}, \omega, {\rm \textbf x}^{\prime})$为$G_0$的核,$W({\rm \textbf x}, \omega)$为势$W$的核。<br>将11.42泰勒展开后即可得到$Born$逆散射级数:</p>
<script type="math/tex; mode=display">\begin{align}
\notag
P &= P_0 \\
\notag&+G_0WP_0 \\
\notag&-G_0WG_0WP_0 \\
\notag&+G_0WG_0WG_0WP_0-...
\notag\end{align}
\tag{11.44}</script><p>或者,</p>
<script type="math/tex; mode=display">\begin{align}
\notag
P &= P_0 \\
\notag&+SG_0WG_0 \\
\notag&-SG_0WG_0WS_0 \\
\notag&+SG_0WG_0WG_0WS_0-...
\end{align}
\tag{11.45}</script><p>$Born$散射级数也可写为:</p>
<script type="math/tex; mode=display">P=P_0+SG_0W^{\prime}G_0\tag{11.46}</script><script type="math/tex; mode=display">\begin{align}
\notag W^{\prime} &= W \\
\notag & - WG_0 W \\
\notag & + WG_0 WG_0 W \\
\notag & - WG_0 WG_0 WG_0 W
\end{align}
\tag{11.47}</script><p>忽略$Born$级数(公式11.44和11.45)三阶及以上项即可得到$Born$近似:</p>
<script type="math/tex; mode=display">P \approx P_0+SG_0WG_0 \tag{11.48}</script><p>将11.46做如下替换也可得到11.48所示的$Born$近似:</p>
<script type="math/tex; mode=display">W^{\prime} = W.\tag{11.49}</script><p>通过不同的方式均能够在保证$P$和$W$线性关系的同时得到$Born$近似。</p>
<link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>地球物理数理知识</category>
</categories>
<tags>
<tag>Born散射级数</tag>
</tags>
</entry>
<entry>
<title>反问题</title>
<url>/2021/06/11/IPTS_ch11_445~456/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><h1 id="11-反问题例子:线性化地震数据反演"><a href="#11-反问题例子:线性化地震数据反演" class="headerlink" title="11. 反问题例子:线性化地震数据反演"></a>11. 反问题例子:线性化地震数据反演</h1><p>我们必须对间接测量得到的地震数据使进行处理和解释之后,才能较为合理地推断地下模型。我们需要对地下介质的物理性质进行建模,例如确定岩层之间的界面位置、估计岩层物理性质等。由一个给定数据集到与该数据集相关联的最优地下模型的这一过程被称为求解反问题。在这一节中,我们介绍石油地震学家解决这一问题所采取的一些方法。</p>
<h1 id="分步式反演"><a href="#分步式反演" class="headerlink" title="分步式反演"></a>分步式反演</h1><h2 id="反问题的基础要素"><a href="#反问题的基础要素" class="headerlink" title="反问题的基础要素"></a>反问题的基础要素</h2><p>反问题存在于诸多领域,例如量子力学、医学成像等。但是,较为广义的反问题理论是由研究地球物理数据的人们发展起来的。地球物理学家试图了解地球内部,但唯一可用的数据是在地球表面、海面、海底或钻孔等位置收集的。<br>脱离于学科概念,反问题的解决通常要包含以下三个步骤:</p>
<ol>
<li><strong>建立模型参数</strong>。即通过可用数据构建最佳的模型参数。但是由于我们数据的限制,这一般是不可能的。例如,根据以下$AVA$响应$f_{ava}$确定两个各向同性弹性岩层之间的弹性参数的对比度(constrast)。<script type="math/tex; mode=display">f_{ava}=\Delta I_P+(\Delta I_S-3\Delta\mu)sin^2\theta+4\Delta\mu sin^4\theta \tag{11.1}</script>当$\theta \in [0,30^{\circ}]$时,由于$sin^4\theta$较小,因此以上公式中只有两个参数(即$[\Delta I_P, \Delta I_S-3\Delta\mu]$),而非三个参数(即$[\Delta I_P, \Delta I_S-3\Delta\mu, \Delta \mu]$)。所以,由于数据的局限性,我们无法重构出精确的模型。物理量$\Delta I_P, \Delta I_S, \Delta \mu$分别代表纵波阻抗对比度、横波阻抗对比度和剪切模量对比度。<br><img src="/2021/06/11/IPTS_ch11_445~456/11.1.png" alt="11.1"></li>
<li><strong>正演</strong>(forward modeling)。对于给定的模型参数,该步骤意味着我们要在一定物理定律的约束下来预测该模型参数下的数据(如图11.1所示)。方程11.1给出了在特定弹性参数对比度下的$AVA$响应。<strong>波动方程</strong>也是正演的一种基本方式(如第2和6节所示),基于波动方程的正演模拟允许我们使用密度、拉梅系数等弹性参数来预测地震记录。</li>
<li><strong>反演</strong>(inverse problem)。该步骤需要我们使用观测数据来推断模型参数,使得由该模型参数正演得到的<strong>预测数据</strong>(Predicted data)在特定的<strong>准则</strong>(Criterion)下能够很好地拟合<strong>观测数据</strong>(Observed data)。使预测数据和观测数据的误差平方和最小是最为常用的准则(如公式11.2所示)<script type="math/tex; mode=display">F=\sum_s \sum_r \int_{t_0}^{t_1} [P_{obs}(x_s, x_r, t)-P_{pred}(x_s, x_r, t)]^2 dt</script>其中,$P_{obs}(x_s, x_r, t)$和$P_{pred}(x_s, x_r, t)$分别代表观测数据和合成数据。$x_s$表示炮点位置($s=1,2,…$);$x_r$表示接受点位置($r=1,2,…$);$t$表示旅行时$t_0\leq t\leq t_1$。</li>
</ol>
<p>以上步骤中有非常强的反馈机制,在任何一步中的提升一般都可以用到其它两个步骤中。</p>
<p>在本节中我们只关注地震数据的反演。</p>
<h2 id="非唯一性、不稳定性、收敛性、不确定性、成本"><a href="#非唯一性、不稳定性、收敛性、不确定性、成本" class="headerlink" title="非唯一性、不稳定性、收敛性、不确定性、成本"></a>非唯一性、不稳定性、收敛性、不确定性、成本</h2><p>石油地震学中反问题的求解通常会遇到五个基础性问题:①<strong>非唯一性</strong>。即如何确定由给定数据所反演的模型与实际情况最为匹配。②<strong>不稳定性</strong>。即数据中的微小扰动可能会导致反演结果中的较大扰动。③<strong>收敛性</strong>。即迭代求解反问题时可能出现。④<strong>不确定性</strong>。即物理模型不准确、物理模型不完整性以及测量的不确定性等⑤<strong>成本</strong>。反问题求解过程中的正问题的成本。</p>
<p><img src="/2021/06/11/IPTS_ch11_445~456/11.2.png" alt="11.2"><br>为了使我们刚才提出的反问题解决方案的相关问题更加具体,让我们看几个例子。如图11.2所示,两个完全不同模型,入射角为$30^{\circ}$以下时的亚临界$AVA$响应(振幅随角度变化)几乎完全一样,此即<strong>非唯一性</strong>问题。对于超过$30^{\circ}$的入射角、$AVA$响应的差异足以区分这两种模型。换言之,石油地震学问题中大量的非均匀性可以通过改进我们的理论或抛弃一些假设来解决,或者通过改进我们采集数据的观测系统,例如,长偏移距,以便采集大于$30^{\circ}$入射角的数据。<br><img src="/2021/06/11/IPTS_ch11_445~456/11.3new.png" alt="11.3"><br>图11.3显示了亚临界PP反射的$AVA$响应来重构横波速度所产生的不稳定性问题。我们可以看到,当对横波速度施加$50%$变化量后,$PP$反射的$AVA$响应几乎没有变化。这种<strong>不稳定性</strong>的结果就是,我们可能无法通过$PP$反射数据来区分松散沉积物和固结岩层。但是,正如在非唯一性问题中所讲的那样,我们可以改进理论、抛弃一些假设或者改进采集数据的观测系统来解决不稳定性问题。例如,在长偏移距数据能够看到明显的$PS$反射能量。事实上,从图11.3中可以看出,可以通过使用$PP$反射的临界后$AVA$响应或者$PS$的$AVA$响应来对两种模型加以区分。<br><img src="/2021/06/11/IPTS_ch11_445~456/11.4.png" alt="11.4"><br>接下来让我们看一下物理模型的<strong>不准确性</strong>问题。假设我们正演中用于预测$PP$反射的物理模型是基于声波方程,而不是弹性方程(见第2章和第6章)。如图11.4所示,尽管声波方程能够很好地预测旅行时,但是振幅确实完全不正确的,在大偏移距处更为明显。同样,这些不准确的结果是,我们可能无法区分某些岩性。</p>
<p>正如我们在第7~10章中所描述的,地震数据含有大量的多余的能量,例如地滚波、涌浪噪声、多次波等等。当反问题迭代求解时,这些不需要的信号(通常比期望的信号大得多)会减慢收敛到最优解的速度,甚至会导致地下模型的不精确。事实上,选择最佳地下模型的大多数标准包括拟合观测数据和为给定地下模型预测的数据。但是,根据这些标准建立的模型往往同时解释了数据中的可能是噪声的大振幅信号,例如地滚波等。解决这个<strong>收敛性</strong>问题的一种方法是在开始反演之前从数据中尽可能多地去除不必要的能量。</p>
<p>下面考虑石油地震学中正问题的成本。正问题即在一组初始条件、最终条件和边界条件下,求解控制波在地球中传播的微分方程。有限差分模拟是求解波动方程的常用方法,其对偏微分方程中的偏导数作了数值近似(附录C)。对时间和空间进行适当地离散后,就能够较为精确的计算波动方程中的偏微分。在这种情况下,有限差分正演模拟(FDM)技术是迄今为止通过复杂地质模型(如勘探与生产行业目前面临的模型)模拟弹性波传播的最精确的工具。但是,其计算成本非常高。建设我们对一个离散成$1000\times1000\times500$个空间网格的复杂地质模型进行弹性波正演模拟,在时间上递推4000次。我们估计,在SGI Origin 2000(由Silicon Graphics,Inc.提供)上,使用20个CPU进行40000次的小型3D正演计算需要12年以上时间,远远超过了某些石油储层的生产寿命(编者注:本书写于2005年)。</p>
<h2 id="地震反问题的分步式方法"><a href="#地震反问题的分步式方法" class="headerlink" title="地震反问题的分步式方法"></a>地震反问题的分步式方法</h2><p>在实际应用中,我们并不是开发单一的反演算法,让其接收野外数据输入然后生成地下模型,而是将其划分为多个步骤,以更好地处理不稳定性、唯一性、不确定性、收敛性,正演成本等问题。这里的基本思想是,我们对数据、问题的物理性质以及其他先验地质和地球物理信息的了解越深入,越有助于引导反问题解远离不稳定性和非均匀性。这些知识甚至可以帮助我们减少正演成本,因为它允许我们采用具有多种人类交互可能性的多步反演方案,而不是单步方案,如图11.5所示。<br><img src="/2021/06/11/IPTS_ch11_445~456/11.5.png" alt="11.5"><br>当前<strong>海洋数据</strong>多步反演方案包含以下关键步骤:</p>
<ol>
<li>去鬼波(即对震源和接收器鬼波的影响进行校正);</li>
<li>去多次波(即自由面多次波的衰减);</li>
<li>宏观模型速度的估计(即估计最适合地震数据中包含的走时的速度模型),这也被称为背景模型;</li>
<li>线性化反演(即,地震数据反演,假设数据已针对多次反射进行了校正,并且背景模型已知)。</li>
</ol>
<p>在<strong>陆地地震</strong>中,关键步骤如下:</p>
<ol>
<li>地滚波衰减;</li>
<li>静校正;</li>
<li>宏观模型速度估计;</li>
<li>线性化反演。</li>
</ol>
<p><strong>井中地震</strong>关键步骤如下:</p>
<ol>
<li>上下分离;</li>
<li>多次波衰减;</li>
<li>线性化反演。</li>
</ol>
<p>注意,在井中地震中,速度模型通常可从测井测量中获得。因此,通常不需要进行速度估计。我们不能用三章内容来描述所有这些处理步骤。我们将重点讨论海洋数据多步反演的四个步骤。对这四个步骤的描述为有助于了解本章内容。</p>
<p>由于成本原因,其中的一些步骤,例如多次波去除,都是从几何光学或者纯信号处理领域发展来的(例如Chapter8中$fk$倾角滤波方法),并不是基于波动方程的。这些工具倾向于只关注旅行时变化而忽略振幅变化。并且,这些方法还会产生假象,并且在数据中留有较大的残差。但是由于这些方法对于计算资源的需求较小,因此应用较为广泛。但随着近年来计算能力的提升,人们不再考虑使用这些几何光学工具来替换基于波动方程的方法。此外,为达到现在地震资料处理中追求的高分辨率和多次波衰减的目的,我们也必须基于运动学和动力学更加精确的波动方程方法。这些方法背后的理论是地震学中用于表示波场的两个积分方程:$Lippmann-Schwinger$积分方程和表示定理。$Lippmann-Schwinger$积分方程导出了所谓的$Born$散射级数,而表示定理导出了$Kirchhoff$散射级数。上述反演的四个步骤(去鬼波、多次波衰减、宏观模型估计和线性化反演)均可以通过$Born$散射级数和$Kirchhoff$散射级数推导得出,正如我们在第10章多次衰减中看到的那样。<strong>本章的重点是线性化反演和宏观模型的估计</strong>。</p>
<p>在前面的章节中,我们提到了<strong>NMO</strong>,<strong>DMO</strong>,偏移等作为地震成像的工具。我们刚才描述的地震反问题中,这些工具从何而来?在本章中,我们将看到<strong>偏移只是线性化反演的一个特例</strong>。我们还将动校正叠加与线性化反演、以及倾角校正叠加联系起来。</p>
<h1 id="反问题示例的关键假设"><a href="#反问题示例的关键假设" class="headerlink" title="反问题示例的关键假设"></a>反问题示例的关键假设</h1><p>在对数据进行去多次波和去鬼波处理(如Cahpters9和10所述)之后,下一步是从包含初至波的数据中构建地下模型。这一章节中我们通过线性化反演解来讲述如何解决反问题,线性化反演非常好地提供了一种从原始数据域构建地震剖面的方法。线性化反演问题的关键假设如下面的章节所述。</p>
<h1 id="Born近似"><a href="#Born近似" class="headerlink" title="Born近似"></a>Born近似</h1><p>如前所述,通过正演模拟求解物理规律允许我们以最经济有效的方式获得预测数据。对于给定的地下模型,我们本章节的任务是选择一组物理定律来预测<strong>只包含初至波</strong>的拖揽数据。<br>第6节中所述的一阶波动方程以及初始和边界条件,或者是$Lippmann-Schwinger$积分方程是两个解决正问题的工具。</p>
<h2 id="基于有限差分求解正问题"><a href="#基于有限差分求解正问题" class="headerlink" title="基于有限差分求解正问题"></a>基于有限差分求解正问题</h2><p>使用波动方程求解只有初至波的正问题与求解包含多次波的完整数据几乎是完全相同的。我们将不施加如Chapter3所述的自由界面边界条件,而是假设水层是无限的。从实用角度看,当用有限差分计算波动方程的解时(见附录C),我们需要用吸收边界条件来代替自由界面边界条件。因此,就计算所消耗的时间而言,使数据仅包含初至波是没有任何收益的。实际上,在某些情况下,仅计算包含初至波的波场要比包含多次波的全波场数据更加费时,因为吸收边界条件的数值模拟要比自由界面边界条件计算成本更高。</p>
<h2 id="基于Born近似求解正问题"><a href="#基于Born近似求解正问题" class="headerlink" title="基于Born近似求解正问题"></a>基于Born近似求解正问题</h2><p>正演模拟的另一种解决方案是$Lippmann-Schwinger$积分方程,或与该积分方程相关的$Born$散射级数(见Box 11.1)。这要求我们将实际的介质分解为背景模型(或参考模型、宏观模型)和扰动模型(散射模型)两部分。在这一分解中,震源和接收点均位于背景模型中,如图11.6所示。没有接触到扰动模型,直接从震源到达接收点的波被称为直达波场(非扰动波场),与扰动模型相互作用的波则构成了扰动波场(散射波场)。<br><img src="/2021/06/11/IPTS_ch11_445~456/11.6new.png" alt="11.6"><br>对于给定的地下介质模型,如<strong>Box 11.1</strong>所示的$Lippmann-Schwinger$积分方程允许我们预测产生只包含初至的数据,这里用$P$来表示:</p>
<script type="math/tex; mode=display">P=P_0+SG_0WG\tag{11.3}</script><p>其中,</p>
<script type="math/tex; mode=display">P_0=SG_0\tag{11.4}</script><p>这里,$P_0$表示直达波场,$S$表示震源,$G_0$代表背景介质中波动方程的格林函数,$G$代表真实介质中波动方程的格林函数,$W$表示散射势。散射波场$\delta P$可表示为:</p>
<script type="math/tex; mode=display">\delta P=P-P0\tag{11.5}</script><p>公式11.3对于任何背景介质都是有效的,而$G_0$是否准去的描述了震源检波点界面以及散射点并不重要。11.3所示的积分可以通过迭代的方式或者通过如<strong>Box 11.1</strong>所示的$Born$级数方式求解。<br>公式11.3还可以改写为:</p>
<script type="math/tex; mode=display">P=P_0+SG_0W^{'}G_0 \tag{11.6}</script><script type="math/tex; mode=display">W^{'}=WGG^{-1}_0\tag{11.7}</script><p>如果我们假设$G_0$足够近似$G$,即$G_0$能够精确预测从散射点到震源和检波器的波场,有如下公式</p>
<script type="math/tex; mode=display">GG^{-1}_0\approx I\tag{11.8}</script><p>式中$I$表示恒等算符——当$W^{‘}$近似等于$W^{‘}$,公式11.6退化为$Born$近似,即</p>
<script type="math/tex; mode=display">P \approx P_0+SG_0WG_0\tag{11.9}</script><p>或者</p>
<script type="math/tex; mode=display">\delta P \approx SG_0WG_0\tag{11.10}</script><p>此外,在高于二阶项均可忽略不计的前提下,我们可以通过截断$Born$级数<strong>Box 11.1</strong>中,只取其前两项,来得到公式11.9和11.10。</p>
<p>因此,我们能够利用公式11.9预测给定散射势的初至波场(即求解正演模拟问题)。然而,与第六章中的$Lippmann-Schwinger$积分方程或一阶波动微分方程组相反,我们在将实际模型分解为背景和扰动模型时,不能简单地选择任意背景模型。只有当背景模型与源-接收器界面和散射点之间的实际介质相同时,方程11.9才有效。另请注意,与11.3中的$Lippmann-Schwinger$积分方程以及有限差分求解波动方程相反,利用$Born$近似得到的方程11.9求解正问题不涉及迭代过程或具有无穷多个项的级数。因此,方程11.9中的$Born$近似不会产生数值不稳定性问题,也不会遇到迭代过程中的收敛问题,其解也不会有无穷多项级数。这些特点使$Born$近似成为解决正演模拟问题的一个非常经济有效的方案,特别是对于背景介质中与波动方程相关的格林函数是明确的或已知解析解时,例如在均匀和一维背景介质中。</p>
<p><strong>此外,其中包含我们最终想要恢复的弹性参数的数据和散射势,在$Born$近似下是线性的。这一特性大大简化了反问题的求解。$Born$近似的缺点是描述波在源-接收器界面和散射点之间传播的背景模型必须是精确的。否则,$Born$近似产生的响应误差较大。</strong></p>
<p>让我们用另一种观点解释$Born$近似,正如第10章所述,初至波要求震源和检波器均位于地下,由于我们在本章中考虑的拖缆数据是在地球表面附近生成和收集的,因此我们必须以某种方式将数据从地球表面附近的实际震源和接收器位置外推到地下的所需位置。这种外推是通过计算描述波在背景介质中传播的格林函数$G_0$来实现的。为了计算这个格林函数,我们需要知道源所在位置和散射点之间介质,以及散射点和接收器位置之间介质的性质。换句话说,我们至少需要知道地下模型的某些部分,以便重建“整个”模型。这一要求被称为基于玻恩近似的<strong>地震成像悖论</strong>。由于目前大多数地震成像方案都是基于$Born$近似的(即使这种假设在一些出版物中往往不明确),这一要求通常被称为地震成像悖论。</p>
<p>总之,用本章所提到的$Born$近似,我们必须将“从包含初至的地震数据中重建地下模型”这一问题分解为两部分:①<strong>找到背景速度模型</strong>,以使得我们能够将数据从震源-检波器界面外推到散射点上;②<strong>重建散射模型</strong>,其中包含引起散射和反射的弹性性质。在接下来的四节中,我们将重点讨论“在背景模型已知前提下重建引起散射的物理属性”这一问题。关于如何估计背景模型的讨论将在标题为“<strong>偏移</strong>”和“<strong>估计背景速度的模型</strong>”的章节中进行。</p>
<h2 id="平滑背景介质"><a href="#平滑背景介质" class="headerlink" title="平滑背景介质"></a>平滑背景介质</h2><p>如图11.7所示,方程11.9中的$Born$近似使我们能够预测初至以及多次波。由于在大多数成像中都假定数据只包含初至,因此我们需要调整11.9的$Born$近似,使预测数据满足成像假设。如果描述背景介质中波动方程的格林函数$G_0$不包含反射波,此时11.9的$Born$近似将只预测初至波。换句话说,如果我们假设背景模型是平滑的(即没有反射或只有非常弱的反射),那么11.9中的$Born$近似将只预测初至波。实现这种平滑的经典方法是将实际模型分解为两部分:低空间频率分量和高空间频率分量。$a1D$(横向不变)模型的分解示例如图11.8所示,低空间频率(长波数)分量表示背景模型,高空间频率(即短波数)分量引起散射和反射。<br><img src="/2021/06/11/IPTS_ch11_445~456/11.7_8.png" alt="11.7~8"><br>当背景模型中没有反射点时,如图11.8所示,描述波在背景介质中传播的直达波场基本上可以以旅行时和几何扩散来描述,而这两者主要取决于速度变化。这也是为什么<strong>在石油地震学中背景模型一般被称为背景速度模型</strong>。</p>
<h1 id="Born近似的局限性"><a href="#Born近似的局限性" class="headerlink" title="Born近似的局限性"></a>Born近似的局限性</h1><p>如<strong>Box 11.1</strong>所描述的那样,11.3所示$Lippmann-Schwinger $积分方程的解可以表示成$Born$级数的形式,其中此级数的前两项为$Born$近似,有时我们将这种近似称为单散射点近似。通过截断$Born$级数,只取其前两项,我们假设背景介质与实际介质十分相近,并且高于二阶的$Born$级数项均可以忽略不计。<br>下面我们以实际的声速介质为例,将$Born$近似的假设公式化。我们从$Box 11.1$中定义的散射势(散射势的表达式源自量子力学,$W$实际上是粒子散射的势,这一表达现在被那些将散射理论应用于地震学的学者们所广泛采用)出发:</p>
<script type="math/tex; mode=display">W({\rm \textbf x}, \omega)=\omega^2 \delta K({\rm \textbf x})+{\rm div}[\delta \sigma({\rm \textbf {x}}) {\rm \textbf {grad}}] \tag{11.11}</script><script type="math/tex; mode=display">\delta K({\rm \textbf x})=K({\rm \textbf x})-K_0({\rm \textbf x}), \delta \sigma({\rm \textbf x})=\sigma({\rm \textbf x})-\sigma_0({\rm \textbf x}) \tag{11.12}</script><p>其中$K_0({\rm \textbf x})$和$\sigma_0({\rm \textbf x})$分别为背景介质的压缩系数(体积模量的倒数)和比容积(密度的倒数)。$K({\rm \textbf x})$和$\sigma({\rm \textbf x})$分别为实际介质的压缩系数(体积模量的倒数)和比容积(密度的倒数)。在$Born$近似的假设中,背景介质中十分接近于实际介质,即如下公式成立</p>
<script type="math/tex; mode=display">\frac{\delta K({\rm \textbf x})}{K_0({\rm \textbf x})} \leq 1, {\rm and} \frac{\delta \sigma({\rm \textbf x})}{\sigma_0({\rm \textbf x})} \leq1 \tag{11.13}</script><p>下面我们通过比较$Born$近似法的预测数据与精确解对应的数据,来更具体地观察公式11.13所提出的假设。<br>我们必须通过$Born$近似或者利用有限差分求解波动方程的数值解,是因为精确的解析解非常少。为数不多的精确解析解一般仅限于平面波的传播。因此,这里我们将通过一维平面波的传播比较$Born$近似和精确解析解。一维模型如图11.9所示,其由一个嵌入在速度为$V_{P0}=2.0 km/s$的背景介质中的流体介质组成,其中嵌入物速度为$V_{P1}$、厚度为$h$。因此,在这一模型中的散射势可以表示为:</p>
<script type="math/tex; mode=display">W({\rm \textbf x}, \omega)=\omega^2\delta K({\rm \textbf x}) \tag{11.14}</script><p>如果我们将公式11.14带入公式11.10,将得到$Born$近似公式:</p>
<script type="math/tex; mode=display">\delta P({\rm \textbf x}_s, \omega, {\rm \textbf x}_r)=\omega^2S(\omega) \int_D {d{\rm \textbf x} G_0({\rm \textbf x}_s, \omega, {\rm \textbf x}) \delta K({\rm \textbf x})G_0({\rm \textbf x},\omega,{\rm \textbf x}_r)} \tag{11.15}</script><p>其中,$D$为$\delta K(\rm \textbf x)$的定义域,即$\delta K(\rm \textbf x)$在$D$外为null。对于一维介质中垂直于纵轴的入射平面波,方程11.15与坐标$x$和$y$无关;即</p>
<script type="math/tex; mode=display">\delta P(\omega, z_r)=\omega ^2 S(\omega) \int_{z_1}^{z_2} dz G_0(z_s=0,\omega ,z)\delta K(z)G_0(z,\omega ,z_r) \tag{11.16}</script><p>并有</p>
<script type="math/tex; mode=display">G_0(z_s, \omega, z)=-i \frac{V_{P0}}{\omega} {\rm exp}(-i \frac{\omega}{V_{P0}} |z_s-z|)\tag{11.17}</script><p>其中,$z_r$代表检波器深度,$z_s$代表震源深度。假设震源位于表面$z_s=0$。公式11.6变为:</p>
<script type="math/tex; mode=display">\delta P(\omega, z_r)=-S(\omega)\Delta K \int_{z_1}^{z_2}dz {\rm exp}[-o \frac{\omega}{V_{P0}}(z+|z-z_r|)]\tag{11.18}</script><p>其中,</p>
<script type="math/tex; mode=display">\Delta K = \frac{\delta K}{K_0}\tag{11.19}</script><p>对于反射问题(即$z_r \leq z_1$),对11.18积分可得</p>
<script type="math/tex; mode=display">\delta P(\omega, z_r)=-S(\omega) \Delta K {\rm exp}[-2i\frac{\omega}{V_{P0}}(z_1-z_r)] \times \lbrace -1+{\rm exp}(-2i\frac{\omega}{V_{P0}}h)\rbrace\tag{11.20}</script><p>公式11.20中的指数项控制了波的传播。我们可以看出其只受背景介质$V_{P0}$的影响,而与$V_{P1}$无关。换句话说,$Born$解以背景介质的速度在嵌入体中传播。我们稍后将讨论这些问题对Born解的准确性的影响。<br>11.9所示图的准确压力场可在经典的声学书中看到。所以,我们这里只给出最后的结果:</p>
<script type="math/tex; mode=display">\begin{align}
\notag
\delta P(\omega, z_r)&=-S(\omega)\frac{V_{P0}-V_{P1}}{V_{P0}+V_{P1}}{\rm exp} [-2i \frac{\omega}{V_{P1}}(z_1-z_r)] \\\\
\notag
&\times \lbrace -1 + \frac{V_{P0}V_{P1}}{(V_{P0}+V_{P1})^2} \sum_{k=0}^{k=\infty} [\frac{V_{P0}-V_{P1}}{V_{P0}+V_{P1}} \times {\rm exp}(-i\frac{\omega}{V_{P1}}h)]^{2k} \rbrace \\\\
\end{align}\tag{11.21}</script><p> 与公式11.20所示的$Born$解不同的是,在准确解中,控制波传播的指数项不但取决于背景介质速度$V_{P0}$,同时还受嵌入体速度$V_{P1}$影响。<br><img src="/2021/06/11/IPTS_ch11_445~456/11.9_10.png" alt="11.9_10"></p>
<p>在我们对方程11.20中的$Born$解和方程11.21中的精确解进行数值比较之前,我们先介绍我们即将讨论的三个重要参数:①在背景介质中传播的信号的主波长,$\lambda_0=V_{P0}/f_c$,其中$f_c$是源信号的主频;② 在嵌入体中传播的信号的主波长,$\lambda_1=V_{P1}/f_c$③嵌入体与背景介质的相对扰动,$\Delta K=\delta K/K_0$。对于下面的数值实验,源信号的主频为35Hz(见图11.10)。<br><img src="/2021/06/11/IPTS_ch11_445~456/11.11_12_13.png" alt="11.11~13"><br>图11.11、11.12和11.13比较了不同嵌入体厚度和不同速度下的$Born$解和精确解。这些计算中使用的震源信号频谱如图11.10所示。我们可以看到,对于信号在嵌入体中传播的波长远大于平板厚度的情况(即$h\leq \lambda_1$), 当相对扰动小于0.36时,$Born$近似解与精确解几乎一致。然而,随着板的厚度增加,我们可以看到,在$Born$近似解中,嵌入体底部的反射开始偏离精确解,即使$\Delta K$很小。前面我们提到了$Born$近似解与精确解存在差异的原因,即玻恩近似解是以背景介质的速度而不是以平板速度在平板中传播的。如果背景介质的速度与嵌入体速度之差较大,或者波在嵌入体中传播的持续时间足够长,则$Born$近似无法准确预测嵌入体底部反射的到达时间。</p>
<p>我们注意到,$Born$近似中的反射波到时与嵌入体的速度和厚度无关。然而,这种反射的振幅却受到嵌入体与背景介质之间的相对扰动,即$\Delta K$的影响。当$\Delta K=0.55$时,$Born$近似解误差较大。<br>另外,对于板厚为$25m$,板速度为$3.0 km/s$的情况,$Born$近似解的形状与精确解的形状似乎有很大不同。形状不同是因为<strong>玻恩</strong>近似假定波在板中以背景速度传播,它预测的两个同相轴之间有一个小的重叠,而在精确解中,基于波以实际速度传播,由于嵌入体中速度快因此两个同相轴完全重叠。<br>我们还可以看到,当$\Delta K=0.55$,$h \geq100m$时,由于背景介质是均匀的,所以在精确解中能够看到明显的层间多次波,而$Born$近似中却并不明显。如图11.7所示,如果介质是平滑的,$Born$近似无法预测层间多次波;均匀介质是平滑介质的理想情况。<br>总结来讲,$Born$近似解需要①在嵌入体中传播的波的波长要远远大于嵌入体厚度;②相对扰动要足够小。我们通过一维介质中的平面波解得出了以上结论。在更一般意义上,其由嵌入体的厚度$h$和散射势平均强度的乘积来决定。对于一维情况,$Born$近似有效的标准是:</p>
<script type="math/tex; mode=display">\frac{\delta K}{K_0} \frac{h}{\lambda_1} << 1\tag{11.22}</script><p>以上公式对于二维和三维情况下的球面波同样适用,尽管对于二维和三维介质中的球面波这一结论非常难验证。距离和全散射势的平均强度的乘积才是最重要的。<strong>成功应用$Born$近似的关键是,背景介质的选择或估计必须足够准确以捕捉实际模型中包含的所有长波长信息,而扰动模型必须基本上由短波组成。图11.8所示为理想情况下,$Born$近似将介质分解为背景介质和扰动介质。</strong></p>
<link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>地球物理数理知识</category>
</categories>
<tags>
<tag>反问题</tag>
</tags>
</entry>
<entry>
<title>Radon变换</title>
<url>/2021/05/31/ITPS_Radon644~645/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><h1 id="石油地震学中的Radon变换及快速离散Radon变换"><a href="#石油地震学中的Radon变换及快速离散Radon变换" class="headerlink" title="石油地震学中的Radon变换及快速离散Radon变换"></a>石油地震学中的Radon变换及快速离散Radon变换</h1><h2 id="Radon变换"><a href="#Radon变换" class="headerlink" title="Radon变换"></a>Radon变换</h2><p>翻译自SEG Introduction to petroleum Seismology(pp. 644~645, pp.646~648)<br>在石油地震学中,$Radon$变换首先由Chapman(1978)<sup id="fnref:1"><a href="#fn:1" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="Chapman, C. H., 1978, A new method for computing seismograms: Geophysical Journal of the Royal Astronomical Society, 54, 481–518.
">[1]</span></a></sup>等提出应用。然而,我们在石油地震学中使用的$Radon$变换与其他教科书中可能会遇到的,如Deans(1993,1996)<sup id="fnref:2"><a href="#fn:2" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="Deans, S. R., 1993, The Radon transform and some of its applications: John Wiley & Sons, Inc.
">[2]</span></a></sup><sup id="fnref:3"><a href="#fn:3" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="Deans, S. R., 1996, Radon and Abel transforms, in A. D. Poularikas, ed., The transforms and applications handbook: CRC Press, 631–717.
">[3]</span></a></sup>,略有不同。在二维空间中,函数的$Radon$变换是由沿线的积分组成的。斜截式直线可表示为:</p>
<script type="math/tex; mode=display">t=px+ \tau \tag{1}</script><p>其中斜率$p=dt/dx$,表示慢度参数,$\tau$表示截距时间,地震剖面$u(x,t)$在$z=0$处的$Radon$变换为:</p>
<script type="math/tex; mode=display">\check{u}=\iint{dx dt \delta(t-px-\tau)u(x,t)}=\int{dx u(x,\tau+px)} \tag{2}</script><p>$Fourier$变换和$Radon$变换之间的关系为:</p>
<script type="math/tex; mode=display">U(\omega p,\omega)=\int{d\tau exp(i \omega \tau)\check{u}(p, \tau)} \tag{3}</script><p>上式可简写为:</p>
<script type="math/tex; mode=display">\mathcal{F}_2u=\mathcal{F}_1 \check{u} \tag{4}</script><p>其中,$\mathcal{F}_2$和$\mathcal{F}_1$分别表示二维和一维$Fourier$变换。因此,关于截距变量$\tau$的$Radon$变换的$Fourier$变换,等价于$u(x,t)$沿$k_x=p\omega$的二维$Fourier$变换。公式$4$又被称为$Projection-Slice-Theorem$(投影切片定理,中心切片定理)。</p>
<p>$Radon$逆变换有多种表现形式,例如:</p>
<script type="math/tex; mode=display">u(x, t)=-\frac{1}{2\pi^2} \iint dp d{\tau} \frac{\partial \check{u}(p,\tau-px)/\partial \tau}{\tau -t} \tag{5}</script><p>$Radon$变换函数$\check{u}(p,x)$也被称为慢度表示($slowness representation$)、平面波分解($plane-wave-decomposition$)或倾斜叠加($slant-stack$)。倾斜叠加的描述更为清晰透彻:将波场中的值 沿“倾斜”的线进行叠加。$Radon$变换将时空域中一条斜率为$p_0$、截距为$\tau_0$的线转化为新域中的一个点$(p_0,\tau_0)$。即,Radon变换将一条线映射为一个点。$Radon$逆变换将新域中的点变为原来的线。</p>
<p>在$2D Fourier$变换中,其将一条时空域中的线转换为频率波数域中的一条线,其逆变换将$f-k$域中的线转换回$t-x$域。线$t=px+\tau$的$Fourier$变换为:</p>
<script type="math/tex; mode=display">\begin{align}
\notag
\int_{-\infty}^{\infty} \int_{-\infty}^{\infty} dx dt {\rm{exp}} [i(\omega t-k_xx)] \delta(t-px-\tau) \\\\
\notag
=\int_{-\infty}^{\infty}dx {\rm{exp}} \lbrace i [\omega(px+\tau)-k_xx] \rbrace =2\pi {\rm {exp}} (i\omega \tau) \delta (p\omega -k_x)
\end{align}\tag{6}</script><p>因此,$Fourier$变换的振幅由沿着以下公式的狄拉克函数给出:</p>
<script type="math/tex; mode=display">\omega =k_x/p \tag{7}</script><p>其相位为$\omega \tau$,且过原点(截距为0),$Fourier$变换有时空域中线的倒数斜率。另外,相位谱包含了截距$\tau$的信息。通过$Fourier$逆变换可得到原来的线:</p>
<script type="math/tex; mode=display">\frac{1}{2\pi^2} \int_{-\infty}^{\infty} \int_{-\infty}^{\infty} dk_xd{\omega} {\rm{exp}} [-i(\omega t-k_xx)] \times {\rm{exp}}(i\omega\tau) \delta(p\omega-k_x)=\delta(t-px-\tau)\tag{8}</script><p>地震学中常用的是包含非线性曲线(将公式1替换)的广义$Radon$变换($GRT$)。常用的 非线性曲线有抛物线($t=\tau+px^2$)、双曲线$t=\sqrt{(\tau^2+px^2)}$,$p$为双曲线的慢度或抛物线中慢度与位移的比值。</p>
<h2 id="关于快速离散Radon变换"><a href="#关于快速离散Radon变换" class="headerlink" title="关于快速离散Radon变换"></a>关于快速离散Radon变换</h2><p>我们简要讨论了$Radon$变换的连续形式,但在地震勘探领域的应用中,例如$\tau-p$域去除多次波<sup id="fnref:4"><a href="#fn:4" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="基于预测反褶积的多次波去除建立在多次波为周期性的基础上,但是,在时间—位移道集,例如共炮点道集、共中心点道集或者共检波点道集中,当偏移距非零时,时间剖面上的多次波通常不是周期性的。Taner(1980)首先认识到层状介质中的多次波沿径向轨迹是周期性的(固定$p$)。径向道之间的时间间隔不同。因此,可以从每个$p$道的自相关图中设计一个预测反褶积算子,并将其应用于$(\tau, p)$域衰减多次波,其中初至和多次波为椭圆。
">[4]</span></a></sup>等,我们需要一种快速、数字化的$Radon$变换来处理离散地震数据。Mersereau和Oppenheim(1974)<sup id="fnref:5"><a href="#fn:5" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="Mersereau, R. M., and A. V. Oppenheim, 1974, Digital reconstruction of multidimensional signals from their projections: Proceedings of the IEEE, 62, 1319–1338.">[5]</span></a></sup>将非笛卡尔网格引入二维傅里叶变换中,其被称为同心网格视图($concentric-squares grid$)。Averbuch等(个人交流,2003)提出了基于同心网格的离散$Radon$变换—伪极坐标网格,其计算效率更高且可通过$FFT$求逆。<br>在这里,我们利用同心网格或作者们所称的伪极坐标网格来将数据转换到二维傅里叶空间中。对于大多数地震数据处理领域的应用而言,将数据转换到同心网格的三角形子域足矣。所以,我们将这种数据转换方式称为三角傅里叶转换。<br>在我们考虑三角傅里叶变换之前,首先讨论投影切片(Radon变换基础的定理,公式$4$)的使用方法。投影切片定理认为$Radon$变换可通过以下方式获得:</p>
<ol>
<li>对时空域数据$(x,t)$做二维傅里叶变换</li>
<li>得到二维傅里叶变换的径向切片</li>
<li>对径向切片做一维傅里叶逆变换</li>
</ol>
<p>投影切片定理可用于离散数据,即分别将步骤1和3替换为笛卡尔网格中的二维和一维傅里叶变换。然而,由于傅立叶域的径向切片通常不与二维FFT输出的笛卡尔网格相交,我们需要在第二步中插值。<br>对于其中的插值,我们做更细致的解释。采样的时空域数据$u(nx\Delta x, nt\Delta t)$,其中$nx=1, 2, …, NX$以及$nt=0, 2, …, NT-1$, $\Delta x$和$\Delta t$分别为空间和时间采样间隔。二维傅里叶变换将时空域数据转换到相应的频率波数域。$Nyquist$频率和$Nyquist$波数分别为$\omega^{N}=\pi/\Delta t$和$k^{N}_x=\pi/\Delta x$。由于$u$为实数,因此我们只需考虑零频和正频率。最大不超过$Nyquist$的零频和正频率值为$n\omega =0, 2, …, NW$,($NW=NT/2$)。频率采样间隔为:</p>
<script type="math/tex; mode=display">\Delta \omega = 2\omega^{(N)}/NT \tag{9}</script><p>所有的正频率和负频率都需要考虑在内,$nkx=-NX/2+1,-NX/2+2,…,-,0,1,…,NX/2-1,NX/2$。波数$NKX$的数量等于空间采样点数$NX$。波数采样间隔为:</p>
<script type="math/tex; mode=display">\Delta k_x=2k^N_x/NX\tag{10}</script><p>采样二维傅里叶变换为$U(nkx\Delta k_x, n\omega \Delta \omega)$。为表述方便,我们将其简写为$U(nkx, n\omega)$,即不将数据的采样间隔显式表示。<br>时空域到频波域的二维傅里叶变换由两个运算构成,首先,对数据$u(nx,nt)$做时间$FFT$。得到:</p>
<script type="math/tex; mode=display">\tilde{U}(nx,n\omega) = \sum^{NT-1}_{nt=0}u(nx,nt) {\rm{exp}} (i \frac{2\pi n\omega nt}{NT}) \tag{11}</script><script type="math/tex; mode=display">n\omega=0,...,NT/2</script><p>其中$\tilde{U}(nx,n\omega)$为$u(nx,nt)$对于时间的傅里叶变换。然后,对$U(nx,n\omega)$做空间$FFT$,将空间转换为波数:</p>
<script type="math/tex; mode=display">U(nkx, n\omega)=\sum^{NX/2}_{nx=-NX/2+1} \tilde{U}(nx,n\omega) \times {\rm{exp}}(-i\frac{2\pi nkxnx}{NX})\tag{12}</script><script type="math/tex; mode=display">nkx=-NX/2+1,...,NX/2</script><p><img src="/2021/05/31/ITPS_Radon644~645/fig01.png" alt="fig01"><br>通常,我们将波数和正频率分别沿水平方向和垂直方向绘图。图1展示了$NT=32$、$NX=16$的$\omega-k_x$网格。这里,$NW=16,NKX=16$。<br>但是,图1所示网格并不适用于离散$Radon$变换。$Fourier$切片定理中,对截距变量$\tau$的$Radon$变换的$Fourier$变换,等价于$u(x,t)$沿$k_x=p\omega$的二维$Fourier$变换。在数值计算中,由于$u(nx,nt)$的二维$FFT$是定义在规则网格$\omega-k_x$上的,即其为频率-波数的函数,也就是说通常需要将$\omega-k_x$网格插值为线$k_x=p\omega$(对于不同$p$),来得到$U(nkx,n\omega)$。<br><img src="/2021/05/31/ITPS_Radon644~645/fig02.png" alt="fig02"><br>另外,利用伪极坐标或三角法,傅里叶变换解决了上述需要插值的问题。三角傅里叶变换($T-FFT$)结合了传统对时间采样点的$FFT$和修正的对于空间采样点的$FFT$。在空间$FFT$(公式$12$)中,令</p>
<script type="math/tex; mode=display">nx \to 2nx n\omega /NT, n\omega =0,...,NT/2\tag{13}</script><p>输出非笛卡尔系的坐标数据(如图2所示),我们将这一伪极坐标网格的子集称为三角网格。Mersereau和Oppenheim(1974)<sup id="fnref:5"><a href="#fn:5" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="Mersereau, R. M., and A. V. Oppenheim, 1974, Digital reconstruction of multidimensional signals from their projections: Proceedings of the IEEE, 62, 1319–1338.">[5]</span></a></sup>首先提出了此类网格,这种网格可以实现快速傅立叶计算。采用伪极坐标网格的具体思路,Averbuch提出了快速倾斜叠加(2003年)。<br>$T-FFT$沿着特定的线$k_x=p\omega$输出$Fourier$变换后的数据。采样线为$npx=-NPX/2+1,-NPX/2+2,…,-1,0,1,…,NPX/2-1,NPX/2$。线的数量$NPX$等于波数的数量$NKX$,同时也等于空间采样数$NX$。对于$f_x \geq 0$,</p>
<script type="math/tex; mode=display">p_0=0</script><script type="math/tex; mode=display">p_1=\Delta kx/\omega^{(N)}=\frac{1}{(NX/2)} \frac{\Delta t}{\Delta x}</script><script type="math/tex; mode=display">p_npx=npx \Delta k_x/ \omega^{(N)}=\frac{1}{(NX/2)} \frac{\Delta t}{\Delta x}</script><script type="math/tex; mode=display">p_{NPX/2}=k^{(N)}_x/{\omega}^{(N)}</script><p>这些线在斜率上等距分布,距离间隔为慢度采样间隔:</p>
<script type="math/tex; mode=display">\Delta p=\frac{1}{(NX/2)} \frac{\Delta t}{\Delta x}</script><p><img src="/2021/05/31/ITPS_Radon644~645/fig03.png" alt="fig02"><br>但是它们有不同的长度(半径)。此外,如图3所示,频率波数域蓝色三角区域之外的信号信息在$T-FFT$变换后将不存在。所以,$T-FFT$对地震数据进行了隐式的速度滤波。例如,当$\Delta t=0.008 ms$、$\Delta x=12.5m$时,线$NPX/2$对应视速度$p^{-1}_{NPX/2}=1562.5 m/s$,任何低于视速度的信号都将被滤掉。<br>对每一个$p$道做一维逆傅里叶变换即可得到$Radon$变换后的数据。离散$Radon$变换是精确的、可逆的且能够快速计算的。这里我们详细阐述了如何对二维地震数据做$Radon$变换。同时能够将这一步骤直接推广到三维$Radon$变换的计算中,或者$\tau-p_x-p_y$变换,或者三维地震数据$u(nx,ny,nt)$($ny=1,…,NY$,$NY$为$crossline$方向的道数)中。在空间$FFT$中由坐标$y$转换为波数$k_y$,只需要作如下替换$ny \to 2ny n\omega /NT$。</p>
<p><details><summary>参考文献</summary></details></p>
<div id="footnotes"><hr><div id="footnotelist"><ol style="list-style: none; padding-left: 0; margin-left: 40px"><li id="fn:1"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">1.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">Chapman, C. H., 1978, A new method for computing seismograms: Geophysical Journal of the Royal Astronomical Society, 54, 481–518.<a href="#fnref:1" rev="footnote"> ↩</a></span></li><li id="fn:2"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">2.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">Deans, S. R., 1993, The Radon transform and some of its applications: John Wiley & Sons, Inc.<a href="#fnref:2" rev="footnote"> ↩</a></span></li><li id="fn:3"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">3.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">Deans, S. R., 1996, Radon and Abel transforms, in A. D. Poularikas, ed., The transforms and applications handbook: CRC Press, 631–717.<a href="#fnref:3" rev="footnote"> ↩</a></span></li><li id="fn:4"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">4.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">基于预测反褶积的多次波去除建立在多次波为周期性的基础上,但是,在时间—位移道集,例如共炮点道集、共中心点道集或者共检波点道集中,当偏移距非零时,时间剖面上的多次波通常不是周期性的。Taner(1980)首先认识到层状介质中的多次波沿径向轨迹是周期性的(固定$p$)。径向道之间的时间间隔不同。因此,可以从每个$p$道的自相关图中设计一个预测反褶积算子,并将其应用于$(\tau, p)$域衰减多次波,其中初至和多次波为椭圆。<a href="#fnref:4" rev="footnote"> ↩</a></span></li><li id="fn:5"><span style="display: inline-block; vertical-align: top; padding-right: 10px; margin-left: -40px">5.</span><span style="display: inline-block; vertical-align: top; margin-left: 10px;">Mersereau, R. M., and A. V. Oppenheim, 1974, Digital reconstruction of multidimensional signals from their projections: Proceedings of the IEEE, 62, 1319–1338.<a href="#fnref:5" rev="footnote"> ↩</a></span></li></ol></div></div><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>地球物理数理知识</category>
</categories>
<tags>
<tag>Radon</tag>
</tags>
</entry>
<entry>
<title>速度分析</title>
<url>/2021/06/09/ITPS_pp500~503/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><h1 id="估计背景速度的模型"><a href="#估计背景速度的模型" class="headerlink" title="估计背景速度的模型"></a>估计背景速度的模型</h1><p>翻译自SEG Introduction to petroleum Seismology(pp. 500~503)</p>
<h2 id="背景速度估计与成像之间的联系"><a href="#背景速度估计与成像之间的联系" class="headerlink" title="背景速度估计与成像之间的联系"></a>背景速度估计与成像之间的联系</h2><p>前面章节中描述的成像算法,其成功与否取决与背景速度模型的准确性。换句话说,我们只有知道一部分地下模型,才能重构出“整个”模型,这又被称为地震成像悖论。正如本章第一节所描述的,这一悖论是由于我们当前使用的成像技术中显式或隐式地使用了Born近似所致。</p>
<p>幸运的是,如果地质构造不太复杂的话,能够用于成像的较为准确的速度模型,其也可以用来估计背景模型。如图11.46所示,其中只有一条反射同相轴,与同相轴相关的检波点的成像对于速度非常敏感。如前面章节所述,我们需要对由于偏移距所产生的旅行时差异(moveout)进行校正和叠加。如图11.47所示,对于一个包含三个同相轴的记录,正确的背景速度能够得到最大振幅动校正(maximun-amplitude-moveout correction)并将同相轴“拉平”。这一想法相当于“聚焦”地震道,以得到最大响应。当地震道正确排列时(即动校正完全时),地震道记录的总和将最大。这种想法类似于透镜或抛物面透镜对平面波的聚焦作用。<br><img src="/2021/06/09/ITPS_pp500~503/11.46.png" alt="11.46"><br>因此,重建背景速度的基本思想是使用各种速度模型对数据进行成像,并选择能够对地下构造聚焦的模型。估计背景速度模型的两个关键点,一是成像算法,二是确定最佳速度模型的准则。在例11.46和1.47中,为了简化问题,我们使用动校正和叠加进行成像,能够使叠加结果振幅最大的模型为正确模型。(对Box11.9不做介绍)<br><img src="/2021/06/09/ITPS_pp500~503/11.47.png" alt="11.47"><br>时间域成像和深度域成像是两种最常用的成像手段。时间域成像的背景速度是均方根速度,深度域成像的背景速度是实际速度(也称层速度)。实现$focus$和$defocus$的思想在时间域和深度域成像中有非常大的不同。时间域成像中违反了斯奈尔定律,所以聚焦和散焦可以应用于数据中的每个单独的同相轴,并且其独立于其它同相轴。我们可以通过在一系列均匀、非均匀速度模型上偏移来同时扫描所有同相轴,进而估计均方根速度。图11.47中,同时扫描了三个同相轴。</p>
<p>在深度域成像中,由于没有使用常速度模型作为背景速度,因此我们没有违反斯奈尔定律。所以,要想将某一深度上的同相轴还原到深度域其构造上,就必须知道该层以上的所有的准确速度。所以我们必须从地表开始逐层扫描,以获得实际的速度,或者我们可以扫描一系列不均匀速度模型来获得背景速度。后文中将详细介绍用于深度域成像的恢复层速度的方法。下面,我们从时间域成像开始介绍速度估计。</p>
<h2 id="速度谱"><a href="#速度谱" class="headerlink" title="速度谱"></a>速度谱</h2><p>11.47(b)中的曲线图即为<strong>速度谱</strong>。图中所示的量为对CMP道集动校正并叠加后的振幅。速度谱中另一个量是<code>Box 11.9</code>中定义的<code>semblance</code>。实际上,速度谱通常是基于<code>semblance</code>,如图11.48所示。我们可以看到,图11.48中<code>semblance</code>在反射波较强时更为突出。图11.48和11.49中的合成地震数据均通过有限差分计算得到。尽管图中只显示了纵波速度模型,但正演是基于弹性波的,这里我们主要考虑P-P反射。在图11.49中,这些强反射用红色表示。我们可以根据均方根速度通常随着时间或深度增加这一事实来对其进行选择。此外,由此选择的速度与理论计算的均方根速度(白色曲线)拟合较好。<br><img src="/2021/06/09/ITPS_pp500~503/11.48.png" alt="11.48"><br>需要注意的是,我们可以在<code>semblance</code>图红色区域选择不同的值,但是其中一些值代表多次波,它们并不会参与均方根速度的计算。均方根速度通常会随时间和深度增加使我们能够避免选择与多次波相关的红色峰值。<br><img src="/2021/06/09/ITPS_pp500~503/11.49.png" alt="11.49"><br>在<code>semblance</code>图上选择正确的速度是非常困难的。例如,11.49所示的炮集记录和速度谱对应于一个较为简单的模型,该模型包含一个高速玄武岩层,与图11.48不同的是,理论计算的均方根速度与<code>semblance</code>图3s位置选取的红色峰值处并不匹配。这种误差是非双曲的旅行时变化造成的,而我们的速度谱是基于动校正叠加计算的,也即暗含了时距曲线是双曲线这一假设(动校正量为双曲)。换句话说,这种误差是我们成像工具的局限性以及聚焦和散焦的局限性所致。在下一小节中,我们将讨论这种聚焦和散焦思想在复杂成像工具中的扩展。</p>
<p>图11.49中的<code>semblance</code>图也显示,与图11.48中的<code>semblance</code>图相比,强振幅同相轴到达时间更晚。显然,这些波明显不是初至,而是多次波和转换波。这一结果说明了区分玄武岩上方产生的多次波和真正的初至是非常困难的。</p>
<h1 id="偏移速度分析"><a href="#偏移速度分析" class="headerlink" title="偏移速度分析"></a>偏移速度分析</h1><p>如图11.48和11.49所示的均方根速度估计是基于动校正和叠加的。这种方法只有在检波器水平分布且时距曲线为双曲线时才有意义,当界面倾角较大时,速度模型的误差也会较大。<br>另一种方法是使用如公式11.202所示的叠前时间偏移算法来取代动校正和叠加。我们以$\Delta V$对$V_{min}$~$V_{max}$之间的速度进行常速偏移,在图11.50所示例子中,$V_{min}=2050 m/s$~$V_{max}=3350 m/s$,$\Delta V=50m/s$。偏移结果如图11.50所示(以 $200m/s$为间隔)。我们仍然可以十分清楚地看到同相轴能够聚焦,即使使用的速度模型偏离正确速度。例如,同相轴$A$和$B$在$2050m/s$的速度模型下偏移效果最好,而同相轴$C$在$3050m/s$的速度模型下偏移效果最好。这个例子证明了任何成像算法都能够用于速度估计。基于叠前时间偏移的速度估计方法被称为<strong>偏移速度分析</strong>。</p>
<p>通过拼接11.50中基于不同常速模型的偏移结果即可得到最终成像结果,这样一来,每一部分的成像剖面都有较为正确的速度。</p>
<h1 id="速度建模"><a href="#速度建模" class="headerlink" title="速度建模"></a>速度建模</h1><p>在进行深度域成像之前,必须要获得较为准确的深度模型,或者,同时获得深度成像结果和深度域成像模型。首先,速度模型被认为是一系列的速度函数,建立这些函数的过程被称为<strong>速度建模</strong>。</p>
<p>速度建模是一个不断迭代的过程,并且通常是一层一层来进行的,通过不断输入新的信息细化每次迭代的结果。正如所有的迭代处理过程,速度建模的第一个步骤是要获得<strong>初始速度模型</strong>。</p>
<h3 id="建立初始速度模型"><a href="#建立初始速度模型" class="headerlink" title="建立初始速度模型"></a>建立初始速度模型</h3><p>建立初始速度模型的两种常用方法为:均方根速度(时间域成像)或层速度。均方根速度是从CMP道集的<code>semblance</code>图中选取的,然后可利用<strong>Dix</strong>公式(Box 3.3)将其转换为层速度。初始速度模型即可以构建出初始模型。</p>
<p>正如我们在“反问题示例的关键假设”一节中所阐述的,我们需要对层速度模型进行平滑,以避免不平滑速度场中包含的突变界面层可能会产生的虚假构造。</p>
<h3 id="迭代过程"><a href="#迭代过程" class="headerlink" title="迭代过程"></a>迭代过程</h3><p>第一步是使用初始速度模型进行叠前深度偏移,然后进行<strong>剩余动校正分析</strong>。(剩余动校正分析,<strong>RMO</strong>,是在共反射点道集上计算得到的剩余时差量)。<strong>RMO</strong>分析之后,我们再次修正速度模型以使得<strong>RMO</strong>在<strong>CRP</strong>(Common-reflection-point)道集上最小。</p>
<p>有两种基本方法来获得最终的速度模型:<strong>层析方法</strong>和<strong>全局方法</strong>。<br><strong>层析方法</strong>从顶层开始,一次只处理一层,每层都会包含地球物理和地质约束。当顶层处理结束并且速度收敛到一个“真值”时,我们将该层“锁定”以使得其不再被修改,然后对下一层进行修正。重复以上步骤,直到所有层都被处理完毕。这种方法通常被用于复杂构造区,如图11.51所示。<br><strong>全局方法</strong>即同时对整个模型进行处理。每一层都有其地球物理和地质约束,但与层析方法不同的是,在每次迭代中都对整个模型进行修正,直到模型收敛到设定的极小值,如图11.52所示。<br><img src="/2021/06/09/ITPS_pp500~503/11.51_11.52.png" alt="11.51"></p>
<p>备注:其它图片请到原文中查看。<a href="ori.pdf">点击下载</a></p>
<link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>地球物理数理知识</category>
</categories>
<tags>
<tag>速度分析</tag>
</tags>
</entry>
<entry>
<title>如何在Python环境中使用Madagascrar函数</title>
<url>/2021/06/04/Madagascrar_01/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><h1 id="Madagascrar-python"><a href="#Madagascrar-python" class="headerlink" title="Madagascrar-python"></a>Madagascrar-python</h1><p>这里简单讲解如何在<code>python</code>中使用<code>Madagascrar</code>中的函数,读者需要自行安装好<code>swig</code>、<code>Madagascrar</code>、<code>python</code>、<code>numpy</code>等环境。</p>
<p>实际应用中有下列网址可供参考:<br>Madagascrar官方:<a href="https://reproducibility.org/wiki/Main_Page">https://reproducibility.org/wiki/Main_Page</a><br>Madagascrar模块介绍:<a href="https://reproducibility.org/RSF/">https://reproducibility.org/RSF/</a><br>SWIG官方:<a href="http://www.swig.org/tutorial.html">http://www.swig.org/tutorial.html</a></p>
<p>安装完<code>Madagascrar</code>之后,即可在<code>python</code>中调用<code>m8r module</code>来使用其中的各种函数,本文以源码下<code>/src/bei/ft1/autocor/SConstruct</code>为例简单讲述如何在<code>python</code>中调用<code>Madagascrar</code>中的函数。<code>autocor</code>源码主要展示了利用<code>spike</code>和<code>causint</code>函数来创建不同信号。我们经常需要在<code>python</code>脚本中实现各类数学变换以满足开发需求,通过<code>python</code>调用<code>Madagascrar</code>中相关函数的方式能够极大的简化我们的开发过程,提升开发效率。</p>
<p>首先,在<code>/src/bei/ft1/autocor</code>路径下打开<code>terminal</code>,执行<code>scons</code>命令,即可按照脚本<code>SConstruct</code>中命令的顺序获得所需要的文件,下面我们逐条语句解释<code>SConstruct</code>中出现的各种<code>Madagascrar</code>命令,并以纯<code>numpy</code>语句和<code>python</code>中<code>Madagascrar</code>语句(<code>m8r.command</code>)两种形式来实现相同功能。以下语句均在Linux环境下<code>Jupyter notebook</code>中完成。</p>
<h1 id="引入相关模块"><a href="#引入相关模块" class="headerlink" title="引入相关模块"></a>引入相关模块</h1><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> m8r, os, math</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line">n1 = <span class="number">128</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">integrate</span>(<span class="params">d</span>):</span><br><span class="line"> t = <span class="number">0</span></span><br><span class="line"> d_copy = np.zeros_like(d)</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n1):</span><br><span class="line"> t += d[i]</span><br><span class="line"> d_copy[i] += t</span><br><span class="line"> <span class="keyword">return</span> d_copy</span><br></pre></td></tr></table></figure>
<h1 id="Spike"><a href="#Spike" class="headerlink" title="Spike"></a>Spike</h1><h2 id="SConstruct源码"><a href="#SConstruct源码" class="headerlink" title="SConstruct源码"></a><code>SConstruct</code>源码</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Flow(<span class="string">'spike'</span>,None,<span class="string">'spike n1=%d o1=0 d1=1 label1=" " '</span> % n1)</span><br></pre></td></tr></table></figure>
<p>该语句通过<code>spike</code>函数(可在<code>terminal</code>中输入<code>sfspike</code>查看该函数的功能及所需参数,当需要查看Flow中出现函数的<code>doc</code>时,需要在该命令前加前缀<code>sf</code>)创建了一个共<code>n1=128</code>个采样点、每个采样点的值均为<code>1</code>的一维信号,并将其生成的文件保存在<code>./spike.rsf</code>中。</p>
<p>在<code>python</code>中读取<code>rsf</code>文件,需要用到<code>m8r</code>中的<code>Input</code>函数:<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">spike_file = m8r.Input(os.path.join(root_path, <span class="string">'spike.rsf'</span>))</span><br></pre></td></tr></table></figure><br>当需要读取该文件中的数据时,需要用的<code>read</code>方法:<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">spike = spike_file.read()</span><br></pre></td></tr></table></figure><br>此时,<code>./spike.rsf</code>文件中的数据就已经被保存到了名为<code>spike</code>的<code>numpy</code>变量中。</p>
<h2 id="m8r方法"><a href="#m8r方法" class="headerlink" title="m8r方法"></a><code>m8r</code>方法</h2><p>使用如下语句即可在<code>python</code>中调用<code>Madagascrar</code>函数:<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">n1 = <span class="number">128</span></span><br><span class="line">spike_op = m8r.spike(n1=n1, o1=<span class="number">0</span>, d1=<span class="number">1</span>, label1=<span class="string">" "</span>)</span><br><span class="line">spike2 = np.zeros(n1)</span><br><span class="line">spike2 = spike_op.apply(spike2)</span><br></pre></td></tr></table></figure><br>首先,<code>m8r.spike(n1=n1, o1=0, d1=1, label1=" ")</code>创建了一个<code>operation</code>赋值给<code>spike_op</code>,表示需要进行的运算;同时我们创建一个元素均为0的一维数据<code>spike2</code>,其数据类型为<code>float64</code>,使用<code>spike_op</code>的<code>apply</code>方法即可即可将该运算的结果赋值给<code>spike2</code>,此时<code>spike2</code>的数据类型已经变为了<code>float32</code>。</p>
<h2 id="numpy方法"><a href="#numpy方法" class="headerlink" title="numpy方法"></a><code>numpy</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">n1 = <span class="number">128</span></span><br><span class="line">spike3 = np.ones(n1, dtype=np.float32)</span><br></pre></td></tr></table></figure>
<p>使用<code>plt.plot</code>对以上三种方法所得到的数据进行绘图,均可得到如下所示图件:<br><img src="/2021/06/04/Madagascrar_01/spike01.png" alt="spike01"></p>
<h1 id="Cos"><a href="#Cos" class="headerlink" title="Cos"></a>Cos</h1><p>该示例使用<code>math</code>函数生成了一个角频率为<code>(2*math.pi*6/n1)</code>的弦信号。</p>
<h2 id="SConstruct源码-1"><a href="#SConstruct源码-1" class="headerlink" title="SConstruct源码"></a><code>SConstruct</code>源码</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Flow(<span class="string">'cos'</span>,<span class="string">'spike'</span>,<span class="string">'math output="cos(%g*x1)" '</span> % (2*math.pi*6/n1))</span><br></pre></td></tr></table></figure>
<p>读取源码所生成的数据:<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">cos_file = m8r.Input(os.path.join(root_path, <span class="string">'cos.rsf'</span>))</span><br><span class="line">cos = cos_file.read()</span><br></pre></td></tr></table></figure></p>
<h2 id="m8r方法-1"><a href="#m8r方法-1" class="headerlink" title="m8r方法"></a><code>m8r</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">cos_op = m8r.math(output=<span class="string">"cos(%g*x1)"</span>%((<span class="number">2</span>*np.pi*<span class="number">6</span>/n1)))</span><br><span class="line">cos2 = np.zeros(n1, dtype=np.float32)</span><br></pre></td></tr></table></figure>
<h2 id="numpy方法-1"><a href="#numpy方法-1" class="headerlink" title="numpy方法"></a><code>numpy</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">w = <span class="number">2</span>*np.pi*<span class="number">6</span>/n1</span><br><span class="line">x = np.arange(<span class="number">0</span>, n1, <span class="number">1</span>, dtype=np.float32)</span><br><span class="line">cos3 = np.cos(w*(x)).astype(np.float32)</span><br></pre></td></tr></table></figure>
<p>使用<code>plt.plot</code>对以上三种方法所得到的数据进行绘图,均可得到如下所示图件:<br><img src="/2021/06/04/Madagascrar_01/cos.png" alt="cos"></p>
<h1 id="Sinc"><a href="#Sinc" class="headerlink" title="Sinc"></a>Sinc</h1><p>该示例通过<code>spike</code>函数生成了一个采样函数。</p>
<h2 id="SConstruct源码-2"><a href="#SConstruct源码-2" class="headerlink" title="SConstruct源码"></a><code>SConstruct</code>源码</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Flow(<span class="string">'sinc'</span>,<span class="string">'spike'</span>,</span><br><span class="line"> <span class="string">'math output="%g*(x1+%g)" | math output="sin(input)/input" '</span> %</span><br><span class="line"> (12*math.pi/n1,1-0.001-n1//2)</span><br></pre></td></tr></table></figure>
<p>读取数据:<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">sinc_file = m8r.Input(os.path.join(root_path, <span class="string">'sinc.rsf'</span>))</span><br><span class="line">sinc = sinc_file.read()</span><br></pre></td></tr></table></figure></p>
<h2 id="m8r方法-2"><a href="#m8r方法-2" class="headerlink" title="m8r方法"></a><code>m8r</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">sinc_op1 = m8r.math(output=<span class="string">"%g*(x1+%g)"</span>%((<span class="number">12</span>*np.pi/n1,<span class="number">1</span>-<span class="number">0.001</span>-n1//<span class="number">2</span>)))</span><br><span class="line">sinc_op2 = m8r.math(output=<span class="string">"sin(input)/input"</span>)</span><br><span class="line">sinc2 = np.zeros(n1)</span><br><span class="line">sinc2 = sinc_op2.apply(sinc_op1.apply(sinc2))</span><br></pre></td></tr></table></figure>
<h2 id="numpy方法-2"><a href="#numpy方法-2" class="headerlink" title="numpy方法"></a><code>numpy</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">x = (<span class="number">12</span>*math.pi/n1)*(np.arange(<span class="number">0</span>, n1, <span class="number">1</span>)+<span class="number">1</span>-<span class="number">0.001</span>-n1//<span class="number">2</span>)</span><br><span class="line">sinc3 = np.sin(x)/x</span><br></pre></td></tr></table></figure>
<p>使用<code>plt.plot</code>对以上三种方法所得到的数据进行绘图,均可得到如下所示图件:<br><img src="/2021/06/04/Madagascrar_01/sinc.png" alt="sinc"></p>
<h1 id="Widebox"><a href="#Widebox" class="headerlink" title="Widebox"></a>Widebox</h1><p>该示例使用<code>spike</code>生成了一个有两个尖脉冲的信号,并使用<code>causint</code>对其积分得到门信号。</p>
<h2 id="SConstruct源码-3"><a href="#SConstruct源码-3" class="headerlink" title="SConstruct源码"></a><code>SConstruct</code>源码</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Flow(<span class="string">'widebox'</span>,None,</span><br><span class="line"> <span class="string">'spike n1=%d o1=0 d1=1 nsp=2 k1=%d,%d mag=1,-1 | causint'</span> %</span><br><span class="line"> (n1,n1//8+1,n1//8+3*n1//16))</span><br></pre></td></tr></table></figure>
<h2 id="m8r方法-3"><a href="#m8r方法-3" class="headerlink" title="m8r方法"></a><code>m8r</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">widebox_op1 = m8r.spike(n1=n1, o1=<span class="number">0</span>, d1=<span class="number">1</span>, nsp=<span class="number">2</span>, k1=[n1//<span class="number">8</span>+<span class="number">1</span>,n1//<span class="number">8</span>+<span class="number">3</span>*n1//<span class="number">16</span>], mag=[<span class="number">1</span>,-<span class="number">1</span>])</span><br><span class="line"><span class="comment"># signal</span></span><br><span class="line">widebox2 = np.zeros(n1)</span><br><span class="line">widebox2 = widebox_op1.apply(widebox2)</span><br><span class="line"><span class="comment"># apply intergrate</span></span><br><span class="line">widebox_op2 = m8r.causint()</span><br><span class="line">widebox2 = widebox_op2.apply(widebox2)</span><br></pre></td></tr></table></figure>
<h2 id="numpy方法-3"><a href="#numpy方法-3" class="headerlink" title="numpy方法"></a><code>numpy</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"></span><br><span class="line">widebox3 = np.zeros(n1)</span><br><span class="line">widebox3[n1//<span class="number">8</span>] = <span class="number">1</span></span><br><span class="line">widebox3[n1//<span class="number">8</span>+<span class="number">3</span>*n1//<span class="number">16</span>-<span class="number">1</span>] = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line">temp = np.zeros_like(widebox3)</span><br><span class="line"><span class="comment"># apply intergrate</span></span><br><span class="line">temp = integrate(widebox3)</span><br></pre></td></tr></table></figure>
<p>使用<code>plt.plot</code>对以上三种方法所得到的数据进行绘图,均可得到如下所示图件:</p>
<p>积分前:<br><img src="/2021/06/04/Madagascrar_01/widebox_a.png" alt="widebox_a"><br>积分后:<br><img src="/2021/06/04/Madagascrar_01/widebox_b.png" alt="widebox_b"></p>
<h1 id="Narrowbox"><a href="#Narrowbox" class="headerlink" title="Narrowbox"></a>Narrowbox</h1><p>与上类似。</p>
<h2 id="SConstruct源码-4"><a href="#SConstruct源码-4" class="headerlink" title="SConstruct源码"></a><code>SConstruct</code>源码</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Flow(<span class="string">'narrowbox'</span>,None,</span><br><span class="line"> <span class="string">'spike n1=%d o1=0 d1=1 nsp=2 k1=%d,%d mag=1,-1 | causint'</span> %</span><br><span class="line"> (n1,n1//8+1,n1//8+n1//16))</span><br></pre></td></tr></table></figure>
<h2 id="m8r方法-4"><a href="#m8r方法-4" class="headerlink" title="m8r方法"></a><code>m8r</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">narrowbox_op1 = m8r.spike(n1=n1, o1=<span class="number">0</span>, d1=<span class="number">1</span>, nsp=<span class="number">2</span>, k1=[n1//<span class="number">8</span>+<span class="number">1</span>,n1//<span class="number">8</span>+n1//<span class="number">16</span>], mag=[<span class="number">1</span>,-<span class="number">1</span>])</span><br><span class="line">narrowbox2 = np.zeros(n1)</span><br><span class="line">narrowbox2 = narrowbox_op1.apply(narrowbox2)</span><br><span class="line"><span class="comment"># apply intergrate</span></span><br><span class="line">narrowbox_op2 = m8r.causint()</span><br><span class="line">narrowbox2 = widebox_op2.apply(narrowbox2)</span><br></pre></td></tr></table></figure>
<h2 id="numpy方法-4"><a href="#numpy方法-4" class="headerlink" title="numpy方法"></a><code>numpy</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">narrowbox3 = np.zeros(n1)</span><br><span class="line">narrowbox3[n1//<span class="number">8</span>] = <span class="number">1</span></span><br><span class="line">narrowbox3[n1//<span class="number">8</span>+n1//<span class="number">16</span>-<span class="number">1</span>] = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line">temp = np.zeros_like(narrowbox3)</span><br><span class="line"><span class="comment"># apply intergrate</span></span><br><span class="line">temp = integrate(narrowbox3)</span><br></pre></td></tr></table></figure>
<p>使用<code>plt.plot</code>对以上三种方法所得到的数据进行绘图,均可得到如下所示图件:<br>积分前:<br><img src="/2021/06/04/Madagascrar_01/narrowbox_a.png" alt="narrowbox_a"><br>积分后:<br><img src="/2021/06/04/Madagascrar_01/narrowbox_b.png" alt="narrowbox_b"></p>
<h1 id="Twin"><a href="#Twin" class="headerlink" title="Twin"></a>Twin</h1><p>该示例生成了一个具有两个尖脉冲的信号。</p>
<h2 id="SConstruct源码-5"><a href="#SConstruct源码-5" class="headerlink" title="SConstruct源码"></a><code>SConstruct</code>源码</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Flow(<span class="string">'twin'</span>,None,</span><br><span class="line"> <span class="string">'spike n1=%d o1=0 d1=1 nsp=2 k1=1,%d'</span> % (n1,1+3*n1//16))</span><br></pre></td></tr></table></figure>
<h2 id="m8r方法-5"><a href="#m8r方法-5" class="headerlink" title="m8r方法"></a><code>m8r</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">twin_op = m8r.spike(n1=n1, o1=<span class="number">0</span>, d1=<span class="number">1</span>, nsp=<span class="number">2</span>, k1=[<span class="number">1</span>,<span class="number">1</span>+<span class="number">3</span>*n1//<span class="number">16</span>])</span><br><span class="line">twin = np.zeros(n1)</span><br><span class="line">twin = twin_op.apply(twin)</span><br></pre></td></tr></table></figure>
<h2 id="numpy方法-5"><a href="#numpy方法-5" class="headerlink" title="numpy方法"></a><code>numpy</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">twin2 = np.zeros(n1)</span><br><span class="line">twin2[<span class="number">0</span>] = <span class="number">1</span></span><br><span class="line">twin2[<span class="number">3</span>*n1//<span class="number">16</span>] = <span class="number">1</span></span><br></pre></td></tr></table></figure>
<p>使用<code>plt.plot</code>对以上三种方法所得到的数据进行绘图,均可得到如下所示图件:<br><img src="/2021/06/04/Madagascrar_01/twin.png" alt="twin"></p>
<h1 id="Double"><a href="#Double" class="headerlink" title="Double"></a>Double</h1><p>该示例使用<code>spike</code>生成了一个具有四个尖脉冲的信号,并使用<code>causint</code>对其进行积分。</p>
<h2 id="SConstruct源码-6"><a href="#SConstruct源码-6" class="headerlink" title="SConstruct源码"></a><code>SConstruct</code>源码</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Flow(<span class="string">'doublebox'</span>,None,</span><br><span class="line"> <span class="string">'spike n1=%d o1=0 d1=1 nsp=4 k1=1,%d,%d,%d mag=1,-1,1,-1 | causint'</span> %</span><br><span class="line"> (n1,n1//16,1+3*n1//16,n1//16+3*n1//16))</span><br></pre></td></tr></table></figure>
<h2 id="m8r方法-6"><a href="#m8r方法-6" class="headerlink" title="m8r方法"></a><code>m8r</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">double_op1 = m8r.spike(n1=n1, o1=<span class="number">0</span>, d1=<span class="number">1</span>, nsp=<span class="number">4</span>, k1=[<span class="number">1</span>, n1//<span class="number">16</span>,<span class="number">1</span>+<span class="number">3</span>*n1//<span class="number">16</span>,n1//<span class="number">16</span>+<span class="number">3</span>*n1//<span class="number">16</span>],</span><br><span class="line"> mag=[<span class="number">1</span>,-<span class="number">1</span>,<span class="number">1</span>,-<span class="number">1</span>])</span><br><span class="line">double_op2 = m8r.causint()</span><br><span class="line">double2 = np.zeros(n1)</span><br><span class="line">double2 = double_op1.apply(double2)</span><br></pre></td></tr></table></figure>
<h2 id="numpy方法-6"><a href="#numpy方法-6" class="headerlink" title="numpy方法"></a><code>numpy</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">doublebox2 = np.zeros(n1)</span><br><span class="line"><span class="keyword">for</span> idx, value <span class="keyword">in</span> <span class="built_in">zip</span>([<span class="number">0</span>,n1//<span class="number">16</span>-<span class="number">1</span>,<span class="number">3</span>*n1//<span class="number">16</span>,n1//<span class="number">16</span>+<span class="number">3</span>*n1//<span class="number">16</span>-<span class="number">1</span>], [<span class="number">1</span>,-<span class="number">1</span>,<span class="number">1</span>,-<span class="number">1</span>]):</span><br><span class="line"> doublebox2[idx] = value</span><br><span class="line">doublebox2 = integrate(doublebox2)</span><br></pre></td></tr></table></figure>
<p>使用<code>plt.plot</code>对以上三种方法所得到的数据进行绘图,均可得到如下所示图件:<br>积分前:<br><img src="/2021/06/04/Madagascrar_01/double_a.png" alt="double_a"><br>积分后:<br><img src="/2021/06/04/Madagascrar_01/double_b.png" alt="double_b"></p>
<h1 id="Combs"><a href="#Combs" class="headerlink" title="Combs"></a>Combs</h1><h2 id="SConstruct源码-7"><a href="#SConstruct源码-7" class="headerlink" title="SConstruct源码"></a><code>SConstruct</code>源码</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">combs = [</span><br><span class="line"> range(1,1+n1//2,4),</span><br><span class="line"> range(1,1+n1//4,4),</span><br><span class="line"> range(1,1+n1//2,8),</span><br><span class="line"> range(1,1+n1//4,8),</span><br><span class="line"> range(1,1+n1,32)</span><br><span class="line"> ]</span><br><span class="line"><span class="keyword">for</span> <span class="keyword">case</span> <span class="keyword">in</span> range(len(combs)):</span><br><span class="line"> comb = combs[<span class="keyword">case</span>]</span><br><span class="line"> name = <span class="string">'comb%d'</span> % <span class="keyword">case</span></span><br><span class="line"> Flow(name,None,</span><br><span class="line"> <span class="string">'spike n1=%d o1=0 d1=1 nsp=%d k1=%s'</span> %</span><br><span class="line"> (n1,len(comb),<span class="string">','</span>.<span class="built_in">join</span>(map(str,comb))))</span><br><span class="line"> signals.append(name)</span><br><span class="line"> labels = labels + <span class="string">':cmb%d'</span> % (<span class="keyword">case</span>+1)</span><br></pre></td></tr></table></figure>
<h2 id="m8r方法-7"><a href="#m8r方法-7" class="headerlink" title="m8r方法"></a><code>m8r</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">comb_idx = <span class="number">4</span> <span class="comment">#\in [0,4)</span></span><br><span class="line"><span class="keyword">assert</span> comb_idx<=<span class="number">4</span>, <span class="string">'comb_idx must <= 4!'</span></span><br><span class="line">k_list = [<span class="built_in">int</span>(i) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">map</span>(<span class="built_in">str</span>,combs[comb_idx])]</span><br><span class="line">comb0_op = m8r.spike(n1=n1, o1=<span class="number">0</span>, d1=<span class="number">1</span>, nsp=<span class="built_in">len</span>(combs[comb_idx]), k1=k_list)</span><br><span class="line">comb0_2 = np.zeros(n1)</span><br></pre></td></tr></table></figure>
<h2 id="numpy方法-7"><a href="#numpy方法-7" class="headerlink" title="numpy方法"></a><code>numpy</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">comb_idx = <span class="number">4</span> <span class="comment">#\in [0,4)</span></span><br><span class="line"><span class="keyword">assert</span> comb_idx<=<span class="number">4</span>, <span class="string">'comb_idx must <= 4!'</span></span><br><span class="line">k_list = [<span class="built_in">int</span>(i) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">map</span>(<span class="built_in">str</span>,combs[comb_idx])]</span><br><span class="line">comb0_3 = np.zeros(n1)</span><br><span class="line">k_list2 = [i-<span class="number">1</span> <span class="keyword">for</span> i <span class="keyword">in</span> k_list]</span><br><span class="line">comb0_3[k_list2]=<span class="number">1</span></span><br></pre></td></tr></table></figure>
<p>使用<code>plt.plot</code>对以上三种方法所得到的数据进行绘图,均可得到如下所示图件:<br><img src="/2021/06/04/Madagascrar_01/comb04.png" alt="comb04"></p>
<h1 id="Exponent"><a href="#Exponent" class="headerlink" title="Exponent"></a>Exponent</h1><p>该示例使用<code>math</code>生成了指数型信号。</p>
<h2 id="SConstruct源码-8"><a href="#SConstruct源码-8" class="headerlink" title="SConstruct源码"></a><code>SConstruct</code>源码</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Flow(<span class="string">'exponent'</span>,<span class="string">'spike'</span>,</span><br><span class="line"> <span class="string">'math output="exp(-%g*(2*x1-%d))" '</span> % (8./n1,n1-2))</span><br></pre></td></tr></table></figure>
<h2 id="m8r方法-8"><a href="#m8r方法-8" class="headerlink" title="m8r方法"></a><code>m8r</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">exponent2_op = m8r.math(output=<span class="string">"exp(-%g*(2*x1-%d))"</span>%(<span class="number">8.</span>/n1,n1-<span class="number">2</span>))</span><br><span class="line">exponent2 = np.zeros(n1)</span><br><span class="line">exponent2 = exponent2_op.apply(exponent2)</span><br></pre></td></tr></table></figure>
<h2 id="numpy方法-8"><a href="#numpy方法-8" class="headerlink" title="numpy方法"></a><code>numpy</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">x = np.arange(<span class="number">0</span>, n1, <span class="number">1</span>)</span><br><span class="line">exponent3 = np.exp(-(<span class="number">8.</span>/n1)*(<span class="number">2</span>*x-(n1-<span class="number">2</span>)))</span><br></pre></td></tr></table></figure>
<p>使用<code>plt.plot</code>对以上三种方法所得到的数据进行绘图,均可得到如下所示图件:<br><img src="/2021/06/04/Madagascrar_01/exponent.png" alt="exponent"></p>
<h1 id="Gaussian"><a href="#Gaussian" class="headerlink" title="Gaussian"></a>Gaussian</h1><p>该示例使用<code>spike</code>和<code>math</code>生成<code>Gaussian</code>信号。</p>
<h2 id="SConstruct源码-9"><a href="#SConstruct源码-9" class="headerlink" title="SConstruct源码"></a><code>SConstruct</code>源码</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Flow(<span class="string">'gaussian'</span>,<span class="string">'spike'</span>,</span><br><span class="line"> <span class="string">'math output="%g*(2*x1-%d)" | math output="exp(-input*input)" '</span> %</span><br><span class="line"> (8./n1,n1-2))</span><br></pre></td></tr></table></figure>
<h2 id="m8r方法-9"><a href="#m8r方法-9" class="headerlink" title="m8r方法"></a><code>m8r</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">gaussian_op1 = m8r.math(output=<span class="string">"%g*(2*x1-%d)"</span>%(<span class="number">8.</span>/n1,n1-<span class="number">2</span>))</span><br><span class="line">gaussian_op2 = m8r.math(output=<span class="string">"exp(-input*input)"</span>)</span><br><span class="line">gaussian2 = np.ones(n1)</span><br><span class="line">gaussian2 = gaussian_op2.apply(gaussian_op1.apply(gaussian2))</span><br></pre></td></tr></table></figure>
<h2 id="numpy方法-9"><a href="#numpy方法-9" class="headerlink" title="numpy方法"></a><code>numpy</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">x = np.arange(<span class="number">0</span>, n1, <span class="number">1</span>)</span><br><span class="line">gaussian3 = np.zeros(n1)</span><br><span class="line">gaussian3 = <span class="number">8.</span>/n1*(<span class="number">2</span>*x-(n1-<span class="number">2</span>))</span><br><span class="line">gaussian3 = np.exp(-gaussian3*gaussian3)</span><br></pre></td></tr></table></figure>
<p>使用<code>plt.plot</code>对以上三种方法所得到的数据进行绘图,均可得到如下所示图件:<br><img src="/2021/06/04/Madagascrar_01/gaussian.png" alt="Gaussian"></p>
<h1 id="White"><a href="#White" class="headerlink" title="White"></a>White</h1><p>该示例使用<code>noise</code>生成白噪。</p>
<h2 id="SConstruct源码-10"><a href="#SConstruct源码-10" class="headerlink" title="SConstruct源码"></a><code>SConstruct</code>源码</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Flow(<span class="string">'white'</span>,<span class="string">'spike'</span>,<span class="string">'noise type=n seed=1990 | math output="2*(input-1)" '</span>)</span><br></pre></td></tr></table></figure>
<h2 id="m8r方法-10"><a href="#m8r方法-10" class="headerlink" title="m8r方法"></a><code>m8r</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">white_op1 = m8r.noise(<span class="built_in">type</span>=<span class="literal">False</span>, seed = <span class="number">1990</span>)</span><br><span class="line">white_op2 = m8r.math(output=<span class="string">"2*(input-1)"</span>)</span><br><span class="line">white2 = np.ones(n1)</span><br><span class="line">white2 = white_op2.apply(white_op1.apply(white2))</span><br></pre></td></tr></table></figure>
<h2 id="numpy方法-10"><a href="#numpy方法-10" class="headerlink" title="numpy方法"></a><code>numpy</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">white3 = np.random.random(n1)+<span class="number">0.5</span></span><br><span class="line">white3 = <span class="number">2</span>*(white3-<span class="number">1</span>)</span><br></pre></td></tr></table></figure>
<p>注:<code>m8r</code>与<code>numpy</code>种子设置方法不同,获取的随机数结果不同。</p>
<h1 id="colored"><a href="#colored" class="headerlink" title="colored"></a>colored</h1><p>该示例使用<code>smooth</code>对生成的白噪(<code>m8r</code>)信号进行平滑。</p>
<h2 id="SConstruct源码-11"><a href="#SConstruct源码-11" class="headerlink" title="SConstruct源码"></a><code>SConstruct</code>源码</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Flow(<span class="string">'colored'</span>, <span class="string">'white'</span>, <span class="string">'smooth rect1=3'</span>)</span><br></pre></td></tr></table></figure>
<h2 id="m8r方法-11"><a href="#m8r方法-11" class="headerlink" title="m8r方法"></a><code>m8r</code>方法</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">colored_op = m8r.smooth(rect1=<span class="number">3</span>)</span><br><span class="line">colored = np.zeros(n1)</span><br><span class="line">colored_op = colored_op.apply(white2)</span><br></pre></td></tr></table></figure>
<h2 id="numpy方法-11"><a href="#numpy方法-11" class="headerlink" title="numpy方法"></a><code>numpy</code>方法</h2><p>未阅读其中的平滑函数。<br>使用<code>plt.plot</code>对所得到的数据进行绘图,均可得到如下所示图件:<br>平滑前:<br><img src="/2021/06/04/Madagascrar_01/smbefore.png" alt="smBefore"><br>平滑后:<br><img src="/2021/06/04/Madagascrar_01/smafter.png" alt="smAfter"></p>
<h3 id="其它函数的使用,举一反三即可(在terminal中查找函数的参数,然后使用m8r-command的方式来调用)。"><a href="#其它函数的使用,举一反三即可(在terminal中查找函数的参数,然后使用m8r-command的方式来调用)。" class="headerlink" title="其它函数的使用,举一反三即可(在terminal中查找函数的参数,然后使用m8r.command的方式来调用)。"></a>其它函数的使用,举一反三即可(在terminal中查找函数的参数,然后使用m8r.command的方式来调用)。</h3><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>Madagascrar</category>
</categories>
<tags>
<tag>编程开发</tag>
</tags>
</entry>
<entry>
<title>Madagascrar之线性Radon变换</title>
<url>/2021/06/06/Madagascrar_radon01/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><h1 id="Madagascrar之线性Radon变换"><a href="#Madagascrar之线性Radon变换" class="headerlink" title="Madagascrar之线性Radon变换"></a>Madagascrar之线性Radon变换</h1><p>本文简要介绍如何在<code>python</code>中使用<code>Madagascrar</code>中的<code>Radon</code>变换模块。<br>命令行中输入<code>sfradon</code>可以查看<code>Radon</code>变换的相关参数,如下所示<br><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">NAME</span><br><span class="line"> sfradon</span><br><span class="line">DESCRIPTION</span><br><span class="line"> High-resolution Radon transform. </span><br><span class="line">SYNOPSIS</span><br><span class="line"> sfradon < in.rsf > out.rsf offset=offset.rsf adj=y inv=adj spk=inv verb=n np= dp= p0= nx= eps=1. ns=1 tol=1.e-6 perc=50.0 fact=0.5 ox= dx= parab=n x0=</span><br><span class="line">1. niter=100</span><br><span class="line">PARAMETERS</span><br><span class="line"> bool adj=y [y/n] <span class="keyword">if</span> y, perform adjoint operation </span><br><span class="line"> <span class="built_in">float</span> dp= p sampling (<span class="keyword">if</span> adj=y) </span><br><span class="line"> <span class="built_in">float</span> dx= </span><br><span class="line"> <span class="built_in">float</span> eps=1. </span><br><span class="line"> <span class="built_in">float</span> fact=0.5 percentage <span class="keyword">for</span> sharpening </span><br><span class="line"> bool inv=adj [y/n] <span class="keyword">if</span> y, perform inverse operation </span><br><span class="line"> int niter=100 </span><br><span class="line"> int np= number of p values (<span class="keyword">if</span> adj=y) </span><br><span class="line"> int ns=1 number of sharpening cycles </span><br><span class="line"> int nx= number of offsets (<span class="keyword">if</span> adj=n) </span><br><span class="line"> string offset= auxiliary input file name</span><br><span class="line"> <span class="built_in">float</span> ox= </span><br><span class="line"> <span class="built_in">float</span> p0= p origin (<span class="keyword">if</span> adj=y) </span><br><span class="line"> bool parab=n [y/n] <span class="keyword">if</span> y, parabolic Radon transform </span><br><span class="line"> <span class="built_in">float</span> perc=50.0 percentage <span class="keyword">for</span> sharpening </span><br><span class="line"> bool spk=inv [y/n] <span class="keyword">if</span> y, use spiking (hi-res) inversion </span><br><span class="line"> <span class="built_in">float</span> tol=1.e-6 inversion tolerance </span><br><span class="line"> bool verb=n [y/n] verbosity flag </span><br><span class="line"> <span class="built_in">float</span> x0=1. reference offset</span><br><span class="line">USED IN</span><br><span class="line"> cwp/geo2006TimeShiftImagingCondition/flat</span><br><span class="line"> geo384s/hw5/pradon</span><br><span class="line"> geo384s/hw5/radon</span><br><span class="line"> milano/taupvel/cmp</span><br><span class="line"> rsf/school2012/demo</span><br><span class="line"> rsf/su/rsflab16</span><br><span class="line"> rsf/su/rsftaup</span><br><span class="line"> xjtu/test/myradon2</span><br><span class="line">SOURCE</span><br><span class="line"> system/seismic/Mradon.</span><br></pre></td></tr></table></figure><br>下面我们通过一个简单的实例来了解一下,如何使用线性<code>Radon</code>的正反变换。</p>
<p>首先,我们使用<code>numpy</code>生成一个包含两条水平直线、大小为(256, 256)的二维数组,两条直线分别位于网格深度64和192处。数据生成代码和图片如下所示:<br><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">nx = 256</span><br><span class="line">nz = 256</span><br><span class="line">image = np.zeros((nx, nz), dtype = np.float32)</span><br><span class="line">image[64,:]=1</span><br><span class="line">image[192,:]=1</span><br></pre></td></tr></table></figure><br><img src="/2021/06/06/Madagascrar_radon01/ori.png" alt="img01"><br>接下来,使用<code>m8r</code>模块中的<code>radon</code>分别创建拉冬正变化和反变换的算子<code>radon_op</code>和<code>iradon_op</code>,其中我们必须要通过<code>put</code>方法来输入数据的网格间距<code>d1</code>、<code>d2</code>和起始位置<code>o2</code>信息,以及拉冬变换所需要的相关参数信息,比如变换后的采样数<code>np</code>(决定了变换后数据的网格大小)、<code>p</code>起始位置<code>p0</code>以及采样间隔<code>dp</code>,是否使用高精度变换<code>spk</code>等。</p>
<p>这里,我们将原始数据横向和纵向采样间隔均设置为1,并令$NP=55$,$dp=2*pmax/(NP-1)$。需要注意的是,在反变换中,我们需要将<code>d2</code>设置为正变换中的<code>dp</code>,即将数据第二个维度采样间隔设置为正变换中<code>p</code>的采样间隔,并将第二个维度的起始位置<code>o2</code>设置为正变换中<code>p0</code>(即此例中的<code>-pmax</code>);然后设置<code>radon</code>变换中的<code>nx</code>为原数据第一个维度大小即可得到与原数据大小相同的二维数据。<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">d1 = <span class="number">1</span></span><br><span class="line">d2 = <span class="number">1</span></span><br><span class="line">o2 = <span class="number">0</span></span><br><span class="line">pmax=<span class="number">1</span></span><br><span class="line">NP=<span class="number">55</span></span><br><span class="line">dp=<span class="number">2</span>*pmax/(NP-<span class="number">1</span>)</span><br><span class="line">radon_op = m8r.put(d1 = d1, d2 = d2, o2 = o2).radon(np=NP, p0=-pmax, dp=dp, spk=<span class="literal">False</span>)</span><br><span class="line">iradon_op = m8r.put(d1 = d1, d2 = dp, o2 = -pmax).radon(adj=<span class="literal">False</span>,</span><br><span class="line"> nx=image.shape[<span class="number">0</span>],</span><br><span class="line"> dx=d2, ox=<span class="number">0</span>, </span><br><span class="line"> spk=<span class="literal">False</span>)</span><br></pre></td></tr></table></figure><br>分别将正、反变换算子应用于原始数据和变换后的数据,即可相应地得到拉冬域数据和原始数据。但需要注意的是,由于<code>python</code>和<code>C</code>中行列优先级的不同,我们需要将<code>numpy</code>数组转置后再输入到算子中才可得到正确的正变换结果,相应的,反变换的结果转置后才为真正的原始数据排列方式。<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 正变换</span></span><br><span class="line">radon_m8r = radon_op.apply(image.T)</span><br><span class="line"><span class="comment"># 反变换</span></span><br><span class="line">idata_m8r = iradon_op.apply(radon_m8r)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 绘图</span></span><br><span class="line">dx, dy = <span class="number">0.5</span> * <span class="number">180.0</span> / <span class="built_in">max</span>(image.shape), <span class="number">0.5</span> / radon_m8r.shape[<span class="number">0</span>]</span><br><span class="line">fig, ax = plt.subplots(<span class="number">1</span>, <span class="number">1</span>)</span><br><span class="line">ax.imshow(radon_m8r.T, </span><br><span class="line"> extent = (-dx, <span class="number">180.0</span> + dx, -dy, radon_m8r.shape[<span class="number">0</span>] + dy),</span><br><span class="line"> cmap = plt.cm.Greys, aspect =<span class="string">'auto'</span>)</span><br><span class="line">ax.set_xlabel(<span class="string">"Projection angle (deg)"</span>)</span><br><span class="line">ax.set_ylabel(<span class="string">"Projection position (pixels)"</span>)</span><br><span class="line">plt.show()</span><br><span class="line"></span><br><span class="line">plt.imshow(image, cmap=plt.cm.Greys)</span><br><span class="line">plt.show()</span><br><span class="line">plt.imshow(idata_m8r.T, cmap=plt.cm.Greys)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><br>正变换结果:<br><img src="/2021/06/06/Madagascrar_radon01/forward.png" alt="正变换"><br>反变换结果:<br><img src="/2021/06/06/Madagascrar_radon01/backward.png" alt="正变换"></p>
<h3 id="实际上,m8r-radon函数也可完成抛物线拉冬变换,只需设置参数parab-True即可。"><a href="#实际上,m8r-radon函数也可完成抛物线拉冬变换,只需设置参数parab-True即可。" class="headerlink" title="实际上,m8r.radon函数也可完成抛物线拉冬变换,只需设置参数parab=True即可。"></a>实际上,<code>m8r.radon</code>函数也可完成抛物线拉冬变换,只需设置参数<code>parab=True</code>即可。</h3><link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>Madagascrar</category>
</categories>
<tags>
<tag>编程开发</tag>
</tags>
</entry>
<entry>
<title>Madagascrar之rsf/su/rsflab16</title>
<url>/2021/06/14/Madagascrar_rsf.su.rsflab16/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><p>本文介绍的是Madagascrar源码book中的rsf/su/rsflab16示例程序,该源码程序主要介绍的是如何使用Madagascrar对地震数据进行动校正(sfnmo)、taup变换(sfradon)、速度分析(sfvscan)、去动校正(sfinmo)等。<br>如何在python中读取RSF文件/输出<code>numpy</code>数据到RSF文件,请参考<a href="http://blog.geophyai.com/2021/06/09/Madagascrar_rsfIO/" title="RSF文件IO">《Madagascrar之RSF文件输入与输出》</a>一文。</p>
<h1 id="动校正-NMO"><a href="#动校正-NMO" class="headerlink" title="动校正(NMO)"></a>动校正(NMO)</h1><p><code>rsf/su/rsflab16/SConstruct</code>中有两处使用了<code>nmo</code>命令,第一处为动校正、第二处为去动校正。</p>
<p>动校正命令如下:<br><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Flow(<span class="string">'nmo'</span>,<span class="string">'cdp265 offset265 vel'</span>,</span><br><span class="line"> <span class="string">'nmo half=n offset=${SOURCES[1]} velocity=${SOURCES[2]}'</span>)</span><br></pre></td></tr></table></figure><br>通过以上<code>Flow</code>命令可以看出,<code>Madagascrar</code>中的动校正模块<code>sfnmo</code>需要有三个输入文件,也就是说,如果我们想要在<code>Python</code>中使用<code>m8r.nmo</code>,除了<code>numpy</code>格式的输入数据外,还需额外输入偏移距数据<code>offset</code>以及速度数据<code>velocity</code>。<a href="http://blog.geophyai.com/2021/06/09/Madagascrar_rsfIO/" title="RSF文件IO">《Madagascrar之RSF文件输入与输出》</a>中我们提到,由于无法直接将<code>numpy</code>数据作为参数输入到<code>m8r.command</code>中,我们只能先将数据以规定的<code>RSF</code>文件格式输入到磁盘中,然后再将文件路径作为参数传入函数中。即<code>m8r.nmo(offset=np.array(offset), velocity=np.array(offset))</code>是不可行的,<code>m8r.nmo(half=False, offset='./offset.rsf', velocity='./vel.rsf'.apply(np.array(cdp))</code>才能得到正确结果。</p>
<p>为方便起见,我们仍旧使用之前封装的<code>warpper</code>函数来读取<code>rsf</code>文件,代码如下所示:<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">nmo_op = m8r.put(d1=<span class="number">0.004</span>,</span><br><span class="line"> o1=<span class="number">0</span>).nmo(half=<span class="literal">False</span>, </span><br><span class="line"> offset=warp.offset265.__file_path__, </span><br><span class="line"> velocity=warp.vel.__file_path__)</span><br><span class="line">nmo = nmo_op.apply(warp.cdp265.data)</span><br><span class="line">warp.__set_attr_by_name__(<span class="string">'nmo'</span>)</span><br><span class="line"><span class="built_in">print</span>(np.<span class="built_in">all</span>(nmo==warp.nmo.data))</span><br></pre></td></tr></table></figure><br>上面的代码中,我们首先定义了一个动校正算子<code>nmo_op</code>,然后我们将需要的参数(时间采样间隔<code>d1</code>,起始时间<code>o1</code>)输入到<code>put</code>中,将<code>nmo</code>需要的参数输入到其函数中(<code>offset</code>和<code>velocity</code>的参数分别为使用<code>warp.__set_attr_by_name__('offset265')</code>和<code>warp.__set_attr_by_name__('vel')</code>读取的<code>RSF</code>文件路径,这些文件均可以通过执行<code>scons</code>命令来生成)。通过查看最后输出是否为<code>True</code>来判断所生成动校正数据与源码最终结果的异同。另外,这里动校正的速度为<code>1500m/s</code>。<br><img src="/2021/06/14/Madagascrar_rsf.su.rsflab16/cdp265+nmo.png" alt="去动校正"><br>去动校正命令如下:<br><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Flow(<span class="string">'sign'</span>,<span class="string">'sign2 vel'</span>,<span class="string">'inmo half=n velocity=${SOURCES[1]}'</span>)</span><br></pre></td></tr></table></figure><br>使用方法与动校正相似,定义算子的时候需要将速度文件的路径作为参数传入,这里不做赘述。<br><img src="/2021/06/14/Madagascrar_rsf.su.rsflab16/sign+inmo.png" alt="去动校正"></p>
<h1 id="抛物线taup变换"><a href="#抛物线taup变换" class="headerlink" title="抛物线taup变换"></a>抛物线taup变换</h1><p><code>Radon</code>变换示例可参考<a href="http://blog.geophyai.com/2021/06/06/Madagascrar_radon01/">《Madagascrar之线性Radon变换》</a>。在<code>sfradon</code>中,由常规拉东变换到抛物线拉东变换,我们只需要将参数<code>parab</code>设置为<code>y</code>(默认为<code>n</code>,在<code>python</code>中则需要设置为<code>True</code>)即可。<br><code>SConstruct</code>源码为:<br><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Flow(<span class="string">'taup'</span>,<span class="string">'nmo offset265 '</span>,</span><br><span class="line"> <span class="string">'radon parab=y x0=1000 np=251 dp=0.002 p0=-0.25 offset=${SOURCES[1]}'</span>)</span><br></pre></td></tr></table></figure><br>对应的<code>Python</code>版实现为:<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">taup_op = m8r.put(d1=<span class="number">0.004</span>).radon(parab=<span class="literal">True</span>,</span><br><span class="line"> x0=<span class="number">1000</span>,</span><br><span class="line"> np=<span class="number">251</span>,</span><br><span class="line"> dp=<span class="number">0.002</span>,</span><br><span class="line"> p0=-<span class="number">0.25</span>,</span><br><span class="line"> offset=warp.offset265.__file_path___)</span><br><span class="line">taup = taup_op.apply(warp.nmo.data)</span><br></pre></td></tr></table></figure><br>同样的,<code>warp.nmo.data</code>为通过<code>warp.__set_attr_by_name__('nmo')</code>读取的<code>nmo.rsf</code>文件中的数据。<br><img src="/2021/06/14/Madagascrar_rsf.su.rsflab16/taup.png" alt="taup变换"><br>这里展示的图片为对原始炮集(即上面的动校正前数据)进行$taup$变换后的结果。</p>
<h1 id="速度分析"><a href="#速度分析" class="headerlink" title="速度分析"></a>速度分析</h1><p>速度分析也需要额外输出偏移距的<code>RSF</code>文件作为参数,所以我们要将偏移距数据按照格式写入文件。<br>脚本命令为:<br><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Velocity analysis</span></span><br><span class="line">Flow(<span class="string">'scan'</span>,<span class="string">'cdp265 offset265'</span>,</span><br><span class="line"> <span class="string">'vscan semblance=y half=n offset=${SOURCES[1]} dv=15 v0=1450 nv=200'</span>)</span><br><span class="line">Flow(<span class="string">'scan2'</span>,<span class="string">'sign'</span>,</span><br><span class="line"> <span class="string">'vscan semblance=y half=n dv=15 v0=1450 nv=200'</span>)</span><br></pre></td></tr></table></figure><br>对应的<code>Python</code>版实现为:<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">vscan_op = m8r.put(o1=<span class="built_in">float</span>(o1), </span><br><span class="line"> d1=<span class="built_in">float</span>(d1)).vscan(semblance=<span class="literal">True</span>,</span><br><span class="line"> half=<span class="literal">False</span>,</span><br><span class="line"> offset=<span class="string">'./offset265_.rsf'</span>, </span><br><span class="line"> dv=<span class="number">15</span>, </span><br><span class="line"> v0=<span class="number">1450</span>, </span><br><span class="line"> nv=<span class="number">200</span>)</span><br><span class="line">vscan = vscan_op.apply(warp.cdp265.data)</span><br><span class="line">vscan2 = vscan_op.apply(warp.sign.data)</span><br></pre></td></tr></table></figure><br><img src="/2021/06/14/Madagascrar_rsf.su.rsflab16/scan.png" alt="taup变换"></p>
<p>上图中,横轴表示速度(m/s),纵轴表示为时间(s)。</p>
<link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>Madagascrar</category>
</categories>
<tags>
<tag>编程开发</tag>
</tags>
</entry>
<entry>
<title>Madagascrar之RSF文件输入与输出</title>
<url>/2021/06/09/Madagascrar_rsfIO/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><h1 id="Madagascrar中RSF文件读取与写入"><a href="#Madagascrar中RSF文件读取与写入" class="headerlink" title="Madagascrar中RSF文件读取与写入"></a>Madagascrar中RSF文件读取与写入</h1><p>本文主要介绍如何在<code>Python</code>脚本中读取由执行<code>scons</code>命令所生成的<code>Madagascrar</code>的<code>.rsf</code>文件,以及如何将<code>numpy</code>数据以及相关参数写入<code>.rsf</code>文件。</p>
<h1 id="在Python中读取RSF文件"><a href="#在Python中读取RSF文件" class="headerlink" title="在Python中读取RSF文件"></a>在Python中读取RSF文件</h1><p>这里我们将RSF文件读取封装在一个简单的函数中,该函数使用了<code>m8r</code>中的<code>Input</code>模块来完成对数据和参数的读取,我们只需要将文件名输入到该函数中,即可获得与文件名同名的方法,并可分别通过<code>name.data</code>和<code>name.pars</code>来访问<code>name.rsf</code>中的数据和参数。<br>函数原型:<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">m8r_read</span>():</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, file_path</span>):</span><br><span class="line"> self.__file_path__ = file_path</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__read__</span>(<span class="params">self, </span>):</span><br><span class="line"> self.Input = m8r.Input(self.__file_path__)</span><br><span class="line"> self.pars = self.Input.file.pars</span><br><span class="line"> self.data = self.Input.read()</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__plot__</span>(<span class="params">self, cmap = plt.cm.gray</span>):</span><br><span class="line"> <span class="keyword">assert</span> self.data.ndim><span class="number">1</span></span><br><span class="line"> plt.figure()</span><br><span class="line"> vmin, vmax = np.percentile(self.data, [<span class="number">2</span>, <span class="number">98</span>])</span><br><span class="line"> plt.imshow(self.data.T,</span><br><span class="line"> vmin=vmin, vmax=vmax, </span><br><span class="line"> cmap = cmap,</span><br><span class="line"> aspect = <span class="string">'auto'</span>)</span><br><span class="line"> plt.show()</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">warpper</span>():</span><br><span class="line"> m8r.no_swig()</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, root_path</span>):</span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> root_path: The root path of data.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> self.__root_path__ = root_path</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__set_attr_by_name__</span>(<span class="params">self, name, postfix = <span class="string">'rsf'</span></span>):</span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> name: The name of rsf file that need to be loaded.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> path = os.path.join(self.__root_path__, name+<span class="string">'.'</span>+postfix)</span><br><span class="line"> self.__setattr__(name, m8r_read(path))</span><br><span class="line"> self.__getattribute__(name).__read__()</span><br></pre></td></tr></table></figure><br>我们以<code>rsf/su/rsflab16/seismic.rsf</code>为例,展示如何使用<code>warpper</code>读取<code>RSF</code>文件。</p>
<p>首先,我们通过<code>warp = warpper(file_path)</code>来实例化该类,其中<code>file_path</code>为<code>seismic.rsf</code>文件的路径,然后调用该类的<code>__set_attr_by_name__</code>方法,即<code>warp.__set_attr_by_name__('seismic')</code>,此时已经创建了与<code>seismic.rsf</code>文件同名的<code>warp.seismic</code>方法,该文件中的数据即存储在<code>numpy</code>数组<code>warp.seismic.data</code>中,参数则存储在<code>warp.seismic.pars</code>中。</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">warp = warpper(file_path)</span><br><span class="line">warp.__set_attr_by_name__(<span class="string">'seismic'</span>)</span><br><span class="line"><span class="comment"># 数据</span></span><br><span class="line"><span class="built_in">print</span>(warp.seismic.data.shape)</span><br><span class="line"><span class="comment"># 参数</span></span><br><span class="line"><span class="built_in">print</span>(warp.seismic.pars)</span><br></pre></td></tr></table></figure>
<p>实质上,数据和参数读取分别调用了<code>m8r.Input.read()</code>和<code>m8r.Input.pars</code>,这里只是将其封装在了新的类中,用户仍旧可以通过<code>warp.seismic.Input.xxx</code>来使用原<code>m8r.Input</code>中的其它方法,例如调用<code>warp.seismic.grey()</code>来显示并存储等。</p>
<h1 id="Numpy数据写入RSF文件"><a href="#Numpy数据写入RSF文件" class="headerlink" title="Numpy数据写入RSF文件"></a>Numpy数据写入RSF文件</h1><p><code>Madagascrar</code>中的部分功能需要使用<code>.rsf</code>文件作为输入参数,由于暂时未找到直接将<code>numpy.ndarray</code>数据作为参数输入<code>m8r.func()</code>中的方法,因此我们先将<code>numpy.ndarray</code>数据格式化写入<code>.rsf</code>文件,然后再调用函数从<code>.rsf</code>文件中读取数据。</p>
<h3 id="数据准备"><a href="#数据准备" class="headerlink" title="数据准备"></a>数据准备</h3><p>假设一炮集记录共55道,每道有1500个采样点,将二维炮集记录写入<code>.rsf</code>文件时,<strong>需要保证第一个维度为道,第二维度为每道的采样点</strong>,此数据形成的<code>numpy</code>数组<code>shape</code>应为<code>(55, 1500)</code>。</p>
<h3 id="文件写入"><a href="#文件写入" class="headerlink" title="文件写入"></a>文件写入</h3><p>首先,通过<code>m8r.Output(file_path)</code>创建一个与<code>C</code>中文件指针相当的函数,其中<code>file_path</code>为<code>.rsf</code>文件的路径(包含文件名),然后分别通过此类的<code>put</code>和<code>write</code>方法向文件指针中写入参数与数据,最后调用<code>close</code>方法关闭文件指针。代码示例如下所示:</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">data.shape = (<span class="number">55</span>, <span class="number">1500</span>)</span><br><span class="line"><span class="built_in">type</span>(data) = numpy.ndarray</span><br><span class="line">data.dtype = np.float32</span><br><span class="line"></span><br><span class="line">file = m8r.Output(<span class="string">'data.rsf'</span>)</span><br><span class="line">file.put(<span class="string">'n1'</span>, data.shape[<span class="number">1</span>])</span><br><span class="line">file.put(<span class="string">'n2'</span>, data.shape[<span class="number">0</span>])</span><br><span class="line"><span class="comment"># 时间采样间隔</span></span><br><span class="line">file.put(<span class="string">'d1'</span>, <span class="number">0.004</span>)</span><br><span class="line"><span class="comment"># 空间采样间隔</span></span><br><span class="line">file.put(<span class="string">'d2'</span>, <span class="number">1.</span>)</span><br><span class="line">file.write(data)</span><br><span class="line">file.close()</span><br></pre></td></tr></table></figure>
<p>将<code>numpy</code>格式炮集数据写入<code>.rsf</code>文件时,值得注意的有以下几点:</p>
<ol>
<li><code>numpy</code>数据的<strong>第一</strong>和<strong>第二</strong>个维度分别为<strong>道</strong>和<strong>时间</strong></li>
<li><code>n1</code>和<code>n2</code>分别表示<strong>时间采样点数</strong>和<strong>道数</strong>;</li>
<li><code>d1</code>和<code>d2</code>分别代表<strong>时间采样间隔</strong>和<strong>道间距</strong>。</li>
</ol>
<h1 id="结论"><a href="#结论" class="headerlink" title="结论"></a>结论</h1><p>由于<code>m8r</code>中的函数不支持<code>numpy</code>数据作为参数输入(可能是由于源码中没有嵌入<code>numpy</code>格式),因此我们需要先将数据写入到<code>.rsf</code>文件中,然后再将文件路径作为参数传入到函数中,完成相关功能的实现。</p>
<link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>Madagascrar</category>
</categories>
<tags>
<tag>编程开发</tag>
</tags>
</entry>
<entry>
<title>NoisePy安装及简易教程</title>
<url>/2020/12/27/NoisePy001/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><h1 id="NoisePy简易教程"><a href="#NoisePy简易教程" class="headerlink" title="NoisePy简易教程"></a>NoisePy简易教程</h1><h4 id="翻译自GitHub"><a href="#翻译自GitHub" class="headerlink" title="翻译自GitHub"></a>翻译自<a href="https://github.com/mdenolle/NoisePy">GitHub</a></h4><p>NoisePy是一个Python软件包,旨在快速轻松地计算背景噪声互相关函数。 它提供了用于噪声监视和表面波色散分析的其他功能。</p>
<p>免责声明:此代码不应“按原样”使用,也不能像黑盒一样运行。 希望用户更改本地路径和参数。 如果有问题,请将其提交到github,其中包含要调试的脚本和错误消息等信息。</p>
<p>完整doc请参考 <a href="https://noise-python.readthedocs.io/en/latest/">https://noise-python.readthedocs.io/en/latest/</a><br><img src="/2020/12/27/NoisePy001/logo.png" alt="logo"></p>
<h2 id="引用"><a href="#引用" class="headerlink" title="引用"></a>引用</h2><p>如果您在文章中使用了代码,请引用:</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">Jiang, C. and Denolle, M. "NoisePy: a new high-performance python tool for seismic ambient noise seismology." Seismological Research Letter 91 (3): 1853–1866.</span><br></pre></td></tr></table></figure>
<h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>NoisePy由python脚本组成,因此其安装方式十分灵活,这实际上是为了构建脚本和相关功能的依赖库。 我们建议使用conda和pip安装库,因为它们更方便。 下面是我们经过测试的命令行,这些命令行将创建一个运行NoisePy的python环境。 请注意,该测试是在MacOS上执行的,因此对于其他OS可能会略有不同。(假设主机已经安装了MPI,mpi4py包会用到)</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">conda create -n noisepy -c conda-forge python=3.7 numpy=1.16.2 numba pandas pycwt jupyter mpi4py=3.0.1 obspy=1.1 pyasdf</span><br><span class="line">conda activate noisepy</span><br><span class="line">git <span class="built_in">clone</span> https://github.com/mdenolle/NoisePy.git</span><br></pre></td></tr></table></figure>
<h2 id="功能"><a href="#功能" class="headerlink" title="功能"></a>功能</h2><ul>
<li>根据obspy的<code>get_station</code>和<code>get_waveforms</code>的核心功能下载连续噪声数据</li>
<li>以ASDF格式保存地震数据,该数据可以方便地将元数据、波形数据和辅助数据组合到一个文件中(读/写ASDF文件的教程)</li>
<li>提供了高度的灵活性来处理存储在本地计算机上的混乱的SAC / miniSEED数据并将其转换为ASDF格式的数据,可以轻松地将其插入NoisePy</li>
<li>通过MPI并行运行功能,执行快速,简单的互相关(cross-correlation)</li>
<li>包括一系列监视功能,可使用一些最近开发的新方法来对结果互相关函数上的dv / v进行测量(有关更多详细信息,请参见我们的论文)</li>
</ul>
<h2 id="简易教程"><a href="#简易教程" class="headerlink" title="简易教程"></a>简易教程</h2><h3 id="0A-使用S0A-download-ASDF-MPI-py下载地震噪声数据"><a href="#0A-使用S0A-download-ASDF-MPI-py下载地震噪声数据" class="headerlink" title="0A. 使用S0A_download_ASDF_MPI.py下载地震噪声数据"></a>0A. 使用<code>S0A_download_ASDF_MPI.py</code>下载地震噪声数据</h3><p>该脚本(位于<code>src</code>目录中)及其现有参数允许通过SCEC数据中心下载位于某个区域并在1/Jul/2016-2/Jul/2016 期间运行的所有可用宽频CI台站(BH?) 。</p>
<p>在脚本中,为所有可根据用户需要更改的输入参数提供了简短摘要。 </p>
<p>在脚本的当前形式中,我们设置<code>inc_hours = 24</code>,下载一整天的连续噪声数据以及元信息,并将其存储在单个ASDF文件中。 为了增加最终互相关函数的信噪比(SNR)(更多详细信息,请参见Seats等,2012),我们将整天的序列分成了较小的段,每个<code>cc_len</code>长, 相邻段之间有部分重叠。 如果在下载过程中需要保存中间输出/操作时间,则可能需要将<code>flag</code>设置为<code>True</code>。</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">python S0A_download_ASDF_MPI.py</span><br></pre></td></tr></table></figure>
<p>如果要使用多个内核(例如4个),请使用以下命令(使用mpi4py包)运行脚本。</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">mpirun -n 4 python S0A_download_ASDF_MPI.py</span><br></pre></td></tr></table></figure>
<p>从S0A输出的文件包括包含每日(24h)连续噪声数据的ASDF文件,在S0A脚本中记录所有使用的参数的参数文件以及所有电台信息的CSV文件(有关读取带有下载数据的ASDF文件的更多详细信息 可以在docs / src / ASDF.md中找到)。 可以使用src目录中名为plotting_modules的绘图模块显示存储在ASDF文件中的连续波形数据,如下所示。</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> plotting_modules <span class="comment">#(cd to your source file directory first before loading this module)</span></span><br><span class="line">sfile = <span class="string">'/RAW_DATA/2016_07_01_00_00_00T2016_07_02_00_00_00.h5'</span></span><br><span class="line">plotting_modules.plot_waveform(sfile,<span class="string">'CI'</span>,<span class="string">'BLC'</span>,<span class="number">0.01</span>,<span class="number">0.4</span>) </span><br></pre></td></tr></table></figure>
<p><img src="/2020/12/27/NoisePy001/waveform3.png" alt="waveform3"><br>请注意,该脚本还提供了从现有台站列表下载数据的选项,其格式与输出的CSV文件相同。 在这种情况下,应该在<code>L53</code>将<code>down_list</code>设置为<code>True</code>。 </p>
<p>实际上,下载速度取决于许多因素,例如目标数据的原始采样率,网络,托管该数据的数据中心以及要存储在计算机上的一般结构等。我们测试了许多评估其性能的参数,读者可参考我们的论文以获取更多详细信息(Jiang等人,2019)。</p>
<h3 id="0B-使用S0B-sacMSEED-to-ASDF-py处理本地SAC-缩小文件"><a href="#0B-使用S0B-sacMSEED-to-ASDF-py处理本地SAC-缩小文件" class="headerlink" title="0B. 使用S0B_sacMSEED_to_ASDF.py处理本地SAC /缩小文件"></a>0B. 使用<code>S0B_sacMSEED_to_ASDF.py</code>处理本地SAC /缩小文件</h3><p>如果要使用<code>NoisePy</code>处理存储在自己磁盘上的SAC /缩小格式的本地数据,则需要使用此脚本。 大多数变量与S0A的变量相同,因此应该很容易理解和更改。 </p>
<p>在此脚本中,它将通过合并,去趋势,去斜,下采样然后进行修整来对数据进行预处理,然后再将其保存为ASDF格式以用于以后的<code>NoisePy</code>处理。 特别是,我们希望脚本能够处理非常混乱的数据,这意味着地震数据会被分解成小块,并且混乱的时间信息(例如重叠的时间)会被分解。 <strong>记住,当数据混乱时,将<code>L62</code>处的<code>messydata</code>设置为<code>True</code>! (有关删除仪器响应的教程)</strong></p>
<h3 id="1-使用S1-fft-cc-MPI-py-执行互相关"><a href="#1-使用S1-fft-cc-MPI-py-执行互相关" class="headerlink" title="1. 使用S1_fft_cc_MPI.py 执行互相关"></a>1. 使用<code>S1_fft_cc_MPI.py</code> 执行互相关</h3><p>这是NoisePy的核心脚本,该脚本首先对所有噪声数据执行傅立叶变换,然后将它们加载到内存中,然后再进行进一步的互相关。 </p>
<p>这意味着互相关是在频率域进行的。 在脚本中,我们提供了几种计算互相关的选项,包括<code>raw</code>,<code>coherency</code>和<code>deconv</code>(有关详细定义,请参见我们的论文*)。 我们在这里以<code>coherency</code>为例。 </p>
<p>运行脚本后,它将创建一个名为<code>CCF</code>的新文件夹,在其中放置了包含不同工作站对之间所有互相关函数的新ASDF文件。 它还创建一个<code>fft_cc_data.txt</code>参数文件,该文件记录了此脚本中使用的所有有用参数。 </p>
<p>一旦获得互相关文件,就可按以下方式在<code>plotting_modules</code>中调用<code>plot_substack_cc</code>函数来显示所有<strong>站对</strong>之间的每日时间变化。</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> plotting_modules</span><br><span class="line">sfile = <span class="string">'/2016_07_01_00_00_00T2016_07_02_00_00_00.h5'</span></span><br><span class="line">plot_modules.plot_substack_cc(sfile,<span class="number">0.1</span>,<span class="number">0.2</span>,<span class="number">200</span>,<span class="literal">True</span>,<span class="string">'/Users/chengxin/Documents/SCAL/CCF/figures'</span>) </span><br></pre></td></tr></table></figure>
<p><img src="/2020/12/27/NoisePy001/substack_cc_ZZ.png" alt="waveform3"></p>
<h3 id="2-使用S2-stacking-py叠加"><a href="#2-使用S2-stacking-py叠加" class="headerlink" title="2. 使用S2_stacking.py叠加"></a>2. 使用<code>S2_stacking.py</code>叠加</h3><p>该脚本用于叠加S1中所有台站对的互相关函数,并将它们保存到ASDF文件中以供将来分析(例如,时间变化和/或频散提取)。 特别地,叠加过程有两种选择,包括线性和相位加权堆叠(pws)。 通常,pws产生的波形具有高SNR,下面的快照显示了两种叠加方法的波形比较。 我们使用下面的命令来绘制动校正图。</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> plotting_modules,glob</span><br><span class="line">sfiles = glob.glob(<span class="string">'/SCAL/STACK/*/*.h5'</span>)</span><br><span class="line">plot_modules.plot_all_moveout(sfiles,<span class="string">'Allstack_linear'</span><span class="number">0.1</span>,<span class="number">0.2</span>,<span class="string">'ZZ'</span>,<span class="number">1</span>,<span class="number">300</span>,<span class="literal">True</span>,<span class="string">'/SCAL/STACK'</span>) <span class="comment">#(move-out for linear stacking)</span></span><br><span class="line">plot_modules.plot_all_moveout(sfiles,<span class="string">'Allstack_pws'</span><span class="number">0.1</span>,<span class="number">0.2</span>,<span class="string">'ZZ'</span>,<span class="number">1</span>,<span class="number">300</span>,<span class="literal">True</span>,<span class="string">'/SCAL/STACK'</span>) <span class="comment">#(move-out for pws)</span></span><br></pre></td></tr></table></figure>
<p><img src="/2020/12/27/NoisePy001/linear_stack1.png" alt="waveform3"><br><img src="/2020/12/27/NoisePy001/pws_stack1.png" alt="waveform3"><br>无论如何,这里仅给出一个简单的示例,说明NoisePy可能如何工作!<br>我们强烈建议您下载NoisePy软件包并自行探索!<br>如果在运行代码期间有任何意见和/或建议,请不要犹豫通过电子邮件与我们联系,或在<a href="https://github.com/mdenolle/NoisePy">此github页面</a>中创建issue!</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">Chengxin Jiang ([email protected])</span><br><span class="line">Marine Denolle ([email protected]).</span><br></pre></td></tr></table></figure>
<h3 id="参考文献"><a href="#参考文献" class="headerlink" title="参考文献"></a>参考文献</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">Seats, K. J., Jesse F. L., and German A. P. "Improved ambient noise correlation functions using Welch′ s method." Geophysical Journal International 188, no. 2 (2012): 513-523.</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">*Jiang, C. and Denolle, M. "NoisePy: a new high-performance python tool for seismic ambient noise seismology." Seismological Research Letter 91, no. 3 (2020): 1853–1866..</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">** Yuan, C., Bryan, J. T., Jiang, C., Okubo, K., Clements, T. and Denolle, M. (2019). Comparing approaches to measuring time- and frequency-dependent seismic phase variations for coda wave interferometry. In AGU Fall Meeting 2019.</span><br></pre></td></tr></table></figure>
<link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>obspy</category>
</categories>
<tags>
<tag>天然地震</tag>
</tags>
</entry>
<entry>
<title>使用bs4解析网站内容-以抓取Geophysics网站的文献词条为例</title>
<url>/2021/09/17/html_study1/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><h1 id="按照卷号和期号抓取Geophysics论文"><a href="#按照卷号和期号抓取Geophysics论文" class="headerlink" title="按照卷号和期号抓取Geophysics论文"></a>按照卷号和期号抓取Geophysics论文</h1><p>论文词条的输出格式如下:<br><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">作者,出版年份,论文标题,Geophysics,卷号(期号),页码,doi.</span><br></pre></td></tr></table></figure><br>论文抓取的函数如下(使用到了<code>bs4</code>和<code>requests</code>模块)<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">get_seg_paper_lists</span>(<span class="params">volume_no, issue_no, write_path</span>):</span><br><span class="line"> <span class="string">'''</span></span><br><span class="line"><span class="string"> volume_no: Geophysics卷号</span></span><br><span class="line"><span class="string"> issue_no: Geophysics期号</span></span><br><span class="line"><span class="string"> write_path:需要将文件写入的路径</span></span><br><span class="line"><span class="string"> '''</span></span><br><span class="line"> <span class="comment"># 需要抓取论文信息的页面</span></span><br><span class="line"> <span class="comment"># 例(2018年3-4月第83卷第2期):https://library.seg.org/toc/gpysa7/83/2</span></span><br><span class="line"> url = <span class="string">'https://library.seg.org/toc/gpysa7/'</span>+ <span class="string">'%02d'</span>%(volume_no) + <span class="string">'/%d'</span>%(issue_no)</span><br><span class="line"> html = requests.get(url)</span><br><span class="line"> html.encoding = <span class="string">'utf-8'</span></span><br><span class="line"> soup = BeautifulSoup(html.text, <span class="string">"html.parser"</span>)</span><br><span class="line"> <span class="comment"># 解析html文本</span></span><br><span class="line"> <span class="comment">## 每一篇论文都是一个titled_issues, 并且有的标签还包含了章节名titled_issues__title to-section</span></span><br><span class="line"> issues = soup.find_all(<span class="string">'div'</span>, <span class="string">'titled_issues'</span>)</span><br><span class="line"> <span class="comment"># 创建空字典,将章节名作为key,将章节下的包含文章词条的列表作为value</span></span><br><span class="line"> contents = <span class="built_in">dict</span>()</span><br><span class="line"> <span class="comment"># 循环遍历该volume-issue下的论文</span></span><br><span class="line"> <span class="keyword">for</span> issue <span class="keyword">in</span> issues:</span><br><span class="line"> <span class="comment"># 尝试获取章节名,如果章节名不是字典的键,则为该章节名添加空列表</span></span><br><span class="line"> to_section = issue.find(<span class="string">'h4'</span>, <span class="string">'titled_issues__title to-section'</span>)</span><br><span class="line"> <span class="keyword">if</span> to_section:</span><br><span class="line"> Section = to_section.string</span><br><span class="line"> <span class="keyword">if</span> Section <span class="keyword">not</span> <span class="keyword">in</span> contents.keys():</span><br><span class="line"> contents[Section]=[]</span><br><span class="line"> <span class="comment"># 获取页码</span></span><br><span class="line"> pages = get_pages(issue)</span><br><span class="line"> <span class="comment"># 获取作者列表</span></span><br><span class="line"> authors = get_authors(issue)</span><br><span class="line"> <span class="comment"># 获取论文标题</span></span><br><span class="line"> title = issue.find(<span class="string">'div'</span>, <span class="string">'issue-item__title'</span>).string</span><br><span class="line"> <span class="comment"># 获取论文doi</span></span><br><span class="line"> doi = issue.find(<span class="string">'div'</span>, <span class="string">'issue-item__doi'</span>).string</span><br><span class="line"> <span class="comment"># 若论文作者列表为空则设置为字符串‘None’</span></span><br><span class="line"> authors = <span class="string">'None'</span> <span class="keyword">if</span> authors <span class="keyword">is</span> <span class="literal">None</span> <span class="keyword">else</span> authors</span><br><span class="line"> <span class="comment"># 如果作者、标题和doi均不为空,则将论文信息整理为指定格式</span></span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">all</span>([authors, title, doi]):</span><br><span class="line"> ref = ref_type(authors,</span><br><span class="line"> title.title(),</span><br><span class="line"> volume2year(volume_no),</span><br><span class="line"> volume_no,</span><br><span class="line"> issue_no,</span><br><span class="line"> pages,</span><br><span class="line"> doi.title())</span><br><span class="line"> <span class="comment"># 将论文词条ref添加到其对应的章节Section中</span></span><br><span class="line"> contents[Section].append(ref)</span><br><span class="line"> <span class="comment"># 将章节和论文内容按照每卷每期写入文件</span></span><br><span class="line"> <span class="comment"># 章节1:</span></span><br><span class="line"> <span class="comment"># 论文1</span></span><br><span class="line"> <span class="comment"># 论文2</span></span><br><span class="line"> <span class="comment"># 章节2:</span></span><br><span class="line"> <span class="comment"># 论文1</span></span><br><span class="line"> <span class="comment"># ····</span></span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(write_path, <span class="string">'w'</span>, encoding=<span class="string">'utf-8'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> <span class="keyword">for</span> key, value <span class="keyword">in</span> <span class="built_in">zip</span>(contents.keys(), contents.values()):</span><br><span class="line"> f.write(key+<span class="string">':\n'</span>)</span><br><span class="line"> <span class="keyword">for</span> title <span class="keyword">in</span> value:</span><br><span class="line"> <span class="keyword">if</span> title:</span><br><span class="line"> f.write(<span class="string">'\t'</span>+title+<span class="string">'\n'</span>)</span><br><span class="line"> f.write(<span class="string">'\n'</span>)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'Lists have been written into %s'</span>%(write_path))</span><br></pre></td></tr></table></figure><br>子函数如下:<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 词条格式</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">ref_type</span>(<span class="params">author_list, title, year, volume, issue, pages, doi</span>):</span><br><span class="line"> <span class="string">'''</span></span><br><span class="line"><span class="string"> author_list: 作者列表</span></span><br><span class="line"><span class="string"> title :标题</span></span><br><span class="line"><span class="string"> year : 论文出版年份</span></span><br><span class="line"><span class="string"> volume :论文出版卷号</span></span><br><span class="line"><span class="string"> issue :论文出版期号</span></span><br><span class="line"><span class="string"> pages : 页码</span></span><br><span class="line"><span class="string"> doi :doi</span></span><br><span class="line"><span class="string"> '''</span></span><br><span class="line"> ref = <span class="string">', '</span>.join([author_list,</span><br><span class="line"> <span class="string">'%d'</span>%(year),</span><br><span class="line"> title,</span><br><span class="line"> <span class="string">'Geophysics'</span>,</span><br><span class="line"> <span class="string">'%d(%d)'</span>%(volume, issue),</span><br><span class="line"> pages])</span><br><span class="line"> ref = ref + <span class="string">'. doi: %s.'</span>%(doi.lower())</span><br><span class="line"> <span class="keyword">return</span> ref</span><br><span class="line"> </span><br><span class="line"><span class="comment"># 根据作者的数量输出合适的格式</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">combine_authors</span>(<span class="params">author_list</span>):</span><br><span class="line"> <span class="string">'''</span></span><br><span class="line"><span class="string"> author_list: 列表,包含作者的名字</span></span><br><span class="line"><span class="string"> '''</span></span><br><span class="line"> <span class="comment"># 只有一个作者</span></span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(author_list)==<span class="number">1</span>:</span><br><span class="line"> <span class="keyword">return</span> author_list[<span class="number">0</span>]</span><br><span class="line"> <span class="comment"># 两个作者,中间用and连接</span></span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(author_list)==<span class="number">2</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="string">' and '</span>.join(author_list)</span><br><span class="line"> <span class="comment"># 大于两个作者,出最后一个作者用and连接外,其他作者用,</span></span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(author_list)><span class="number">2</span>:</span><br><span class="line"> new_list = <span class="string">', '</span>.join(author_list[<span class="number">0</span>:-<span class="number">1</span>])</span><br><span class="line"> new_list += <span class="string">' and '</span>+author_list[-<span class="number">1</span>]</span><br><span class="line"> <span class="keyword">return</span> new_list</span><br><span class="line"><span class="comment"># 从html中抓取作者信息</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_authors</span>(<span class="params">issue</span>):</span><br><span class="line"> <span class="string">'''</span></span><br><span class="line"><span class="string"> issue: <titled_issues>每个论文的节点标签。</span></span><br><span class="line"><span class="string"> '''</span></span><br><span class="line"> authors = issue.find(<span class="string">'div'</span>, <span class="string">'issue-item__authors'</span>)</span><br><span class="line"> author_list = [d.string.title() <span class="keyword">for</span> d <span class="keyword">in</span> authors.find_all(<span class="string">'a'</span>)]</span><br><span class="line"> author_list = combine_authors(author_list)</span><br><span class="line"> <span class="keyword">return</span> author_list</span><br><span class="line"><span class="comment"># 从html中抓取页码信息</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_pages</span>(<span class="params">issue</span>):</span><br><span class="line"> <span class="string">'''</span></span><br><span class="line"><span class="string"> issue: <titled_issues>每个论文的节点标签。</span></span><br><span class="line"><span class="string"> '''</span></span><br><span class="line"> pages = issue.find(<span class="string">'ul'</span>, <span class="string">'rlist--inline separator toc-item__detail'</span>).find(<span class="string">'li'</span>).get_text(strip=<span class="literal">True</span>)</span><br><span class="line"> pages = pages.replace(<span class="string">'Pages:'</span>, <span class="string">''</span>).replace(<span class="string">' '</span>, <span class="string">''</span>)</span><br><span class="line"> <span class="keyword">return</span> pages</span><br><span class="line"><span class="comment"># 将卷转换为年</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">volume2year</span>(<span class="params">volume</span>):</span><br><span class="line"> <span class="string">'''</span></span><br><span class="line"><span class="string"> volume: 卷号。2017年为第82卷。</span></span><br><span class="line"><span class="string"> '''</span></span><br><span class="line"> <span class="keyword">return</span> volume + <span class="number">2017</span> - <span class="number">82</span></span><br></pre></td></tr></table></figure></p>
<p>以上即为如何利用bs4从html中解析文献信息。</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 脚本执行如下命令即可将第82卷第1期的文章列表下载到文件V82I1.txt中</span></span><br><span class="line">get_seg_paper_lists(<span class="number">82</span>, <span class="number">1</span>, <span class="string">'./V82I1.txt'</span>)</span><br></pre></td></tr></table></figure>
<link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>爬虫</category>
</categories>
<tags>
<tag>抓取文献词条</tag>
</tags>
</entry>
<entry>
<title>使用bs4解析网站内容-以抓取GJI网站的文献词条为例</title>
<url>/2021/09/23/html_study2/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><h1 id="按照卷号和期号抓取GJI-Geophysical-Journal-International-论文"><a href="#按照卷号和期号抓取GJI-Geophysical-Journal-International-论文" class="headerlink" title="按照卷号和期号抓取GJI(Geophysical Journal International)论文"></a>按照卷号和期号抓取GJI(Geophysical Journal International)论文</h1><p>论文词条输出格式如下:<br><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">序号. 作者列表, Geophysical Journal International, doi.</span><br></pre></td></tr></table></figure><br>论文抓取函数如下:<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">get_seg_paper_lists</span>(<span class="params">volume_no, issue_no, write_path</span>):</span><br><span class="line"> </span><br><span class="line"> url = <span class="string">'https://academic.oup.com/gji/issue/'</span>+ <span class="string">'%02d'</span>%(volume_no) + <span class="string">'/%d'</span>%(issue_no)</span><br><span class="line"> headers = {<span class="string">'User-Agent'</span>:<span class="string">'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '</span></span><br><span class="line"> <span class="string">'Chrome/51.0.2704.63 Safari/537.36'</span>}</span><br><span class="line"> html = requests.get(url, headers = headers)</span><br><span class="line"> html.encoding = <span class="string">'utf-8'</span></span><br><span class="line"> soup = BeautifulSoup(html.text, <span class="string">"html.parser"</span>)</span><br><span class="line"> issues = soup.find_all(<span class="string">'div'</span>, <span class="string">'al-article-item-wrap al-normal'</span>)</span><br><span class="line"> contents = []</span><br><span class="line"> <span class="keyword">for</span> issue <span class="keyword">in</span> issues:</span><br><span class="line"> <span class="comment">#authors = issue.find('div','al-authors-list')</span></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> authors = get_authors(issue)</span><br><span class="line"> <span class="keyword">except</span>:</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> title = issue.find(<span class="string">'h5'</span>, <span class="string">'customLink item-title'</span>).find(<span class="string">'a'</span>).string</span><br><span class="line"> title = title.title() <span class="keyword">if</span> title <span class="keyword">else</span> <span class="string">'None'</span></span><br><span class="line"> zipped = issue.find(<span class="string">'div'</span>, <span class="string">'pub-history-row clearfix'</span>)</span><br><span class="line"> </span><br><span class="line"> ref_mid = zipped.find(<span class="string">'div'</span>, <span class="string">'ww-citation-primary'</span>).contents[<span class="number">1</span>].title()</span><br><span class="line"> doi = zipped.find(<span class="string">'div'</span>, <span class="string">'ww-citation-primary'</span>).find(<span class="string">'a'</span>).contents[<span class="number">0</span>].title()</span><br><span class="line"></span><br><span class="line"> authors = <span class="string">'None'</span> <span class="keyword">if</span> authors <span class="keyword">is</span> <span class="literal">None</span> <span class="keyword">else</span> authors</span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">all</span>([authors, title, doi]):</span><br><span class="line"> ref = ref_type2(authors,</span><br><span class="line"> title,</span><br><span class="line"> doi.title())</span><br><span class="line"> contents.append(ref)</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># Write into files:</span></span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(write_path, <span class="string">'w'</span>, encoding=<span class="string">'utf-8'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> f.write(<span class="string">'Volume%d_Issue%d'</span>%(volume_no, issue_no)+<span class="string">'\n\n'</span>)</span><br><span class="line"> <span class="keyword">for</span> idx, ref <span class="keyword">in</span> <span class="built_in">enumerate</span>(contents):</span><br><span class="line"> f.write(<span class="string">'%02d. '</span>%(idx)+ref)</span><br><span class="line"> f.write(<span class="string">'\n'</span>)</span><br><span class="line"> </span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'Lists have been written into %s'</span>%(write_path))</span><br></pre></td></tr></table></figure></p>
<p>用到的其它函数:<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">combine_authors</span>(<span class="params">author_list</span>):</span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(author_list)==<span class="number">1</span>:</span><br><span class="line"> <span class="keyword">return</span> author_list[<span class="number">0</span>]</span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(author_list)==<span class="number">2</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="string">' and '</span>.join(author_list)</span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(author_list)><span class="number">2</span>:</span><br><span class="line"> new_list = <span class="string">', '</span>.join(author_list[<span class="number">0</span>:-<span class="number">1</span>])</span><br><span class="line"> new_list += <span class="string">' and '</span>+author_list[-<span class="number">1</span>]</span><br><span class="line"> <span class="keyword">return</span> new_list</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">ref_type2</span>(<span class="params">author_list, title, doi</span>):</span><br><span class="line"> </span><br><span class="line"> ref = <span class="string">', '</span>.join([author_list,</span><br><span class="line"> title,</span><br><span class="line"> <span class="string">'Geophysical Journal International'</span>,</span><br><span class="line"> doi.lower()+<span class="string">'.'</span>])</span><br><span class="line"> <span class="keyword">return</span> ref</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_authors</span>(<span class="params">issue</span>):</span><br><span class="line"> authors = issue.find(<span class="string">'div'</span>, <span class="string">'al-authors-list'</span>)</span><br><span class="line"> author_list = [d.string.title() <span class="keyword">for</span> d <span class="keyword">in</span> authors.find_all(<span class="string">'a'</span>)]</span><br><span class="line"> author_list = combine_authors(author_list)</span><br><span class="line"> <span class="keyword">return</span> author_list</span><br></pre></td></tr></table></figure><br>程序运行需执行如下命令:<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">get_seg_paper_lists(卷号, 期号, 文件写入路径)</span><br></pre></td></tr></table></figure></p>
<link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>爬虫</category>
</categories>
<tags>
<tag>抓取文献词条</tag>
</tags>
</entry>
<entry>
<title>CentOS下Anaconda及Tensorflow安装</title>
<url>/2020/06/11/install_atk/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><h1 id="CentOS7下深度学习环境配置(Anaconda-Tensorflow-Keras)"><a href="#CentOS7下深度学习环境配置(Anaconda-Tensorflow-Keras)" class="headerlink" title="CentOS7下深度学习环境配置(Anaconda+Tensorflow+Keras)"></a>CentOS7下深度学习环境配置(Anaconda+Tensorflow+Keras)</h1><h2 id="硬件信息查询"><a href="#硬件信息查询" class="headerlink" title="硬件信息查询"></a>硬件信息查询</h2><p>笔者的CPU和GPU型号分别如下:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ <span class="built_in">cat</span> /proc/cpuinfo |grep name|<span class="built_in">cut</span> -f2 -d:|<span class="built_in">uniq</span> -c <span class="comment">#查看CPU型号</span></span><br><span class="line"> 12 Intel(R) Xeon(R) E-2286G CPU @ 4.00GHz</span><br><span class="line">$ lspci | grep -i nvidia 查看连接的GPU设备</span><br><span class="line">01:00.0 VGA compatible controller: NVIDIA Corporation TU102 [GeForce RTX 2080 Ti Rev. A] (rev a1)</span><br><span class="line">01:00.1 Audio device: NVIDIA Corporation TU102 High Definition Audio Controller (rev a1)</span><br><span class="line">01:00.2 USB controller: NVIDIA Corporation TU102 USB 3.1 Host Controller (rev a1)</span><br><span class="line">01:00.3 Serial bus controller [0c80]: NVIDIA Corporation TU102 USB Type-C UCSI Controller (rev a1)</span><br><span class="line"><span class="comment">#如果CUDA和驱动已经安装完成并且~/.bashrc也配置完成则可以通过 nvidia-smi 查询驱动及GPU信息。</span></span><br><span class="line">$ nvidia-smi <span class="comment">#输出GPU运行状态及驱动版本</span></span><br><span class="line">Tue Jun 9 11:30:14 2020 </span><br><span class="line">+-----------------------------------------------------------------------------+</span><br><span class="line">| NVIDIA-SMI 440.82 Driver Version: 440.82 CUDA Version: 10.2 |</span><br><span class="line">|-------------------------------+----------------------+----------------------+</span><br><span class="line">| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |</span><br><span class="line">| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |</span><br><span class="line">|===============================+======================+======================|</span><br><span class="line">| 0 GeForce RTX 208... Off | 00000000:01:00.0 On | N/A |</span><br><span class="line">| 66% 84C P2 233W / 250W | 10969MiB / 11016MiB | 91% Default |</span><br><span class="line">+-------------------------------+----------------------+----------------------+</span><br></pre></td></tr></table></figure>
<p>另外,对于 <strong>CUDA</strong> 和 <strong>cuDNN</strong> 版本的查询可通过以下方式进行:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ nvcc --version <span class="comment">#查询cuda版本</span></span><br><span class="line">nvcc: NVIDIA (R) Cuda compiler driver</span><br><span class="line">Copyright (c) 2005-2018 NVIDIA Corporation</span><br><span class="line">Built on Sat_Aug_25_21:08:01_CDT_2018</span><br><span class="line">Cuda compilation tools, release 10.0, V10.0.130</span><br><span class="line"><span class="comment">#或者</span></span><br><span class="line">$ <span class="built_in">cat</span> /usr/local/cuda/version.txt</span><br><span class="line">CUDA Version 10.0.130</span><br><span class="line">$ <span class="built_in">cat</span> /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2 <span class="comment">#查询cudnn版本</span></span><br><span class="line"><span class="comment">#define CUDNN_MAJOR 7</span></span><br><span class="line"><span class="comment">#define CUDNN_MINOR 6</span></span><br><span class="line"><span class="comment">#define CUDNN_PATCHLEVEL 5</span></span><br><span class="line">--</span><br><span class="line"><span class="comment">#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)</span></span><br><span class="line"><span class="comment">#include "driver_types.h"</span></span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h2 id="Anaconda-安装"><a href="#Anaconda-安装" class="headerlink" title="Anaconda 安装"></a>Anaconda 安装</h2><p>64位Linux的 <strong>Anacoda</strong> 安装包可以到<a href="https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/">清华源</a>上下载,笔者下载安装的是5.3.1版本(<a href="https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.3.1-Linux-x86_64.sh">下载地址</a>),文件格式为 <strong>.sh</strong>,安装包下载完成后,我们进入到下载目录中,打开 <strong>terminal</strong> 并输入</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ bash Anaconda3-5.3.1-Linux-x86_64.sh -u <span class="comment"># -u可自定义安装目录</span></span><br><span class="line"><span class="comment">#进入安装后敲回车,直到出现界面并输入yes继续安装或者no退出安装:</span></span><br><span class="line">$ Please answer <span class="string">'yes'</span> or <span class="string">'no'</span>:<span class="string">'</span></span><br><span class="line"><span class="string">>>> yes</span></span><br><span class="line"><span class="string">Anaconda3 will now be installed into this location:</span></span><br><span class="line"><span class="string">/当前将要安装的目录</span></span><br><span class="line"><span class="string"> - Press ENTER to confirm the location</span></span><br><span class="line"><span class="string"> - Press CTRL-C to abort the installation</span></span><br><span class="line"><span class="string"> - Or specify a different location below</span></span><br><span class="line"><span class="string">[/home/wangsw/anaconda3] >>> /此处输入你需要安装的目录</span></span><br><span class="line"><span class="string">#部分目录需要其它用户或者root权限,确认之后之后将会完成安装,最后会提示是否需要将Anaconda路径写入环境变量(推荐自动写入)以及是否需要使用VSCode(根据个人需要):</span></span><br><span class="line"><span class="string">$ Do you wish the installer to initialize Anaconda3</span></span><br><span class="line"><span class="string">in your /root/.bashrc ? [yes|no]</span></span><br><span class="line"><span class="string">[no] >>> no</span></span><br><span class="line"><span class="string">$ Do you wish to proceed with the installation of Microsoft VSCode? [yes|no]</span></span><br><span class="line"><span class="string">>>> no</span></span><br><span class="line"><span class="string">#此时安装已经完成。</span></span><br></pre></td></tr></table></figure>
<h2 id="conda-环境创建"><a href="#conda-环境创建" class="headerlink" title="conda 环境创建"></a>conda 环境创建</h2><p>然后我们开始配置 <strong>conda</strong> 环境,不同 <strong>conda</strong> 环境可以安装不同 <strong>python</strong> 版本以及 <strong>tensorflow</strong> 等版本,其相当于一个容器,可用于不同需求的生产环境。为了加速 <strong>conda</strong> 环境配置过程,与安装完系统后进行相同的操作:更新下载源(可使用清华源、中科大源等)</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ conda config --show <span class="comment">#输入后找到 channels 属性可查看已有下载源,若没有镜像源则执行以下命令</span></span><br><span class="line">$ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/</span><br><span class="line">$ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/</span><br><span class="line">$ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/</span><br><span class="line">$ conda config --<span class="built_in">set</span> show_channel_urls <span class="built_in">yes</span> <span class="comment">#该命令可允许下载时显示源地址</span></span><br><span class="line">$ conda clean -i <span class="comment">#清除索引缓存,保证用的是镜像站提供的索引。</span></span><br><span class="line">$ conda config --show <span class="comment">#查看是否源地址是否更新完成</span></span><br></pre></td></tr></table></figure>
<p>更新完源之后我们建立深度学习环境,首先创建一个特定 <strong>python</strong> 版本的 <strong>conda</strong> 环境:<br><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ conda create -n env_name python=3.x <span class="comment">#env_name处输入自己想要建立的环境名称,x处填写需要的python版本,笔者为了保证原有代码的可移植性,使用python3.6版本</span></span><br><span class="line"> Solving environment: \ <span class="comment">#环境配置中,耐心等待即可</span></span><br><span class="line"> <span class="comment">## Package Plan ##</span></span><br><span class="line"> environment location: /xxxxxx/Anaconda/envs/env_name</span><br><span class="line"> added / updated specs: </span><br><span class="line"> - python=3.6</span><br><span class="line"> </span><br><span class="line">The following packages will be downloaded:</span><br><span class="line"> package | build</span><br><span class="line"> ---------------------------|-----------------</span><br><span class="line"> certifi-2020.4.5.2 | py36h9f0ad1d_0 152 KB https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> ld_impl_linux-64-2.34 | h53a641e_5 616 KB https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> ca-certificates-2020.4.5.2 | hecda079_0 147 KB https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> ------------------------------------------------------------</span><br><span class="line"> Total: 914 KB</span><br><span class="line"></span><br><span class="line">The following NEW packages will be INSTALLED:</span><br><span class="line"></span><br><span class="line"> _libgcc_mutex: 0.1-conda_forge https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> _openmp_mutex: 4.5-0_gnu https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> ca-certificates: 2020.4.5.2-hecda079_0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> certifi: 2020.4.5.2-py36h9f0ad1d_0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> ld_impl_linux-64: 2.34-h53a641e_5 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> libffi: 3.2.1-he1b5a44_1007 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> libgcc-ng: 9.2.0-h24d8f2e_2 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> libgomp: 9.2.0-h24d8f2e_2 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> libstdcxx-ng: 9.2.0-hdf63c60_2 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> ncurses: 6.1-hf484d3e_1002 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> openssl: 1.1.1g-h516909a_0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> pip: 20.1.1-py_1 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> python: 3.6.10-h8356626_1011_cpython https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> python_abi: 3.6-1_cp36m https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> readline: 8.0-hf8c457e_0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> setuptools: 47.1.1-py36h9f0ad1d_0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> sqlite: 3.30.1-hcee41ef_0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> tk: 8.6.10-hed695b0_0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> wheel: 0.34.2-py_1 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> xz: 5.2.5-h516909a_0 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"> zlib: 1.2.11-h516909a_1006 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br><span class="line"></span><br><span class="line">Proceed ([y]/n)? <span class="comment">#输入y即可,可以看到安装包均从上文中配置的地址中下载</span></span><br><span class="line"></span><br><span class="line">Downloading and Extracting Packages</span><br><span class="line">ca-certificates-2020 | 147 KB | <span class="comment">##################################### | 100% </span></span><br><span class="line">certifi-2020.4.5.2 | 152 KB | <span class="comment">##################################### | 100% </span></span><br><span class="line">ld_impl_linux-64-2.3 | 616 KB | <span class="comment">##################################### | 100% </span></span><br><span class="line">Preparing transaction: <span class="keyword">done</span></span><br><span class="line">Verifying transaction: <span class="keyword">done</span></span><br><span class="line">Executing transaction: <span class="keyword">done</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># To activate this environment, use:</span></span><br><span class="line"><span class="comment"># > source activate env_name</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># To deactivate an active environment, use:</span></span><br><span class="line"><span class="comment"># > source deactivate</span></span><br><span class="line"><span class="comment">#</span></span><br></pre></td></tr></table></figure><br>安装完成后,我们可以通过 <code>$ source activate env_name</code>来打开创建好的环境,<code>pip list</code>可查看当前环境下已经安装的轮子,<code>pip show [package_name]</code>可以查看轮子的版本等信息(输入时去掉中括号)。</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">(env_name)[root]$ pip list <span class="comment">#查看已安装轮子</span></span><br><span class="line">Package Version</span><br><span class="line">---------- -------------------</span><br><span class="line">certifi 2020.4.5.2</span><br><span class="line">pip 20.1.1</span><br><span class="line">setuptools 47.1.1.post20200529</span><br><span class="line">wheel 0.34.2</span><br><span class="line">(env_name)[root]$ pip show certifi <span class="comment">#查看轮子信息</span></span><br><span class="line">Name: certifi</span><br><span class="line">Version: 2020.4.5.2</span><br><span class="line">Summary: Python package <span class="keyword">for</span> providing Mozilla<span class="string">'s CA Bundle.</span></span><br><span class="line"><span class="string">Home-page: https://certifiio.readthedocs.io/en/latest/</span></span><br><span class="line"><span class="string">Author: Kenneth Reitz</span></span><br><span class="line"><span class="string">Author-email: [email protected]</span></span><br><span class="line"><span class="string">License: MPL-2.0</span></span><br><span class="line"><span class="string">Location: /..../Anaconda/envs/test/lib/python3.6/site-packages</span></span><br><span class="line"><span class="string">Requires: </span></span><br><span class="line"><span class="string">Required-by: </span></span><br></pre></td></tr></table></figure>
<p>同样的,为了加速 <strong>conda</strong> 环境内 <strong>pip</strong> 下载的速度我们首先更换下载源:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">(env_name)[root]$ pip config <span class="built_in">set</span> global.index-url https://pypi.tuna.tsinghua.edu.cn/simple</span><br><span class="line">Writing to /..../.config/pip/pip.conf</span><br></pre></td></tr></table></figure>
<p>之后,可通过 <code>$pip install package</code> 的命令下载和安装轮子了(如果没有配置下载源的话,可以通过<code>$ pip install package -i https://pypi.tuna.tsinghua.edu.cn/simple</code>的方式临时使用 <strong>url</strong> 下载)。需要注意的是,该环境下安装的包只能在环境内使用,这也允许我们能够使用多个版本的生产环境,只需要<code>$ source activate env_name</code>即可。</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment">#笔者使用的生产环境之一为:</span></span><br><span class="line">(env_name)[root]$ pip install tensorflow-gpu==1.14.0</span><br><span class="line">(env_name)[root]$ pip install keras==2.2.5</span><br><span class="line">(env_name)[root]$ pip install numpy==1.16.0</span><br><span class="line">(env_name)[root]$ <span class="built_in">source</span> deactivate <span class="comment">#退出已打开的环境env_name</span></span><br></pre></td></tr></table></figure>
<h2 id="conda-常用命令"><a href="#conda-常用命令" class="headerlink" title="conda 常用命令"></a>conda 常用命令</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ conda --version <span class="comment">#查看conda版本</span></span><br><span class="line">$ conda creat -n your_env_name python==3.x <span class="comment">#创建python版本为3.x的conda环境</span></span><br><span class="line">$ conda remove --name your_env_name --all <span class="comment">#删除已创建环境</span></span><br><span class="line">$ conda create --name new_env --<span class="built_in">clone</span> old_env <span class="comment">#创建新conda环境new_env并将old_env环境复制到前者中</span></span><br><span class="line">$ <span class="built_in">source</span> activate your_env_name <span class="comment">#激活已创建环境</span></span><br><span class="line">$ <span class="built_in">source</span> deactivate <span class="comment">#退出当前窗口中已激活环境</span></span><br><span class="line">$ conda info -e <span class="comment">#查询已安装环境</span></span><br><span class="line">$ conda install --name your_env_name package_name <span class="comment">#在指定环境your_env_name中安装package_name包(例如conda install my_env tensorflow-gpu==2.0.0)</span></span><br><span class="line">$ conda update conda <span class="comment">#(不推荐)将conda更新至最新版本,但也会更新其它相关包</span></span><br></pre></td></tr></table></figure>
<link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>装机</category>
</categories>
<tags>
<tag>深度学习环境配置</tag>
</tags>
</entry>
<entry>
<title>CentOS下CUDA及cuDNN安装</title>
<url>/2020/06/10/install_cudacudnn/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><h1 id="工作站CentOS-7下CUDA驱动及cuDNN安装"><a href="#工作站CentOS-7下CUDA驱动及cuDNN安装" class="headerlink" title="工作站CentOS-7下CUDA驱动及cuDNN安装"></a>工作站CentOS-7下CUDA驱动及cuDNN安装</h1><h2 id="安装包选择及下载"><a href="#安装包选择及下载" class="headerlink" title="安装包选择及下载"></a>安装包选择及下载</h2><ul>
<li><strong>Nvidia驱动下载:</strong> 一般不使用 <strong>CUDA</strong> 安装包中的驱动程序,而是到<a href="https://www.nvidia.cn/Download/index.aspx?lang=cn">官方网站</a>根据 GPU 型号下载对应驱动,这里我们选择与 <strong>RTX2080Ti</strong> 对应的<a href="http://cn.download.nvidia.com/XFree86/Linux-x86_64/440.82/NVIDIA-Linux-x86_64-440.82.run">440.82-Linux 64-bit</a>版本,笔者首先安装的驱动,然后才装的 <strong>CUDA-10.0</strong> ,理论上二者先后顺序没有强制性。若先装 <strong>CUDA</strong> 的话记住<strong>不要不要不要不要安装自带的驱动程序</strong>,否则<strong>可能会出现重启后黑屏无法进入系统等问题</strong>。<strong>Ubuntu</strong> 中一般能够通过命令行操作删除驱动和 <strong>CUDA</strong>,但在 <strong>CentOS</strong> 系统中可能会导致无法进入终端命令行字符界面,完全黑屏时最粗暴的处理办法就是重装系统,<strong>grub</strong> 中的操作方式笔者没有研究过。当然了,如果先装驱动程序后装 <strong>CUDA</strong> ,自带的驱动自然也是不需要安装的。</li>
<li><strong>CUDA Toolkit</strong> 下载:版本根据实际需要进行选择,笔者最开始接触的GPU并行编程语言的时候就已经是 <strong>v10.0</strong> 了(现在最新版本为 <strong><a href="https://developer.nvidia.com/cuda-downloads?target_os=Linux">CUDA11</a></strong>),本机器上安装的 <strong><a href="https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda-repo-rhel7-10-0-local-10.0.130-410.48-1.0-1.x86_64">CUDA_10.0.130</a></strong>(<a href="https://developer.nvidia.com/cuda-toolkit-archive">历史版本 <strong>CUDA</strong> 下载地址</a>)</li>
<li><strong>cuDNN下载</strong>:下载 <strong>cuDNN</strong> 前要先注册一个 <strong>Nvidia</strong> 账户,忘记密码的话通过官方渠道申请修改密码可能会遇到无法收到邮件的问题,这一问题暂时没有好的解决办法;如果没有账户的话直接注册一个即可,(注册账户的邮件能收到,修改密码的经常收不到,同时我们注意到官方开通了微信或者QQ登陆方式,但是我打不开。。。),<strong>cuDNN</strong> 版本与 <strong>CUDA</strong> 版本要对应上,这里笔者使用的是与 <strong>CUDA10.0</strong>对应的 <strong>cuDNN7</strong> (cudnn-10.0-linux-x64-v7.6.5.32,没有链接,刚改了密码又忘了登不上去了= =)。</li>
</ul>
<div class="table-container">
<table>
<thead>
<tr>
<th>CUDA Toolkit</th>
<th>Linuxx86_64驱动版本</th>
<th>Windowsx86_64驱动版本</th>
</tr>
</thead>
<tbody>
<tr>
<td>CUDA 10.2.89</td>
<td>>= 440.33</td>
<td>>= 441.22</td>
</tr>
<tr>
<td>CUDA 10.1 (10.1.105 general release, and updates)</td>
<td>>= 418.39</td>
<td>>= 418.96</td>
</tr>
<tr>
<td>CUDA 10.0.130</td>
<td>>= 410.48</td>
<td>>= 411.31</td>
</tr>
<tr>
<td>CUDA 9.2 (9.2.148 Update 1)</td>
<td>>= 396.37</td>
<td>>= 398.26</td>
</tr>
<tr>
<td>CUDA 9.2 (9.2.88)</td>
<td>>= 396.26</td>
<td>>= 397.44</td>
</tr>
<tr>
<td>CUDA 9.1 (9.1.85)</td>
<td>>= 390.46</td>
<td>>= 391.29</td>
</tr>
<tr>
<td>CUDA 9.0 (9.0.76)</td>
<td>>= 384.81</td>
<td>>= 385.54</td>
</tr>
<tr>
<td>CUDA 8.0 (8.0.61 GA2)</td>
<td>>= 375.26</td>
<td>>= 376.51</td>
</tr>
<tr>
<td>CUDA 8.0 (8.0.44)</td>
<td>>= 367.48</td>
<td>>= 369.30</td>
</tr>
</tbody>
</table>
</div>
<h2 id="安装过程"><a href="#安装过程" class="headerlink" title="安装过程"></a>安装过程</h2><p>在准备好以下三个文件后就可以开始安装了(最好先把它们都下载下来放到U盘里,做好多次重装系统的准备)</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ cuda_10.0.130_410.48_linux.run <span class="comment">#CUDA Toolkit</span></span><br><span class="line">$ cudnn-10.0-linux-x64-v7.6.5.32.tgz <span class="comment">#cuDNN for CUDA10</span></span><br><span class="line">$ NVIDIA-Linux-x86_64-440.82.run <span class="comment">#Nvidia-driver for RTX2080Ti</span></span><br></pre></td></tr></table></figure>
<ul>
<li><strong>Nvidia 驱动及CUDA安装</strong></li>
</ul>
<p>首先查看是否开启了默认的 <strong>nouveau</strong> 驱动,如果输入<code>lsmod | grep nouveau</code> 没有任何提示的话则已经关闭了该驱动,若有提示,则需要首先禁用该驱动:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">[root]$ <span class="built_in">cp</span> /etc/modprobe.d/blacklist.conf /etc/modprobe.d/blacklist.conf.back <span class="comment">#备份原有黑名单(如果提示没有此文件的话可以在该目录下创建一个新的同名文件,然后再进行后续操作)</span></span><br><span class="line">[root]$ <span class="built_in">echo</span> -e <span class="string">"blacklist nouveau\noptions nouveau modeset=0"</span> > /etc/modprobe.d/blacklist.conf <span class="comment">#禁用nouveau驱动</span></span><br><span class="line">[root]$ <span class="built_in">mv</span> /boot/initramfs-$(<span class="built_in">uname</span> -r).img /boot/initramfs-$(<span class="built_in">uname</span> -r).img.back <span class="comment">#备份initramfs</span></span><br><span class="line">[root]$ dracut /boot/initramfs-$(<span class="built_in">uname</span> -r).img $(<span class="built_in">uname</span> -r) --force <span class="comment">#重建initramfs</span></span><br><span class="line">[root]$ init 6 <span class="comment">#重启</span></span><br><span class="line">[root]$ <span class="built_in">cd</span> /../../ <span class="comment">#切换到驱动所在目录</span></span><br><span class="line">[root]$ sh ./NVIDIA-Linux-x86_64-440.82.run <span class="comment">#执行安装过程(安装如果卡在Verifying archive integrity... Error in check sums 00000000 000000,重新到官网上选择自己显卡型号的驱动下载再次安装即可)</span></span><br><span class="line">[root]$ nvidia-smi <span class="comment">#查看驱动是否安装成功,若顺利输出GPU信息则成功,或者切换到Toolkit的Samples中编译并运行带着的例子,显示Result=PASS则能够顺利运行CUDA程序。</span></span><br><span class="line">[root]$ sh ./cuda_10.0.130_410.48_linux.run <span class="comment">#安装CUDA Toolkit,记住不要安装里面带着的驱动</span></span><br><span class="line">[root]$ reboot <span class="comment">#安装完成重启,顺利进入图形界面~</span></span><br></pre></td></tr></table></figure>
<ul>
<li><strong>cuDNN</strong>安装</li>
</ul>
<p>话不多说直接上代码</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">[root]$ <span class="built_in">cd</span> /../../ <span class="comment">#切换到cuDNN安装包所在目录</span></span><br><span class="line">[root]$ tar -xzvf cudnn-10.0-linux-x64-v7.6.5.32.tgz <span class="comment">#解压cudnn到当前文件夹</span></span><br><span class="line">[root]$ <span class="built_in">cp</span> cuda/include/cudnn.h /usr/local/cuda-10.0/include/</span><br><span class="line">[root]$ <span class="built_in">cp</span> cuda/lib64/libcudnn* /usr/local/cuda/lib64/</span><br><span class="line">[root]$ <span class="built_in">chmod</span> a+r /usr/local/cuda-10.0/include/cudnn.h /usr/local/cuda/lib64/libcudnn*</span><br><span class="line"><span class="comment"># 系统环境下解决:以下两步为解决tensorflow运行中找不到链接文件的问题,如果CUDA版本不同请自主更改系统路径</span></span><br><span class="line">[root]$ <span class="built_in">cp</span> /usr/local/cuda-10.0/lib64/libcublas.so.10.0 /usr/local/lib/libcublas.so.10.0 && sudo ldconfig</span><br><span class="line">[root]$ <span class="built_in">cp</span> /usr/local/cuda-10.0/lib64/libcufft.so.10.0 /usr/local/lib/libcufft.so.10.0 && sudo ldconfig</span><br><span class="line"><span class="comment"># Conda环境下解决:</span></span><br><span class="line">[root]$ conda install cudatoolkit=10.0 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/linux-64/ <span class="comment"># 解决思路:在conda环境中重新安装cudatoolkit和cudnn</span></span><br><span class="line">[root]$ conda install cudnn==7.6.5 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/linux-64/ <span class="comment"># </span></span><br><span class="line">[username]$ vim ~/.bashrc <span class="comment">#个人账户下CUDA相关环境变量的配置</span></span><br><span class="line"><span class="comment">#--------------------------------------------------#</span></span><br><span class="line">CUDA_HOME=/usr/local/cuda-10.0</span><br><span class="line">PATH=<span class="variable">$PATH</span>:/usr/local/cuda-10.0/bin</span><br><span class="line">LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64</span><br><span class="line"><span class="built_in">export</span> CUDA_HOME PATH LD_LIBRARY_PATH</span><br><span class="line"><span class="comment">#--------------------------------------------------#</span></span><br><span class="line">[username]$ <span class="built_in">source</span> ~/.bashrc <span class="comment">#配置完成后立即更新环境变量</span></span><br></pre></td></tr></table></figure>
<ul>
<li>查看是否安装成功</li>
</ul>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">[root]$ nvcc --version <span class="comment">#查看编译器及CUDA版本</span></span><br><span class="line">[root]$ nvidia-smi <span class="comment">#查看GPU信息、驱动版本</span></span><br><span class="line">[root]$ <span class="built_in">cat</span> /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2 <span class="comment">#查看cuDNN版本</span></span><br></pre></td></tr></table></figure>
<h2 id="进阶设置"><a href="#进阶设置" class="headerlink" title="进阶设置"></a>进阶设置</h2><h3 id="1-安装温度监控器"><a href="#1-安装温度监控器" class="headerlink" title="1. 安装温度监控器"></a>1. 安装温度监控器</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">[root]$ yum install lm_sensors <span class="comment">#下载安装lm_sensors插件</span></span><br><span class="line">[root]$ /usr/sbin/sensors-detect <span class="comment">#运行sensors-detect配置程序</span></span><br><span class="line">[notroot]$ sensors <span class="comment">#查看已允许检测设备的当前状态</span></span><br></pre></td></tr></table></figure>
<h3 id="2-手动控制-GPU-风扇转速"><a href="#2-手动控制-GPU-风扇转速" class="headerlink" title="2. 手动控制 GPU 风扇转速"></a>2. 手动控制 <strong>GPU</strong> 风扇转速</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">[root]$ <span class="built_in">cp</span> /etc/X11/xorg.conf /etc/X11/xorg.conf.back <span class="comment">#备份原有xorg配置文件</span></span><br><span class="line">[root]$ vim xorg.conf</span><br><span class="line"><span class="comment">#-----------File Start--------------#</span></span><br><span class="line">Section <span class="string">"Device"</span></span><br><span class="line"> Identifier <span class="string">"Videocard0"</span></span><br><span class="line"> Driver <span class="string">"nvidia"</span></span><br><span class="line"> Option <span class="string">"Coolbits"</span> <span class="string">"4"</span> <span class="comment">#增加该行内容后重启,可在Applications-other-Nvidia X Server Settings-GPU-Thermal Settings</span></span><br><span class="line">EndSection</span><br><span class="line"><span class="comment">#-----------File End--------------#</span></span><br><span class="line">[root]$ nvidia-settings -a <span class="string">"[gpu:0]/GPUFanControlState=0"</span> <span class="comment">#恢复GPU转速随温度控制</span></span><br></pre></td></tr></table></figure>
<h3 id="3-常用-GPU-相关命令"><a href="#3-常用-GPU-相关命令" class="headerlink" title="3. 常用 GPU 相关命令"></a>3. 常用 GPU 相关命令</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ nvidia-smi -L <span class="comment">#列出所有可使用的GPU设备</span></span><br><span class="line">$ nvidia-smi -l <span class="comment">#与nvidia-smi功能相同但带有自动刷新功能(不清空输出缓存区)</span></span><br><span class="line">$ nvidia-smi -q <span class="comment">#查看所有GPU设备信息</span></span><br><span class="line">$ nvidia-smi –pm 0/1 <span class="comment">#设置持久模式:0/DISABLED,1/ENABLED</span></span><br><span class="line">$ nvidia-smi –e 0/1 <span class="comment">#切换ECC支持:0/DISABLED, 1/ENABLED</span></span><br><span class="line">$ nvidia-smi –p 0/1 <span class="comment">#重置ECC错误计数:0/VOLATILE, 1/AGGREGATE</span></span><br><span class="line">$ nvidia-smi –c <span class="comment">#设置计算应用模式:0/DEFAULT,1/EXCLUSIVE_PROCESS,2/PROHIBITED</span></span><br><span class="line">$ nvidia-smi –r <span class="comment">#GPU复位</span></span><br><span class="line">$ nvidia-smi –vm <span class="comment">#设置GPU虚拟化模式</span></span><br><span class="line">$ nvidia-smi –ac xxx,xxx <span class="comment">#设置GPU运行的工作频率。e.g. nvidia-smi –ac2000,800</span></span><br><span class="line">$ nvidia-smi –rac <span class="comment">#0/1 将时钟频率重置为默认值</span></span><br><span class="line">$ nvidia-smi –acp <span class="comment">#切换-ac和-rac的权限要求,0/UNRESTRICTED, 1/RESTRICTED</span></span><br><span class="line">$ nvidia-smi –pl <span class="comment">#指定最大电源管理限制(瓦特)</span></span><br><span class="line">$ nvidia-smi –am 0/1 <span class="comment">#启用或禁用计数模式,0/DISABLED,1/ENABLED</span></span><br><span class="line">$ nvidia-smi –caa <span class="comment">#清除缓冲区中的所有已记录PID,0/DISABLED,1/ENABLED</span></span><br></pre></td></tr></table></figure>
<h3 id="4-动态监控"><a href="#4-动态监控" class="headerlink" title="4. 动态监控"></a>4. 动态监控</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment">#实际上,可以使用watch命令实现动态监控(不需要root权限)</span></span><br><span class="line">$ watch -n 1 sensors <span class="comment"># 1表示每隔一秒刷新sensors</span></span><br><span class="line">$ watch -n 1 nvidia-smi <span class="comment">#同理可动态监控GPU运行状态,以判断Tensorfow是否正确使用了GPU运行</span></span><br></pre></td></tr></table></figure>
<link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>装机</category>
</categories>
<tags>
<tag>CUDA及cuDNN下载与安装</tag>
</tags>
</entry>
<entry>
<title>Dell工作站CentOS-7装机</title>
<url>/2020/06/07/installation/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><h1 id="工作站CentOS7装机"><a href="#工作站CentOS7装机" class="headerlink" title="工作站CentOS7装机"></a>工作站CentOS7装机</h1><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>本次装机的工作站型号为<strong>Dell Precision T3630</strong>,搭载有<strong>Intel(R)Xoen@E2286G</strong>处理器(6核心/12线程,4.00GHz),512G固态硬盘、1T机械硬盘以及<strong>RTX2080Ti</strong>显卡一张(单涡轮)。文章将分为以下几部分介绍:<br><span id="more"></span></p>
<ol>
<li><strong>CentOS7</strong>系统安装;</li>
<li>显卡驱动、<strong>CUDA Toolkit</strong>以及<strong>cuDNN</strong>安装;</li>
<li>深度学习环境配置,诸如常用的框架 <strong>Tensorflow</strong>、<strong>Keras</strong>等;</li>
</ol>
<p><em>本章节主要介绍第一部分内容,其它内容将在其它日志中更新,欢迎关注。需要注意的是除系统iso文件外,其他所有安装包作者均在安装完的系统内部下载的(主机插了网线,下载速度比较快,卧室离路由器太远收不到5GHz的信号,2.5GHz下载实在是太慢了),如果没有有线网络的小伙伴可以考虑将手机接到主机上联网下载,而且这台工作站支持Type-c接口哦。</em></p>
<h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><p><em>准备工作</em>:一个6G及以上内存的U盘(用于镜像文件的制作,CentOS7安装文件大小为4.8G),一个U盘启动制作工具以及CentOS-7-x86_64-xxx.iso镜像文件一个。<br>U盘制作工具使用<a href="https://cn.ultraiso.net/xiazai.html">UltraISO</a>,镜像文件使用国内的<a href="http://mirrors.aliyun.com/centos/7/isos/x86_64/">阿里云源</a>下载,作者安装的是DVD版本(<a href="http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2003.iso">CentOS-7-x86_64-DVD-2003.iso</a>),文件大小为4.5G,此安装包内能够满足一般用户的需求,并且在安装过程中可以根据实际需要对packages进行选择。选择此版本的原因是保持与实验室工作站环境的一致性,尽量减少代码移植过程中出现的问题(但人工智能的代码的可移植性是比较差的,其主要与<em>Tensorflow</em>、<em>Keras</em>等框架的版本相关)。</p>
<h2 id="CentOS7-64bit系统安装"><a href="#CentOS7-64bit系统安装" class="headerlink" title="CentOS7-64bit系统安装"></a>CentOS7-64bit系统安装</h2><h3 id="U盘启动制作"><a href="#U盘启动制作" class="headerlink" title="U盘启动制作"></a>U盘启动制作</h3><ol>
<li>下载并安装UltraISO(<a href="https://cn.ultraiso.net/xiazai.html">下载地址</a>);</li>
<li>下载CentosOS-7镜像文件(<a href="http://mirrors.aliyun.com/centos/7/isos/x86_64/">下载地址</a>),选择DVD版本(<a href="http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2003.iso">CentOS-7-x86_64-DVD-2003.iso</a>);</li>
<li>备用电脑中插入U盘(制作启动U盘需要将其格式化,所以先要备份好U盘中的原始数据);</li>
<li>打开UltraISO程序—-<strong>继续试用</strong>;<br><img src="/2020/06/07/installation/ultraiso_enter.png" alt="UltraISO"></li>
<li>单击左上角<strong>文件</strong>—-<strong>打开</strong>;<br><img src="/2020/06/07/installation/ultraiso_open.png" alt="UltraISOstart"></li>
<li>选择下载好的iso文件;<br><img src="/2020/06/07/installation/ultraiso_select.png" alt="SelectISO"></li>
<li><strong>启动</strong>—-<strong>写入硬盘映像</strong><br><img src="/2020/06/07/installation/ultraiso_start.png" alt="WriteSelect"></li>
<li>在<strong>硬盘驱动器</strong>一栏选择自己的U盘,其他设置保持默认,然后单击<strong>写入</strong>开始U盘启动制作过程;<br><img src="/2020/06/07/installation/ultraiso_write.png" alt="WriteToUdisk"></li>
<li>写入完成后我们可以看到U盘盘符的名字有些奇怪(UltraISO软件问题,使用其他U盘启动制作工具可能会解决该问题),如果直接用它安装系统会出现错误,这时我们要修改U盘的盘符(U盘处右键—-属性)为引号内的内容“ <strong>CENTOS7</strong> ”(必须为大写);<br><img src="/2020/06/07/installation/u_modify.png" alt="ModifyU"></li>
<li>然后进入<em>U盘/EFI/BOOT</em>,在目录中找到grub.cfg文件并打开,将其中所有的 <strong>CentOS\x207\x20x86_64</strong> 替换为 <strong>CENTOS7</strong>(与U盘盘符保持一致),这样启动盘就制作完成了。<br><img src="/2020/06/07/installation/grub.png" alt="Grub"></li>
</ol>
<h3 id="系统安装"><a href="#系统安装" class="headerlink" title="系统安装"></a>系统安装</h3><p> 作者使用的主机没有预装其它系统,准备只安装 <strong>CentOS7</strong> 用于科研。</p>
<ol>
<li>启动主机,在显示器显示 <strong><em>DELL</em></strong> 商标时 按下 <strong>F2</strong> 进入 <strong>BIOS</strong> 设置界面;<br><img src="/2020/06/07/installation/f2.jpg" alt="F2"></li>
<li>在 <strong>Settings—-General—-Boot Squence</strong> 右侧选择 <strong>UEFI</strong> 模式并点击下方的 <strong>Apply</strong> 按钮;<br><img src="/2020/06/07/installation/uefi.jpg" alt="BOOT"></li>
<li>在 <strong>Settings—-System Configuration—-SATA Operation</strong> 右侧选择 <strong>AHCI</strong> (默认为 <strong>RAID ON</strong>)使硬盘处于可发现模式,点击下方的 <strong>Apply</strong> 按钮;<br><img src="/2020/06/07/installation/ahci.jpg" alt="AHCI"></li>
<li>按下 <strong>Esc</strong> 保存设置,重启主机并在 <strong><em>DELL</em></strong> 商标界面按下 <strong>F12</strong>进入启动盘选择界面 ,确认 <strong>Boot mode</strong> 是否为 <strong>UEFI</strong> 以及 <strong>Secure Boot</strong> 是否为 <strong>off</strong> 状态,若状态有误则返回 <strong>BIOS</strong> 重新设置;<br><img src="/2020/06/07/installation/f10.jpg" alt="SELECTU"></li>
<li>若没有错误,选择 <strong>UEFI BOOT: </strong>下方的U盘并按回车、进入;</li>
<li>在安装界面选择 <strong>Install CentOS7</strong>;<br><img src="/2020/06/07/installation/install_centos7.jpg" alt="CENTOS7"></li>
<li><strong>SOFTWARE SELECTION</strong> 选择 <strong>GNOME Desktop</strong>,右侧可自定义需要安装的软件包以及环境;<br><img src="/2020/06/07/installation/selection.jpg" alt="SOFTWAVESELECTION"></li>
<li><strong>INSTALLATION DESTINATION</strong> 选择512G的固态硬盘并选择自动分区(在硬盘选择界面下方 <strong>Other Storage Options—-Partitioning</strong> 处选择 <strong>Automatically configure partitioning</strong> )</li>
<li><strong>Begin Installation</strong>;</li>
<li>系统安装过程中需要完成用户信息的设置,等待完成后 <strong>Reboot</strong>进入系统。</li>
</ol>
<h2 id="系统环境配置"><a href="#系统环境配置" class="headerlink" title="系统环境配置"></a>系统环境配置</h2><p>在 <strong>CentOS</strong> 使用过程中,我们经常需要从网络上下载各种安装包, <strong>yum(CentOS)</strong> 或 <strong>apt-get(Ubuntu)</strong> 是比较常用的方式,但是系统自带的安装源服务器都在国外,下载速度非常慢,因此我们需要使用国内的诸如清华源、豆瓣源、阿里源等加速下载,下面介绍一些简单的下载加速技巧。<br>(以下操作均需要在 <strong>root</strong> 权限下运行)首先,查看系统是否安装有 <strong>wget</strong>:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ wget --version</span><br></pre></td></tr></table></figure>
<p>如果未安装的话首先使用 <strong>yum</strong> 进行安装():</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">[root]$ yum -y install wget</span><br><span class="line"><span class="comment"># -y 表示安装的自动选择</span></span><br></pre></td></tr></table></figure>
<p>再次查询即可看到 <strong>wget</strong> 的安装位置、版本等信息。<br>然后备份系统原有的 <strong>yum</strong> 下载源并下载阿里源、生成缓存:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">[root] <span class="built_in">cp</span> /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak</span><br><span class="line">[root] wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo <span class="comment">#阿里云安装,也可以安装网易等源</span></span><br><span class="line">[root] yum makecache <span class="comment">#生成缓存</span></span><br></pre></td></tr></table></figure>
<p>安装ntfs-3g以挂载ntfs格式的硬盘<br><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">[root] wget https://tuxera.com/opensource/ntfs-3g_ntfsprogs-2017.3.23.tgz</span><br><span class="line">[root] tar zxvf ntfs-3g_ntfsprogs-2017.3.23.tgz</span><br><span class="line">[root] ./configure</span><br><span class="line">[root] <span class="built_in">cd</span> ntfs-3g_ntfsprogs-2017.3.23/</span><br><span class="line">[root] make</span><br><span class="line">[root] make install</span><br><span class="line">[root] mount -t ntfs-3g /deb/sda2 /mnt/data/</span><br></pre></td></tr></table></figure><br>设置开机自动挂载硬盘</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">[root] <span class="built_in">cd</span> /etc</span><br><span class="line">[root] <span class="built_in">cp</span> fstab fstab.bak</span><br><span class="line">[root] vim fstab</span><br><span class="line"><span class="comment">##---file start---##</span></span><br><span class="line">/dev/sda(替换为自己的盘符) /mnt/data(替换为自己需要挂载的路径) ntfs-3g defaults 0 0</span><br><span class="line"><span class="comment">##---file end--##</span></span><br></pre></td></tr></table></figure>
<p>这时就可以畅快地使用 <code>yum -y install</code>畅快地下载各种安装包啦。</p>
<link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>装机</category>
</categories>
<tags>
<tag>CentOS系统安装</tag>
</tags>
</entry>
<entry>
<title>常用链接</title>
<url>/2020/08/02/links/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><h1 id="常用链接查询"><a href="#常用链接查询" class="headerlink" title="常用链接查询"></a>常用链接查询</h1><ul>
<li><h2 id="文献相关"><a href="#文献相关" class="headerlink" title="文献相关"></a>文献相关</h2></li>
</ul>
<ol>
<li><p><strong>arxiv</strong>文献下载过慢问题:</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">[Answer] 文献链接中 https://arxiv.org 换成 http://xxx.itp.ac.cn</span><br></pre></td></tr></table></figure>
</li>
<li><p>利用<strong>doi</strong>下载文献:</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">[Answer] http://sci-hub.ren/</span><br></pre></td></tr></table></figure>
</li>
<li><p><strong>SEG</strong>文献下载:</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">[Answer] https://library.seg.org/</span><br><span class="line">[Answer] https://ifc.cup.edu.cn <span class="comment">#CUP-VPN</span></span><br></pre></td></tr></table></figure>
</li>
<li><p>地震勘探领域(中文):</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">[Answer] http://www.geophy.cn/CN/volumn/home.shtml <span class="comment">#地球物理学报</span></span><br><span class="line">[Answer] http://journal08.magtechjournal.com/Jwk_ogp/CN/volumn/home.shtml <span class="comment">#石油地球物理勘探</span></span><br></pre></td></tr></table></figure>
</li>
</ol>
<ul>
<li><h2 id="数据集"><a href="#数据集" class="headerlink" title="数据集"></a>数据集</h2> <figure class="highlight python"><table><tr><td class="code"><pre><span class="line">[Answer] http://academictorrents.com/ <span class="comment">#种子下载,可搭配VUZE</span></span><br><span class="line">[Answer] https://pan.baidu.com/s/1rQWLNmh2RczmNkry9dfDdg <span class="comment"># CelebA 密码:v65m</span></span><br><span class="line">[Answer] https://pan.baidu.com/s/1j_JOdpjF53h_af6GSHha3w <span class="comment"># ffhq 密码:tkp5</span></span><br></pre></td></tr></table></figure>
</li>
<li><h2 id="预训练模型"><a href="#预训练模型" class="headerlink" title="预训练模型"></a>预训练模型</h2> <figure class="highlight python"><table><tr><td class="code"><pre><span class="line">[Answer] <span class="comment"># inception-v4_weights_tf_dim_ordering_tf_kernels_notop.h5</span></span><br><span class="line">[Answer] <span class="comment"># inception-v4_weights_tf_dim_ordering_tf_kernels.h5</span></span><br><span class="line">[Answer] <span class="comment"># inception_v3_weights_tf_dim_ordering_tf_kernels.h5</span></span><br><span class="line">[Answer] <span class="comment"># vgg19_weights_tf_dim_ordering_tf_kernels_notop.h5</span></span><br><span class="line">[Answer] <span class="comment"># vgg19.npy</span></span><br><span class="line">[Answer] <span class="comment"># vgg16.npy</span></span><br><span class="line">[Answer] <span class="comment"># inception_v3_features.pkl (styleGAN)</span></span><br><span class="line">[Answer] <span class="comment"># karras2019stylegan-ffhq-1024x1024.pkl (styleGAN)</span></span><br></pre></td></tr></table></figure>
</li>
<li><h2 id="深度学习框架"><a href="#深度学习框架" class="headerlink" title="深度学习框架"></a>深度学习框架</h2><ol>
<li><p>Oneflow</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">https://www.oneflow.org/ <span class="comment"># official website</span></span><br><span class="line">https://github.com/Oneflow-Inc/oneflow <span class="comment"># codes</span></span><br><span class="line">https://docs.oneflow.org/ <span class="comment"># doc</span></span><br></pre></td></tr></table></figure>
</li>
<li><p>Tensorflow</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">https://tensorflow.google.cn/</span><br><span class="line">https://github.com/tensorflow/tensorflow</span><br></pre></td></tr></table></figure>
</li>
<li><p>Keras</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">https://keras.io/ <span class="comment"># official website</span></span><br><span class="line">https://github.com/keras-team/keras <span class="comment"># codes</span></span><br><span class="line">https://keras.io/zh/ <span class="comment"># doc</span></span><br></pre></td></tr></table></figure>
</li>
<li><p>Pytorch</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">https://pytorch.org/ <span class="comment"># official website</span></span><br><span class="line">https://github.com/pytorch/pytorch <span class="comment"># codes</span></span><br></pre></td></tr></table></figure></li>
</ol>
</li>
<li><h2 id="其它"><a href="#其它" class="headerlink" title="其它"></a>其它</h2><ol>
<li>Blog <figure class="highlight python"><table><tr><td class="code"><pre><span class="line">https://www.tablesgenerator.com/markdown_tables <span class="comment"># Markdown表格生成器</span></span><br></pre></td></tr></table></figure></li>
<li>天然地震<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">http://seismo-live.org/</span><br></pre></td></tr></table></figure>
</li>
</ol>
</li>
</ul>
<link rel="stylesheet" href="/css/spoiler.css" type="text/css"><script src="/js/spoiler.js" type="text/javascript" async></script>]]></content>
<categories>
<category>commons</category>
</categories>
<tags>
<tag>链接</tag>
</tags>
</entry>
<entry>
<title>OBSpy天然地震I</title>
<url>/2020/09/02/obspy1/</url>
<content><![CDATA[<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><h1 id="天然地震"><a href="#天然地震" class="headerlink" title="天然地震"></a>天然地震</h1><h2 id="地震数据中Channel描述"><a href="#地震数据中Channel描述" class="headerlink" title="地震数据中Channel描述"></a>地震数据中Channel描述</h2><div class="table-container">
<table>
<thead>
<tr>
<th>Channel</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>EHZ/EHN/EHE</td>
<td>Short Period 100 sps</td>
</tr>
<tr>
<td>BHZ/BHN/BHE</td>
<td>Broad Band 20 sps</td>
</tr>
<tr>
<td>LHZ/LHN/LHE</td>
<td>Long Period 1 sps</td>
</tr>
<tr>
<td>VHZ/VHN/VHE</td>
<td>Very Long Period 0.1 sps</td>
</tr>
<tr>
<td>BCI</td>
<td>Broad Band Calibration Signal</td>
</tr>
<tr>
<td>ECI</td>
<td>Short Period Cal</td>
</tr>
<tr>
<td>LOG</td>
<td>Console Log</td>
</tr>
<tr>
<td>ACE</td>
<td>Administrative Clock Error</td>
</tr>
<tr>
<td>LCQ</td>
<td>1hz Clock Quality</td>
</tr>
<tr>
<td>OCF</td>
<td>Opaque Configuration File</td>
</tr>
</tbody>
</table>
</div>
<h2 id="天然地震数据处理包obspy教程"><a href="#天然地震数据处理包obspy教程" class="headerlink" title="天然地震数据处理包obspy教程"></a>天然地震数据处理包obspy教程</h2><p><a href="https://krischer.github.io/seismo_live_build/html/ObsPy/07_Basic_Processing_Exercise_solution_wrapper.html">obspy教程,以Tohoku-Oki:2011-03-11日本大地震为例</a></p>
<h3 id="台站数据访问方法"><a href="#台站数据访问方法" class="headerlink" title="台站数据访问方法"></a>台站数据访问方法</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> obspy</span><br><span class="line"><span class="keyword">from</span> obspy.clients.fdsn <span class="keyword">import</span> Client</span><br><span class="line"></span><br><span class="line">c_event = Client(<span class="string">"IRIS"</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># Event time.</span></span><br><span class="line">event_time = obspy.UTCDateTime(<span class="string">"2011-03-11T05:46:23.2"</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># Get the event information. The temporal and magnitude constraints make it unique</span></span><br><span class="line">cat = c_event.get_events(starttime=event_time - <span class="number">10</span>, endtime=event_time + <span class="number">10</span>,</span><br><span class="line"> minmagnitude=<span class="number">9</span>)</span><br><span class="line">cat.plot()</span><br><span class="line">c = Client(<span class="string">"IRIS"</span>)</span><br><span class="line"><span class="comment"># Download station information at the response level!</span></span><br><span class="line">inv = c.get_stations(network=<span class="string">"II"</span>, station=<span class="string">"TLY"</span>, location=<span class="string">"*"</span>, channel=<span class="string">"BH?"</span>,</span><br><span class="line"> starttime=event_time - <span class="number">60</span>, endtime=event_time + <span class="number">3600</span>,</span><br><span class="line"> level=<span class="string">"response"</span>)</span><br><span class="line">inv.plot()</span><br><span class="line"><span class="comment"># Download 3 component waveforms.</span></span><br><span class="line"><span class="comment"># The unit of startime and endtime is seconds.</span></span><br><span class="line">st = c.get_waveforms(network=<span class="string">"II"</span>, station=<span class="string">"TLY"</span>, location=<span class="string">"*"</span>,</span><br><span class="line"> channel=<span class="string">"BH?"</span>, starttime=event_time - <span class="number">60</span>,</span><br><span class="line"> endtime=event_time + <span class="number">3600</span>)</span><br><span class="line"><span class="comment"># Build-in plot method</span></span><br><span class="line">st[<span class="number">0</span>].plot()</span><br><span class="line"><span class="comment"># Get the data</span></span><br><span class="line">traces = st[<span class="number">0</span>].data</span><br></pre></td></tr></table></figure>
<p>以上代码中,<code>cat</code>、<code>inv</code>和<code>st</code>的<code>plot</code>方法分别绘制了地震事件、台站位置信息以及波形信息。<br><img src="/2020/09/02/obspy1/cat.png" alt="cat"><br><img src="/2020/09/02/obspy1/inv.png" alt="inv"><br><img src="/2020/09/02/obspy1/trace.png" alt="trace"></p>
<h3 id="利用MassDownloader下载数据"><a href="#利用MassDownloader下载数据" class="headerlink" title="利用MassDownloader下载数据"></a>利用MassDownloader下载数据</h3><p><a href="https://docs.obspy.org/packages/autogen/obspy.clients.fdsn.mass_downloader.html">台站数据下载教程(obspy.clients.fdsn.mass_downloader)</a></p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> obspy</span><br><span class="line"><span class="keyword">from</span> obspy.clients.fdsn.mass_downloader <span class="keyword">import</span> CircularDomain, \</span><br><span class="line"> Restrictions, MassDownloader</span><br><span class="line"></span><br><span class="line">origin_time = obspy.UTCDateTime(<span class="number">2011</span>, <span class="number">3</span>, <span class="number">11</span>, <span class="number">5</span>, <span class="number">47</span>, <span class="number">32</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># Circular domain around the epicenter. This will download all data between</span></span><br><span class="line"><span class="comment"># 70 and 90 degrees distance from the epicenter. This module also offers</span></span><br><span class="line"><span class="comment"># rectangular and global domains. More complex domains can be defined by</span></span><br><span class="line"><span class="comment"># inheriting from the Domain class.</span></span><br><span class="line">domain = CircularDomain(latitude=<span class="number">37.52</span>, longitude=<span class="number">143.04</span>,</span><br><span class="line"> minradius=<span class="number">70.0</span>, maxradius=<span class="number">90.0</span>)</span><br><span class="line"></span><br><span class="line">restrictions = Restrictions(</span><br><span class="line"> <span class="comment"># Get data from 5 minutes before the event to one hour after the</span></span><br><span class="line"> <span class="comment"># event. This defines the temporal bounds of the waveform data.</span></span><br><span class="line"> starttime=origin_time - <span class="number">5</span> * <span class="number">60</span>,</span><br><span class="line"> endtime=origin_time + <span class="number">3600</span>,</span><br><span class="line"> <span class="comment"># You might not want to deal with gaps in the data. If this setting is</span></span><br><span class="line"> <span class="comment"># True, any trace with a gap/overlap will be discarded.</span></span><br><span class="line"> reject_channels_with_gaps=<span class="literal">True</span>,</span><br><span class="line"> <span class="comment"># And you might only want waveforms that have data for at least 95 % of</span></span><br><span class="line"> <span class="comment"># the requested time span. Any trace that is shorter than 95 % of the</span></span><br><span class="line"> <span class="comment"># desired total duration will be discarded.</span></span><br><span class="line"> minimum_length=<span class="number">0.95</span>,</span><br><span class="line"> <span class="comment"># No two stations should be closer than 10 km to each other. This is</span></span><br><span class="line"> <span class="comment"># useful to for example filter out stations that are part of different</span></span><br><span class="line"> <span class="comment"># networks but at the same physical station. Settings this option to</span></span><br><span class="line"> <span class="comment"># zero or None will disable that filtering.</span></span><br><span class="line"> minimum_interstation_distance_in_m=<span class="number">10E3</span>,</span><br><span class="line"> <span class="comment"># Only HH or BH channels. If a station has HH channels, those will be</span></span><br><span class="line"> <span class="comment"># downloaded, otherwise the BH. Nothing will be downloaded if it has</span></span><br><span class="line"> <span class="comment"># neither. You can add more/less patterns if you like.</span></span><br><span class="line"> channel_priorities=[<span class="string">"HH[ZNE]"</span>, <span class="string">"BH[ZNE]"</span>],</span><br><span class="line"> <span class="comment"># Location codes are arbitrary and there is no rule as to which</span></span><br><span class="line"> <span class="comment"># location is best. Same logic as for the previous setting.</span></span><br><span class="line"> location_priorities=[<span class="string">""</span>, <span class="string">"00"</span>, <span class="string">"10"</span>])</span><br><span class="line"></span><br><span class="line"><span class="comment"># No specified providers will result in all known ones being queried.</span></span><br><span class="line">mdl = MassDownloader()</span><br><span class="line"><span class="comment"># The data will be downloaded to the ``./waveforms/`` and ``./stations/``</span></span><br><span class="line"><span class="comment"># folders with automatically chosen file names.</span></span><br><span class="line">mdl.download(domain, restrictions, mseed_storage=<span class="string">"waveforms"</span>,</span><br><span class="line"> stationxml_storage=<span class="string">"stations"</span>)</span><br></pre></td></tr></table></figure>
<p>以上代码会将时间<code>origin_time</code>之前5分钟、之后1小时以内,区域范围为圆形的<code>domain</code>(以经纬度以及环形区域为限定)的数据下载到当前目录下的<code>./waveform</code>文件夹中,台站数据则存储在<code>./stations</code>中。</p>
<h3 id="本地文件读取-以-mseed为例-及显示"><a href="#本地文件读取-以-mseed为例-及显示" class="headerlink" title="本地文件读取(以.mseed为例)及显示"></a>本地文件读取(以.mseed为例)及显示</h3><p>演示三通道数据读取与显示<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> obspy</span><br><span class="line"><span class="keyword">from</span> obspy.core <span class="keyword">import</span> read</span><br><span class="line">path = <span class="string">r'./waveforms/'</span></span><br><span class="line">tc = read(path+<span class="string">'AG.HHAR.00.HHE__20110311T054232Z__20110311T064732Z.mseed'</span>)</span><br><span class="line">tc += read(path+<span class="string">'AG.HHAR.00.HHN__20110311T054232Z__20110311T064732Z.mseed'</span>)</span><br><span class="line">tc += read(path+<span class="string">'AG.HHAR.00.HHZ__20110311T054232Z__20110311T064732Z.mseed'</span>)</span><br><span class="line"><span class="built_in">print</span>(tc)</span><br><span class="line"><span class="comment"># Save plot to file</span></span><br><span class="line">tc.plot(outfile=<span class="string">'test.png'</span>)</span><br></pre></td></tr></table></figure><br>输出:<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="number">3</span> Trace(s) <span class="keyword">in</span> Stream:</span><br><span class="line">AG.HHAR<span class="number">.00</span>.HHE | <span class="number">2011</span>-03-11T05:<span class="number">42</span>:<span class="number">32.000000</span>Z - <span class="number">2011</span>-03-11T06:<span class="number">47</span>:<span class="number">32.000000</span>Z | <span class="number">100.0</span> Hz, <span class="number">390001</span> samples</span><br><span class="line">AG.HHAR<span class="number">.00</span>.HHN | <span class="number">2011</span>-03-11T05:<span class="number">42</span>:<span class="number">32.000000</span>Z - <span class="number">2011</span>-03-11T06:<span class="number">47</span>:<span class="number">32.000000</span>Z | <span class="number">100.0</span> Hz, <span class="number">390001</span> samples</span><br><span class="line">AG.HHAR<span class="number">.00</span>.HHZ | <span class="number">2011</span>-03-11T05:<span class="number">42</span>:<span class="number">32.000000</span>Z - <span class="number">2011</span>-03-11T06:<span class="number">47</span>:<span class="number">32.000000</span>Z | <span class="number">100.0</span> Hz, <span class="number">390001</span> samples</span><br><span class="line"><span class="string">"""</span></span><br><span class="line"><span class="string">当流中的Traces过多时,print(stream)只会打印部分Trace,此时可通过print(stream.__str__(extended=True))来打印流中的所有Trace。</span></span><br><span class="line"><span class="string">"""</span></span><br></pre></td></tr></table></figure></p>
<p>基础绘图:<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Basic plotting</span></span><br><span class="line">tc.plot()</span><br></pre></td></tr></table></figure><br><img src="/2020/09/02/obspy1/tc.png" alt="tc"></p>
<p>自定义绘图:<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Customized Plots</span></span><br><span class="line">dt = tc[<span class="number">0</span>].stats.starttime</span><br><span class="line">tc.plot(color=<span class="string">'red'</span>, number_of_ticks=<span class="number">7</span>,</span><br><span class="line"> tick_rotation=<span class="number">5</span>, tick_format=<span class="string">'%I:%M %p'</span>,</span><br><span class="line"> starttime=dt + <span class="number">60</span>*<span class="number">60</span>, endtime=dt + <span class="number">60</span>*<span class="number">60</span> + <span class="number">120</span>)</span><br></pre></td></tr></table></figure><br><img src="/2020/09/02/obspy1/tc_customized.png" alt="tc"></p>
<p>使用Matplotlib进行自定义绘图:<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Custom Plotting using Matplotlib</span></span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line">fig = plt.figure()</span><br><span class="line">ax = fig.add_subplot(<span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>)</span><br><span class="line">ax.plot(tc[<span class="number">0</span>].times(<span class="string">"matplotlib"</span>), tc[<span class="number">0</span>].data, <span class="string">"b-"</span>)</span><br><span class="line">ax.xaxis_date()</span><br><span class="line">fig.autofmt_xdate()</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><br><img src="/2020/09/02/obspy1/tc_customized_mat.png" alt="tc"></p>
<p>按小时绘制一整天道记录(文件中必须含有整天的数据):<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">tc = read(path+<span class="string">'BW.ALTM..EHE__20120101T000000Z__20120102T000000Z.mseed'</span>)</span><br><span class="line">tc.plot(<span class="built_in">type</span>=<span class="string">'dayplot'</span>)</span><br></pre></td></tr></table></figure><br><img src="/2020/09/02/obspy1/tc_day.png" alt="tc"></p>
<p>plot中显示地震事件<br><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> obspy <span class="keyword">import</span> read</span><br><span class="line">st = read(<span class="string">"./BW.ALTM..EHE__20121207T000000Z__20121208T000000Z.mseed"</span>)</span><br><span class="line"><span class="comment">#st.filter("lowpass", freq=0.1, corners=2)</span></span><br><span class="line">st.plot(<span class="built_in">type</span>=<span class="string">"dayplot"</span>, interval=<span class="number">60</span>, right_vertical_labels=<span class="literal">False</span>,</span><br><span class="line"> vertical_scaling_range=<span class="number">5e3</span>, one_tick_per_line=<span class="literal">True</span>,</span><br><span class="line"> color=[<span class="string">'k'</span>, <span class="string">'r'</span>, <span class="string">'b'</span>, <span class="string">'g'</span>], show_y_UTC_label=<span class="literal">False</span>,</span><br><span class="line"> events={<span class="string">'min_magnitude'</span>: <span class="number">6.5</span>})</span><br></pre></td></tr></table></figure><br><img src="/2020/09/02/obspy1/japan20121207.png" alt="tc"></p>
<h2 id="地震台站Google地图及信息查询"><a href="#地震台站Google地图及信息查询" class="headerlink" title="地震台站Google地图及信息查询"></a><a href="https://www.fdsn.org/networks/detail/II/">地震台站Google地图</a>及信息查询</h2><h3 id="Network-Codes"><a href="#Network-Codes" class="headerlink" title="Network Codes"></a>Network Codes</h3><p>地震网络编码查询:<a href="https://www.fdsn.org/networks/?initial=1">https://www.fdsn.org/networks/?initial=1</a></p>
<h3 id="Global-Seismograph-Network-IRIS-IDA"><a href="#Global-Seismograph-Network-IRIS-IDA" class="headerlink" title="Global Seismograph Network - IRIS/IDA"></a>Global Seismograph Network - IRIS/IDA</h3><h4 id="FDSN-Network-Information"><a href="#FDSN-Network-Information" class="headerlink" title="FDSN Network Information"></a>FDSN Network Information</h4><div class="table-container">
<table>
<thead>
<tr>
<th>FDSN code</th>
<th>II</th>
<th>Network name</th>
<th>Global Seismograph Network - IRIS/IDA (GSN)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Start year</td>
<td>1986</td>
<td>Operated by</td>
<td>Scripps Institution of Oceanography (SIO)</td>
</tr>
<tr>
<td>End year</td>
<td>-</td>
<td>Deployment region</td>
<td>Global</td>
</tr>
<tr>
<td>Network Website</td>
<td><a href="http://ida.ucsd.edu/">http://ida.ucsd.edu/</a></td>
<td></td>
</tr>