【发布时间】:2021-03-23 19:14:23
【问题描述】:
我想在具有不同 python 版本的不同计算机上使用我的 keras 模型
我不想使用 Pickle 和 numpy.savez,因为它在不同的环境中会导致问题
我从这个开始,它工作正常
import json
import numpy as np
from tensorflow import keras
def save_mod(model, name="my_model"):
with open(name + '.json', 'w') as fp:
json.dump(model.to_json(), fp)
# save weights
model_weights = model.get_weights()
return model_weights
def load_mod(model_weights_, name="my_model"):
# load config
with open(name + ".json", "r") as read_file:
json_string = json.load(read_file)
model_ = keras.models.model_from_json(json_string, custom_objects={})
# load weights
model_.set_weights(model_weights_)
return model_
model = keras.models.load_model("segmentation.h5")
weights = save_mod(model)
loaded_model = load_mod(weights)
然后我尝试保存和加载权重
np.savetxt('weights.txt', weights, fmt='%s')
loaded_weights = np.fromfile('weights.txt')
print(len(weights))
print(len(loaded_weights))
>> 112
>> 31013
我得到了 112 和 31013,方法不起作用
with open('test.txt', 'wb') as f:
np.savetxt(f, np.column_stack(weights), fmt='%1.10f')
它说>>所有输入数组必须具有相同的维数,但索引 0 处的数组有 4 维,索引 1 处的数组有 2 维
我终于做到了
class EncodeNumpy(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, np.ndarray):
return obj.tolist()
return json.JSONEncoder.default(self, obj)
we = np.array(weights)
print(a.shape)
json_dump = json.dumps({'we': we}, cls=EncodeNumpy)
json_load = json.loads(json_dump)
a_restored = np.asarray(json_load["we"])
print(a_restored.shape)
model.set_weights(a_restored)
它给了我 (112,) 和 (112,) 形状的数组
但是 model.set_weights(a_restored) 返回
AttributeError: 'list' object has no attribute 'shape'
【问题讨论】:
标签: python numpy keras numpy-ndarray