keras离线下载模型的存储位置

本文介绍了使用Keras时预训练模型文件在线下载失败的解决办法。Keras有很多预训练模型可用于特征提取或微调,但服务器下载常超时。以VGG16为例,可手动离线下载文件,通过查看报错信息和代码,找到文件应存放的位置~/.keras/models,放入后代码即可成功运行。

在用keras时用到了vgg19_weights_tf_dim_ordering_tf_kernels.h5这个文件,在线下载时,老是失败,于是直接下载下来放到指定位置进行使用。
主要参考了https://www.jianshu.com/p/0a4ba12df520这篇文章,感觉作者在解决问题时候的思路非常好,值得我学习。

keras有着很多已经与训练好的模型供调用,因此我们可以基于这些已经训练好的模型来做特征提取或者微调,来满足我们自己的需求。
比如我们要调用VGG16在imagenet下训练的模型:

在这里插入图片描述
这里是利用预训练的模型来做特征提取,因此我们不需要顶层的分类器网络部分的权重,只需要使用到训练好的卷积基。这也就是VGG16参数中include_top=False的含义,weights='imagenet’的意思就直接是基于imagenet训练的网络权重了。
但是在服务器上运行的时候遇到一个问题,因为这个模型第一次使用时需要去下载,而服务器连接下载的url超时。。。那就只能手动离线下载然后放到路径里去供调用了。
首先keras提供的模型下载地址是:https://github.com/fchollet/deep-learning-models/releases
其中我们找到vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5下载即可。
从这个命名也可以看出很多信息了,比如从tf看出这是基于tensorflow的(th是基于Theano ),notop也就是我们上面说的不要顶层的分类器部分,h5后缀表示keras使用HDF5格式存储的,等等。
下好后放在哪呢?我们只能看看keras的代码是怎么写的,从报错信息中可以得到你的机器中vgg16.py的文件路径,比如:

Traceback (most recent call last):
  File "main.py", line 9, in <module>
    train.train()
  File "/cloudox/cifar10_test/train.py", line 52, in train
    conv_base = VGG16(include_top=False, weights='imagenet')
  File "/……/keras/applications/__init__.py", line 28, in wrapper
    return base_fun(*args, **kwargs)
  File "/……/keras/applications/vgg16.py", line 11, in VGG16
    return vgg16.VGG16(*args, **kwargs)
  File "/……/keras_applications/vgg16.py", line 209, in VGG16
    file_hash='6d6bbae143d832006294945121d1f1fc')
  File "/……/keras/utils/data_utils.py", line 226, in get_file
    raise Exception(error_msg.format(origin, e.errno, e.reason))
Exception: URL fetch failure on https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5: None -- [Errno 110] Connection timed out

从报错信息中,第一我们可以知道是下载“https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5”这个文件超时,这也是我们上面文件下载路径的由来。第二我们可以知道下载的源头在哪里,大致检查一下,就会发现是在"/……/keras_applications/vgg16.py"这个文件中(“/usr/local/app/anaconda2/envs/tensorflow/lib/python2.7/site-packages/keras_applications/vgg16.py”),他的代码其实就在这:https://github.com/fchollet/deep-learning-models/blob/master/vgg16.py
好我们看看vgg16.py的代码,首先在顶部定义了两个下载路径:

WEIGHTS_PATH = 'https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels.h5'
WEIGHTS_PATH_NO_TOP = 'https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5'

然后往下翻会看到获取模型权重文件的代码:

 # load weights
    if weights == 'imagenet':
        if include_top:
            weights_path = get_file('vgg16_weights_tf_dim_ordering_tf_kernels.h5',
                                    WEIGHTS_PATH,
                                    cache_subdir='models')
        else:
            weights_path = get_file('vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5',
                                    WEIGHTS_PATH_NO_TOP,
                                    cache_subdir='models')
        model.load_weights(weights_path)

还记得我们调用的时候传的参数吧,VGG16(include_top=False, weights=‘imagenet’),所以就是这里。这里调用了get_file这个函数来从路径中获取权重文件,那我们看看这个函数在哪,代码中说了在:

from keras.utils.data_utils import get_file

那就去找嘛,既可以在你的文件夹里找,也可以在github找,因为vgg16这个文件属于一个单独的工程,因此我们从作者的所有仓库中找到keras工程,然后顺着keras.utils.data_utils找到代码,在这:https://github.com/keras-team/keras/blob/master/keras/utils/data_utils.py
这时候离我们要的东西就不远了,这时候都不用详细看代码,我们看下注释:

在这里插入图片描述
注释说,这个函数会先检查cache中是否有文件,如果没有就从url下载,而这个cache的路径在~/.keras,默认存储文件是datasets,说明默认是下载数据集的,还记得vgg16那边传的参数么,cache_subdir=‘models’,
所以这个文件应该在的位置就是~/.keras/models,这时候我们直接进入该目录,发现果然有个models文件,那就直接把文件放进models就好啦。

这时候再去运行之前自己的代码就可以成功啦。

作者:Cloudox_
链接:https://www.jianshu.com/p/0a4ba12df520
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

### 使用 TensorFlow Hub 下载模型的完整指南 TensorFlow Hub 提供了一个便捷的方式来下载和使用预训练模型,从而减少了开发者的工作量并加速了项目的开发进程。以下是完整的下载和使用教程。 #### 1. 安装必要库 在开始之前,确保已安装 `tensorflow` 和 `tensorflow-hub` 库。如果尚未安装,可以使用以下命令完成安装[^5]: ```bash pip install tensorflow tensorflow-hub ``` #### 2. 导入库 导入所需的库以准备加载模型: ```python import tensorflow as tf import tensorflow_hub as hub ``` #### 3. 加载模型 通过指定模型 URL 来加载模型。例如,要加载一个用于文本嵌入的 NNLM 模型,可以这样做[^3]: ```python model_url = "https://tfhub.dev/google/nnlm-en-dim128-with-normalization/2" embed = hub.KerasLayer(model_url, input_shape=[], dtype=tf.string) ``` 这里的关键部分是 `hub.KerasLayer()` 函数,它允许我们将 TensorFlow Hub 中的模块作为 Keras 层集成到我们的模型中[^4]。 #### 4. 测试模型 为了验证模型是否正确加载以及能否正常工作,可以通过传递一些测试数据给模型来进行预测。例如对于上面提到的文本嵌入模型,我们可以这样操作: ```python test_sentences = ["hello world", "this is a test"] embedded_test = embed(test_sentences) print(embedded_test.shape) # 输出应为 (2, 128),表示两个句子被映射到了 128 维向量空间 ``` 这段代码会输出每句话经过该模型转换后的特征向量维度大小,帮助确认模型行为符合预期。 #### 5. 缓存机制与离线使用 当第一次从 TensorFlow Hub 调用某款模型时,系统实际上是在背后完成了对该模型文件的实际下载动作,并将其存储在一个默认位置以便未来无需再次联网获取同样的内容。具体来说,默认情况下这些资源会被放置于用户家目录下的隐藏文件夹 `.cache/tensorflow_hub/` 当中[^3]。因此,在后续运行相同的脚本时只要网络连接良好就完全可以做到无缝切换至本地读取模式而不需要担心额外耗时等待远程服务器响应的问题发生。 另外值得注意的是,如果你计划长期频繁调用某些固定不变的大规模深度学习结构体(比如 BERT),那么提前手动将它们克隆下来放到合适的地方再调整配置指向新地址不失为一种优化策略。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值