python-3.x - 如何将预训练的 Keras 模型的所有层转换为不同的 dtype(从 float32 到 float16)?

标签 python-3.x numpy keras

我正在尝试将我的 (float32) 模型的精度更改为 float16 以查看它需要多少性能影响。
加载模型(base_model)后,我尝试了这个:

from keras import backend as K
K.set_floatx('float16')
weights_list = base_model.layers[1].get_weights()
print('Original:')
print(weights_list[0].dtype)
new_weights = [K.cast_to_floatx(weights_list[0])]
print('New Weights:')
print(new_weights[0].dtype)
print('Setting New Weights')
base_model.layers[1].set_weights(new_weights)
new_weights_list = base_model.layers[1].get_weights()
print(new_weights_list[0].dtype)

输出:
Original:
float32
New Weights:
float16
Setting New Weights
float32

通过这段代码,一层内的权重被转换为float16,模型中的权重被设置为新的权重,但是使用get_weights后,数据类型又回到了float32。有没有办法设置图层的dtype?据我所知, K.cast_to_floatx 用于 numpy 数组,而 K.cast 用于张量。我是否需要使用新的 dtype 构建全新的空模型并将重铸权重放入新模型中?

或者是否有一些更直接的方法来加载所有层都具有 dtype 'float32' 的模型,并将所有层转换为具有 dtype'float16'?这是 mlmodel 中的一个特性,所以我认为在 Keras 中它不会特别困难。

最佳答案

有同样的问题,并得到了这个工作。做了什么不是 为我工作:

  • 保存到文件并重新加载
  • 类型转换所有权重并重新分配给原始模型

  • 这是什么做了 为我工作:
  • 创建相同架构的新模型并手动设置其权重

  • MWE:
    >>> from keras import backend as K
    >>> from keras.models import Sequential
    >>> from keras.layers import Dense, Dropout, Activation
    >>> import numpy as np
    >>> 
    >>> def make_model():
    ...     model = Sequential()
    ...     model.add(Dense(64, activation='relu', input_dim=20))
    ...     model.add(Dropout(0.5))
    ...     model.add(Dense(64, activation='relu'))
    ...     model.add(Dropout(0.5))
    ...     model.add(Dense(10, activation='softmax'))
    ...     return model
    ... 
    >>> K.set_floatx('float64')
    >>> model = make_model()
    >>> 
    >>> K.set_floatx('float32')
    >>> ws = model.get_weights()
    >>> wsp = [w.astype(K.floatx()) for w in ws]
    >>> model_quant = make_model()
    >>> model_quant.set_weights(wsp)
    >>> xp = x.astype(K.floatx())
    >>> 
    >>> print(np.unique([w.dtype for w in model.get_weights()]))
    [dtype('float64')]
    >>> print(np.unique([w.dtype for w in model_quant.get_weights()]))
    [dtype('float32')]
    

    关于python-3.x - 如何将预训练的 Keras 模型的所有层转换为不同的 dtype(从 float32 到 float16)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47895494/

    相关文章:

    python-3.x - wget 不是内部或外部命令,也不是可运行的程序或批处理文件

    python - 我可以使用 ktrain 库从检查点恢复训练吗?

    python - Keras 替换输入层

    来自 dll 的 Java 调用函数

    python - 更新了环境变量但 os.getenv() 一直返回 None

    python - 尝试通过字符串从同一包中的模块导入类

    python - 使用 C 将 numpy 数组对象拆分为两个不同大小的 vector

    python - Pandas Dataframe 多色线图

    python - 将图像分割成任意数量的框

    python - 不同时间步长的数据形状和 LSTM 输入