在使用keras库中内置的神经网络模型(以下简称网络模型)进行训练的时候,可能需要在每次运行训练文件时候都要重新从keras库中下载网络模型,尤其是在服务器终端运行的时候,每次下载的速度都极其慢,而且还可能会多次报ConnectionResetError等错误,从而在训练模型时候造成一系列不必要的麻烦,为此我们可以预先将要用到的网络模型离线下载,然后将该模型放置到指定的路径下,这样以后执行training训练文件的时候就不会每次都先下载网络模型了,而是直接可以使用我们预先放置好的网络模型来进行训练,本文分为两个大部分,前半部分主要讲如何找到指定的网络模型存放路径,余下部分介绍如何将下载好的网络模型上传到服务器终端的指定位置。
如何找到指定的网络模型存放路径(一般方法)
本部分将介绍如何找到指定的网络模型存放路径的一般通用方法,所谓授人以鱼不如授人以渔也,如果想快速找到指定网络模型的存放路径,可以直接跳转到本文的第二部分——“如何找到指定的网络模型存放路径(快速方法)”进行查看。下面进入本部分的正题:
每次执行训练文件之初在下载网络模型的时候,可能会出现的报错信息如下(这里以DenseNet为例):
Downloading data from https://github.com/keras-team/keras-applications/releases/download/densenet/densenet201_weights_tf_dim_ordering_tf_kernels_notop.h5
6422528/74836368 [=>............................] - ETA: 2:04:18Traceback (most recent call last):
File "DenseNet_Training_my.py", line 92, in <module>
model = DenseNet201(include_top=False)
File "/usr/local/python3/lib/python3.6/site-packages/keras/applications/__init__.py", line 20, in wrapper
return base_fun(*args, **kwargs)
File "/usr/local/python3/lib/python3.6/site-packages/keras/applications/densenet.py", line 21, in DenseNet201
return densenet.DenseNet201(*args, **kwargs)
File "/usr/local/python3/lib/python3.6/site-packages/keras_applications/densenet.py", line 339, in DenseNet201
**kwargs)
File "/usr/local/python3/lib/python3.6/site-packages/keras_applications/densenet.py", line 292, in DenseNet
file_hash='c13680b51ded0fb44dff2d8f86ac8bb1')
File "/usr/local/python3/lib/python3.6/site-packages/keras/utils/data_utils.py", line 225, in get_file
urlretrieve(origin, fpath, dl_progress)
File "/usr/local/python3/lib/python3.6/urllib/request.py", line 277, in urlretrieve
block = fp.read(bs)
File "/usr/local/python3/lib/python3.6/http/client.py", line 449, in read
n = self.readinto(b)
File "/usr/local/python3/lib/python3.6/http/client.py", line 493, in readinto
n = self.fp.readinto(b)
File "/usr/local/python3/lib/python3.6/socket.py", line 586, in readinto
return self._sock.recv_into(b)
File "/usr/local/python3/lib/python3.6/ssl.py", line 1012, in recv_into
return self.read(nbytes, buffer)
File "/usr/local/python3/lib/python3.6/ssl.py", line 874, in read
return self._sslobj.read(len, buffer)
File "/usr/local/python3/lib/python3.6/ssl.py", line 631, in read
v = self._sslobj.read(len, buffer)
ConnectionResetError: [Errno 104] Connection reset by peer
为了防止此类现象的发生,我们可以将这个要下载的网络模型文件预先下载好,然后上传到指定的文件夹路径下,本文主要是讲解如何查到该指定文件夹。
报错信息是个好东西,你要学会如何从报错信息中发掘出有用的东西来。
首先,根据报错信息中的这些部分:
Downloading data from https://github.com/keras-team/keras-applications/releases/download/densenet/densenet201_weights_tf_dim_ordering_tf_kernels_notop.h5
根据这些信息可以知道需要从哪个地方下载将要使用到的网络模型,我们先把这个网络模型提前下载好,接下来要考虑的就是需要把这个网络模型文件放置到哪个路径下的问题了。
接下来,根据报错信息中的这些内容:
File "/usr/local/python3/lib/python3.6/site-packages/keras/applications/densenet.py", line 21, in DenseNet201
return densenet.DenseNet201(*args, **kwargs)
可以通过官方给出的网络模型文件的源代码查看相关信息;
或者你也可以根据training文件即训练网络的文件中最前面调用网络模型这块的相关信息进入查看,比如使用PyCharm这个软件的话就可以直接进入相关封装好的代码中进行查看源代码,以下是training文件中调用网络模型的相关代码:
from keras.applications.densenet import DenseNet201, preprocess_input
我们在PyCharm里点击DenseNet201进入到相应的源代码文件中,可以找到如下的代码块:
@keras_modules_injection
def DenseNet201(*args, **kwargs):
return densenet.DenseNet201(*args, **kwargs)
然后再点击densenet进入到官方封装好的网络模型源代码文件中,可以找到如下代码块:
elif blocks == [6, 12, 48, 32]:
weights_path = keras_utils.get_file(
'densenet201_weights_tf_dim_ordering_tf_kernels.h5',
DENSENET201_WEIGHT_PATH,
cache_subdir='models',
file_hash='1ceb130c1ea1b78c3bf6114dbdfd8807')
这部分是用来获取网络模型权重文件的代码,这里调用了get_file() 函数来获取权重文件,我们通过下面的代码可以找到这个函数所在的地方:
from keras.utils.data_utils import get_file
接下来我们就要找到这个函数所在的地方,我们既可以在文件夹中找,也可以在github找,我们可以从官方的Github中找到keras工程,然后顺着keras.utils.data_utils找到代码,我们可以发现地址在这里
(https://github.com/keras-team/keras/blob/master/keras/utils/data_utils.py)
我们找到这个地方,然后找到相应的get_file() 函数所在的代码块:
def get_file(fname,
origin,
untar=False,
md5_hash=None,
file_hash=None,
cache_subdir='datasets',
hash_algorithm='auto',
extract=False,
archive_format='auto',
cache_dir=None):
"""Downloads a file from a URL if it not already in the cache.
By default the file at the url `origin` is downloaded to the
cache_dir `~/.keras`, placed in the cache_subdir `datasets`,
and given the filename `fname`. The final location of a file
`example.txt` would therefore be `~/.keras/datasets/example.txt`.
Files in tar, tar.gz, tar.bz, and zip formats can also be extracted.
Passing a hash will verify the file after download. The command line
programs `shasum` and `sha256sum` can compute the hash.
我们重点注意一下这块代码中的注释部分,该部分提到,这个get_file() 函数会先检查cache缓存中是否有文件,如果没有检测到的话就会从该URL中下载。我们通过注释部分可以看到这个cache的路径在~/.keras
。然后我们通过下面也就是刚才的densenet源代码中的这个代码块:
if blocks == [6, 12, 24, 16]:
weights_path = keras_utils.get_file(
'densenet121_weights_tf_dim_ordering_tf_kernels.h5',
DENSENET121_WEIGHT_PATH,
cache_subdir='models',
file_hash='9d60b8095a5708f2dcce2bca79d332c7')
根据其中的cache_subdir='models'
,我们可以知道这个网络模型的下载路径是在~/.keras/models
,然后我们在终端进入到这个目录:
[**@** ~]$ cd ~/.keras/
[**@** .keras]$ ls
keras.json models
可以看到~/.keras/
这个目录中是有models文件夹的,这个文件夹就是我们刚才离线下载的网络模型文件将要放置的位置,如何上传到服务器终端我们将会在下文中说明。放置进入之后,我们以后执行training训练文件的时候可以看到程序就不会每次都先下载一遍网络模型了。
如何找到指定的网络模型存放路径(快速方法)
分为两种情况,分别适用于Windows和Linux这两种不同操作系统的用户。
情况1:Linux用户
可以参考Keras Documentation (https://keras.io/applications/)
进入该网址之后可以看到如下内容:
Applications
Keras Applications are deep learning models that are made available alongside pre-trained weights.
These models can be used for prediction, feature extraction, and fine-tuning.
Weights are downloaded automatically when instantiating a model.
They are stored at ~/.keras/models/.
根据其中的最后一句可以找到网络模型的存放位置,即~/.keras/models/
情况2:Windows用户
直接在本地磁盘找到目录C:\Users\user_name\.keras\models
【注】:其中的user_name是指自己Windows用户的名字。
如何将下载好的网络模型上传到服务器终端的指定位置
首先,在Linux终端服务器中安装上传工具包rz,安装命令如下:
yum install -y lrzsz
需要在root模式下输入此命令进行安装,安装的过程如下:
[**@** ~]$ yum -y install lrzsz
Loaded plugins: fastestmirror, ovl
ovl: Error while doing RPMdb copy-up:
[Errno 13] Permission denied: '/var/lib/rpm/.dbenv.lock'
You need to be root to perform this command.
[**@** ~]$ su root
Password:
su: Authentication failure
[**@** ~]$ su root
Password:
[root@**]# yum -y install lrzsz
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
epel/x86_64/metalink | 8.2 kB 00:00:00
* base: mirrors.cn99.com
* epel: mirrors.tuna.tsinghua.edu.cn
* extras: mirrors.tuna.tsinghua.edu.cn
* updates: mirror.bit.edu.cn
base | 3.6 kB 00:00:00
cuda | 2.6 kB 00:00:00
epel | 5.3 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
(1/8): base/7/x86_64/group_gz | 165 kB 00:00:00
(2/8): epel/x86_64/updateinfo | 1.0 MB 00:00:00
(3/8): extras/7/x86_64/primary_db | 153 kB 00:00:00
(4/8): epel/x86_64/group_gz | 90 kB 00:00:05
(5/8): epel/x86_64/primary_db | 6.9 MB 00:00:18
(6/8): updates/7/x86_64/primary_db | 5.8 MB 00:00:20
cuda/primary_db FAILED 97% [==================================================================================- ] 258 kB/s | 20 MB 00:00:01 ETA
...
(7/8): base/7/x86_64/primary_db | 6.0 MB 00:00:36
(8/8): cuda/primary_db | 423 kB 00:00:05
Resolving Dependencies
--> Running transaction check
---> Package lrzsz.x86_64 0:0.12.20-36.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
===========================================================================================================================================================================================================================
Package Arch Version Repository Size
===========================================================================================================================================================================================================================
Installing:
lrzsz x86_64 0.12.20-36.el7 base 78 k
Transaction Summary
===========================================================================================================================================================================================================================
Install 1 Package
Total download size: 78 k
Installed size: 181 k
Downloading packages:
lrzsz-0.12.20-36.el7.x86_64.rpm | 78 kB 00:00:07
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : lrzsz-0.12.20-36.el7.x86_64 1/1
Verifying : lrzsz-0.12.20-36.el7.x86_64 1/1
Installed:
lrzsz.x86_64 0:0.12.20-36.el7
Complete!
安装好之后,在服务器终端将要上传的路径(就是我们刚才找到的~/.keras/models
这个路径)下输入如下命令:
rz
rz是Linux同Windows进行文件传输的命令,使用的是Zmodem协议。输入该命令后,会弹出一个窗口,选择刚才预先下载好的网络模型文件,点击“打开”按钮就可以开始上传到Linux主机。
如果出现上图,就说明已经成功地将预先下载好的网络模型上传至了指定的路径下。
在上传文件的过程中可能会有小伙伴遇到整个终端全部乱码的情况,出现这种情况的时候不要慌,乱码的原因可能是因为上传的是大文件,此时将刚才的rz
命令改为如下命令即可:
rz -b -e
也就是说在终端中输入rz -b -e
命令即可成功地将网络模型文件上传至指定的路径下。
写到这里,差不多本文就要结束了,如果有问题可以在下方留言区留言交流,这是我的第一篇CSDN博客,如果我的这篇文章帮助了你,那我也会感到很高兴,一个人能走多远,在于与谁同行。
Reference参考
如何找到指定的网络模型存放路径
keras离线下载模型的存储位置
将文件上传到服务器终端
Linux上传文件和下载文件命令行方式
使用rz命令上传文件时终端中出现乱码的解决方法
linux rz命令上传文件出现乱码