将持久的keras模型写入s3

时间:2017-12-21 18:00:20

标签: amazon-s3 keras bucket

我在keras中运行了一个lstm模型并将其持久保存到json对象中。 我想将这个json对象直接写入s3存储桶。 Boto3教程真的没有涉及到这个,它们只展示了如何将文件写入s3。我真的需要能够将json中的keras模型直接从python(在内存中)存储到s3。有什么想法吗?

3 个答案:

答案 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,
    )

我没有测试这个确切的代码片段,但我之前已经使用过类似这些的东西并且它有效。