Sagemaker从RecordIO到稀疏矩阵

时间:2019-09-05 21:23:59

标签: python numpy amazon-sagemaker

在为Sagemaker的因式分解机实施准备数据进行培训时,我成功地使用了函数write_spmatrix_to_sparse_tensorsource code)将数据从稀疏矩阵转换为Sagemaker的因式分解机预期的记录格式实施。

示例,其中我将导入语句限制为提供的功能:

import os
import io
import boto3
import sagemaker.amazon.common as smac

def write_recordio(array, y, prefix, f):
    # Convert to record protobuf
    buf = io.BytesIO()
    smac.write_spmatrix_to_sparse_tensor(array=array, file=buf, labels=y)
    buf.seek(0)

    fname = os.path.join(prefix, f)
    boto3.Session().resource('s3').Bucket('bucket_name').Object(fname).upload_fileobj(buf)

参数array的示例片段,具有以下功能:

   (0, 990290)  1.0
   (0, 1266265) 1.0
   (1, 560338)  1.0
   (1, 1266181) 1.0
   (2, 182872)  1.0
   (2, 1266205) 1.0
   ...

y的示例格式是我的目标:

[1. 1. 1. ... 3. 1. 5.]

write_spmatrix_to_sparse_tensor与上述功能和输入配合使用。训练完模型后,我然后使用Sagemaker的Batch Transform来接收一个.out文件,该文件的输出类型为<class 'record_pb2.Record'>

示例:

来自write_spmatrix_to_sparse_tensor输出的一条记录:

features {
  key: "values"
  value {
    float32_tensor {
      values: 1.0
      values: 1.0
      keys: 990290
      keys: 1266265
      shape: 1266394
    }
  }
}
label {
  key: "values"
  value {
    float32_tensor {
      values: 1.0
    }
  }
}

批处理转换输出(.out)文件中的一条记录(其中有许多记录存在):

label {
  key: "score"
  value {
    float32_tensor {
      values: 1.5246734619140625
    }
  }
}

因此,现在我有一个最初使用write_spmatrix_to_sparse_tensor编写的文件和transformer.transform的输出,我想从这些文件恢复到我的原始稀疏矩阵格式。本质上,如果函数write_sparse_tensor_to_spmatrix存在,它将是什么样?

1 个答案:

答案 0 :(得分:1)

一定有更好的方法。但我学到的是从输出文件中读取值。更改数据类型并将它们改造成正确的格式。读取值的示例

data.label['score'].float32_tensor.values

此处的 data 是输出文件中的一条记录。结果的类型是“google.protobuf.pyext._message.RepeatedScalarContainer”,但您可以将其转换为 Python 列表或 NumPy 数组或适合您的模型的任何数据类型。