科研笔记(2019年01月29日01:17:57):Python写用于交付的工程项目的基本流程

note(个人笔记)

最近要把给外协项目上写的代码整理成一个完整的项目交付,整理一下基本的流程。

这次的项目是一个基于深度学习的地震资料处理。基本的功能其实之前的实验中都已经实现。主要是将已有的内容整理一下,使其更易于修改调试,并且对新接触代码的人便于分析和通读。

首先,将较简单的、较为通用的函数写在一个脚本中,以便在其他部分通用地调用。比如在这里,我们处理特殊数据格式(地震数据中的 *.segy格式数据)的io接口函数都放在同一个脚本中,简单的预处理(如低通滤波,AGC,道均衡等)写在一个脚本中,这样就可以在其他用到这些函数的地方通过 import 来进行调用。

然后,把之前实验的时候写的脚本程序都封装成函数。比如对训练数据生成,训练数据切分成patch等。

修改dl模型,dl模型是以python的class的形式实现的,train和test以及模型的保存都以method的形式实现,将其中可变的参数都改为通过 __init__(): 方法作为参数传入,并形成类的变量。

最后完成main函数。主要涉及到一些通用的工作,如文件夹目录结构的生成,确认一些参数是否正确,上述操作完成后,就可以调用模型的train和test来实现基本操作流程了。

为了便于使用,我们用easydict生成参数卡。主要参数都通过参数卡传入。easydict可以生成一个字典,我们调用参数的时候,通过其字典的key就可以,而不需要直接指定value。用户修改时,也只需要修改参数卡即可。

在main函数中,我们还要加上通过命令行的 --mode 参数传入是训练还是测试的功能。由于我们已经有了参数卡,所以更多的参数就不必在terminal中传入了。

    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('--mode', type=str, default='train', help='train, test')
    args = parser.parse_args()

    if args.mode == 'train':
        TrainModel()
    elif args.mode == 'test':
        TestModel()    
    else:
        raise Exception("[!] Unknown --mode, possible mode can be 'train' or 'test'...")

这样就可以通过命令行:

python main.py --mode='train'

或者 :

python main.py --mode='test'

实现模型的训练与测试了。

为了便于使用,我们把这两条命令行置零写成bash脚本,保存成Train.sh和Test.sh,这样用户直接在命令行运行:

bash Train.sh

bash Test.sh

就可以实现训练和测试的功能了。

考虑到用户的机器上不一定安装好了工程项目中的第三方库,或者已经安装但是版本不一致,我们通过命令查看一下我们用到的第三方库的版本号。

pip list

 返回的结果为:

DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
absl-py (0.6.1)
alabaster (0.7.10)
anaconda-client (1.6.3)
anaconda-project (0.6.0)
asn1crypto (0.22.0)
astor (0.7.1)
astroid (1.4.9)
astropy (1.3.2)
attrs (15.2.0)
audioread (2.1.6)
Automat (0.0.0)
Babel (2.5.0)
backports-abc (0.5)
backports.shutil-get-terminal-size (1.0.0)
backports.ssl-match-hostname (3.5.0.1)
backports.weakref (1.0rc1)
beautifulsoup4 (4.6.0)
bitarray (0.8.1)
blaze (0.10.1)
bleach (1.5.0)
bokeh (0.12.5)
boto (2.46.1)
Bottleneck (1.2.1)
cairocffi (0.8.0)
CairoSVG (1.0.22)
cdecimal (2.3)
certifi (2016.2.28)
cffi (1.10.0)
chardet (3.0.4)
cleverhans (1.0.0, /sto/FileFolder_2_code/cleverhans/src/cleverhans)
click (6.7)
cloudpickle (0.2.2)
clyent (1.2.2)
colorama (0.3.9)
conda (4.4.4)
configparser (3.5.0)
constantly (15.1.0)
contextlib2 (0.5.5)
cryptography (1.8.1)
cssselect (1.0.1)
cycler (0.10.0)
Cython (0.26)
cytoolz (0.8.2)
dask (0.14.3)
datashape (0.5.4)
decorator (4.1.2)
distributed (1.16.3)
dlib (19.15.0)
docutils (0.14)
docx (0.2.4)
easydict (1.8)
entrypoints (0.2.3)
enum34 (1.1.6)
et-xmlfile (1.0.1)
ez-setup (0.9)
fastcache (1.0.2)
Flask (0.12.2)
Flask-Cors (3.0.2)
funcsigs (1.0.2)
functools32 (3.2.3.post2)
future (0.16.0)
futures (3.1.1)
gast (0.2.0)
gevent (1.2.1)
graphviz (0.8)
greenlet (0.4.12)
grin (1.2.1)
grpcio (1.17.1)
h5py (2.7.0)
HeapDict (1.0.0)
html5lib (0.9999999)
hyperlink (17.1.1)
idna (2.6)
imageio (2.3.0)
imagesize (0.7.1)
imread (0.6)
imreg-dft (2.0.0)
incremental (16.10.1)
ipaddress (1.0.18)
ipykernel (4.6.1)
ipython (5.3.0)
ipython-genutils (0.2.0)
ipywidgets (6.0.0)
isort (4.2.5)
itchat (1.3.10)
itsdangerous (0.24)
jdcal (1.3)
jedi (0.10.2)
jieba (0.39)
Jinja2 (2.9.6)
joblib (0.12.3)
jsonschema (2.6.0)
jupyter (1.0.0)
jupyter-client (5.1.0)
jupyter-console (5.2.0)
jupyter-core (4.3.0)
Keras (2.0.8)
Keras-Applications (1.0.6)
Keras-Preprocessing (1.0.5)
lazy-object-proxy (1.2.2)
librosa (0.6.2)
llvmlite (0.24.0)
locket (0.2.0)
lxml (3.8.0)
Mako (1.0.6)
Markdown (2.6.9)
MarkupSafe (1.0)
matplotlib (2.0.2)
memory-profiler (0.52.0)
mistune (0.7.4)
mock (2.0.0)
mpmath (0.19)
msgpack-python (0.4.8)
multipledispatch (0.4.9)
navigator-updater (0.1.0)
nbconvert (5.2.1)
nbformat (4.4.0)
networkx (1.11)
nltk (3.2.3)
nose (1.3.7)
notebook (5.0.0)
numba (0.39.0)
numexpr (2.6.2)
numpy (1.15.2)
numpydoc (0.7.0)
objgraph (3.4.0)
odo (0.5.0)
olefile (0.44)
opencv-python (3.4.3.18)
openpyxl (2.4.7)
packaging (16.8)
pandas (0.20.3)
pandocfilters (1.4.2)
parsel (1.2.0)
partd (0.3.8)
pathlib2 (2.3.0)
patsy (0.4.1)
pbr (3.1.1)
pep8 (1.7.0)
pexpect (4.2.1)
pickleshare (0.7.4)
PIL (1.1.7)
Pillow (5.1.0)
pip (9.0.1)
ply (3.10)
prompt-toolkit (1.0.15)
protobuf (3.4.0)
psutil (5.2.2)
ptyprocess (0.5.2)
py (1.4.34)
pyasn1 (0.2.3)
pyasn1-modules (0.0.8)
pycairo (1.10.0)
pycodestyle (2.3.1)
pycosat (0.6.3)
pycparser (2.18)
pycrypto (2.6.1)
pycurl (7.43.0)
PyDispatcher (2.0.5)
pydot (1.1.0)
pydot-ng (1.0.0)
pyflakes (1.5.0)
Pygments (2.2.0)
pygpu (0.6.9)
pylint (1.6.4)
pyodbc (4.0.16)
pyOpenSSL (17.0.0)
pyparsing (2.2.0)
pyPdf (1.13)
pypng (0.0.18)
PyQRCode (1.2.1)
pysvg (0.2.2)
pytest (3.2.1)
pytest-runner (2.11.1)
python-dateutil (2.6.1)
python-docx (0.8.6)
pytz (2017.2)
PyWavelets (0.5.2)
PyYAML (3.12)
pyzmq (16.0.2)
QtAwesome (0.4.4)
qtconsole (4.3.1)
QtPy (1.2.1)
queuelib (1.4.2)
reportlab (3.4.0)
requests (2.14.2)
resampy (0.2.1)
rope (0.9.4)
scandir (1.5)
scikit-image (0.13.1)
scikit-learn (0.20.0)
scipy (1.1.0)
Scrapy (1.3.3)
segyio (1.5.2)
segypy (0.4)
segyviewer (1.1.2)
segyviewlib (1.1.2)
Send2Trash (1.5.0)
service-identity (17.0.0)
setuptools (36.7.0)
s (2.8.2)
simplegeneric (0.8.1)
singledispatch (3.4.0.3)
six (1.11.0)
snowballstemmer (1.2.1)
sortedcollections (0.5.3)
sortedcontainers (1.5.7)
Sphinx (1.6.3)
sphinxcontrib-websupport (1.0.1)
spyder (3.1.4)
SQLAlchemy (1.1.9)
statsmodels (0.8.0)
stft (0.5.2)
style (1.1.0)
subprocess32 (3.2.7)
sympy (1.0)
tables (3.3.0)
tblib (1.3.2)
tensorboard (1.11.0)
tensorflow (1.3.0)
tensorflow-gpu (1.4.0)
tensorflow-tensorboard (0.4.0)
termcolor (1.1.0)
terminado (0.6)
testpath (0.3)
tflearn (0.3.2)
Theano (0.8.2)
tifffile (0.12.1)
toolz (0.8.2)
torch (0.2.0.post3)
torchvision (0.2.1)
tornado (4.5.2)
traitlets (4.3.2)
Twisted (17.5.0)
typing (3.6.2)
unicodecsv (0.14.1)
units (0.7)
update (0.0.1)
w3lib (1.17.0)
Wand (0.4.4)
wcwidth (0.1.7)
Werkzeug (0.12.2)
wheel (0.29.0)
widgetsnbextension (3.0.2)
wrapt (1.10.10)
xlrd (1.0.0)
XlsxWriter (0.9.6)
xlwt (1.2.0)
zict (0.1.2)
zope.interface (4.4.2)
You are using pip version 9.0.1, however version 19.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

可以看到我们安装的所有第三方库函数的版本号。我们写一个 requirement.txt 文件,内容如下:

easydict==1.8
numpy==1.15.2
scipy==1.1.0
torch==0.2.0.post3
segyio==1.5.2

 将我们用到的库和版本对应写下来。然后写个一行命令的bash脚本

pip install -r requirements.txt

这样,让用户先运行这个脚本,将第三方库按照版本要求装好,就可以运行我们前面的训练和测试的脚本了。

到此为止,这个简单的工程项目就以及基本可以交付了。我们先在本地机器上测试一下结果:

科研笔记(2019年01月29日01:17:57):Python写用于交付的工程项目的基本流程_第1张图片

训练过程

科研笔记(2019年01月29日01:17:57):Python写用于交付的工程项目的基本流程_第2张图片

测试过程。

 

2019年01月29日02:12:47

追求简单,但要学会不信任它。    怀特海

你可能感兴趣的:(实验室笔记)