我在keras中运行了一个lstm模型并将其持久保存到json对象中。 我想将这个json对象直接写入s3存储桶。 Boto3教程真的没有涉及到这个,它们只展示了如何将文件写入s3。我真的需要能够将json中的keras模型直接从python(在内存中)存储到s3。有什么想法吗?
答案 0 :(得分:2)
由于此问题只有一个答案,请注意,model.to_json()
仅保存模型架构和已初始化权重,而不保存已训练权重。不幸的是,keras API文档尚不清楚,但是如果您使用model_from_json
加载模型,它将运行,但会使用初始权重。因此,模型的输出可能是非整数的。
目前似乎没有一种直接从内存中直接写入模型文件的简单方法(尽管请看示例here)。
为了保存训练有素的权重的模型,请使用该方法来保存在keras documentation中提出的模型对象。
from keras.models import load_model
import boto3
model.save('my_model.h5') # creates a HDF5 file 'my_model.h5'
client = boto3.client('s3')
client.upload_file(Filename='my_model.h5',
Bucket=BUCKET_NAME,
Key='my_model.h5')
del model # deletes the existing model
要下载模型并加载它:
client.download_file(BUCKET_NAME,
'my_model.h5',
'my_model.h5')
# returns a compiled model
# identical to the previous one
model = load_model('my_model.h5')
如果您不想将其保存在本地,则可以再次删除该文件。
答案 1 :(得分:1)
您可以使用Client.put_object()直接写入S3对象,而无需保存并上传文件。这是一个具体的例子:
import boto3
# Convert your existing model to JSON
saved_model = model.to_json()
# Write JSON object to S3 as "keras-model.json"
client = boto3.client('s3')
client.put_object(Body=saved_model,
Bucket='BUCKET_NAME',
Key='keras-model.json')
然后,您可以下载keras-model.json
,然后使用model_from_json
将其重新加载到这样的Keras模型中。
from keras.models import model_from_json
# Read the downloaded JSON file
with open('keras-model.json', 'r') as model_file:
loaded_model = model_file.read()
# Convert back to Keras model
model = model_from_json(loaded_model)
# Confirmation
model.summary()
答案 2 :(得分:0)
即使对于 h5 类型,也有一种方法可以通过 h5py 库执行此操作。
对于经过训练的模型,h5 类型是必需的,因为它包含权重。 json 版本没有,如上所述。
import io
import h5py
import boto3
# Create bytes io as target.
with io.BytesIO() as model_io:
# Instanciate h5 file using the io.
with h5py.File(model_io, 'w') as model_h5:
# Save the Keras model to h5 object (and indirectly to bytesio).
model.save(model_h5)
# Make sure the data is written entirely to the bytesio object.
model_h5.flush()
# Upload to S3.
client = boto3.client('s3')
client.put_object(
Bucket='BUCKET_NAME',
Key='keras-model.h5',
Body=model_io,
)
我没有测试这个确切的代码片段,但我之前已经使用过类似这些的东西并且它有效。