将持久化的 keras 模型写入 s3

Jan*_*nnk 5 amazon-s3 bucket keras

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

big*_*mac 6

由于此问题只有一个答案,请注意,model.to_json()仅保存模型架构和初始化权重,而不保存训练后的权重。不幸的是,keras API 文档对此并不清楚,但如果您使用它加载模型,model_from_json它将运行,但使用初始权重。因此,你的模型的输出可能是荒谬的。

目前似乎没有一种简单的方法可以直接从内存写入模型文件(尽管请查看此处的示例)。

为了保存经过训练的权重的模型,请使用 keras文档中提出的保存模型对象的方法。

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
Run Code Online (Sandbox Code Playgroud)

要下载模型并加载它:

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')
Run Code Online (Sandbox Code Playgroud)

如果您不想在本地保存该文件,则可以再次删除该文件。


小智 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')
Run Code Online (Sandbox Code Playgroud)

然后,您可以下载该文件keras-model.json,然后使用 将其加载回 Keras 模型,如下所示model_from_json

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()
Run Code Online (Sandbox Code Playgroud)