AWS S3和Sagemaker:没有此类文件或目录

时间:2019-08-26 15:49:42

标签: amazon-s3 amazon-sagemaker

我创建了一个S3存储桶“ testshivaproject”,并在其中上传了图片。当我尝试在sagemaker笔记本中访问它时,会引发错误“无此文件或目录”。

# import libraries
import boto3, re, sys, math, json, os, sagemaker, urllib.request
from sagemaker import get_execution_role
import numpy as np                                   

# Define IAM role
role = get_execution_role()

my_region = boto3.session.Session().region_name # set the region of the instance

print("success :"+my_region)

输出:成功:us-east-2

role

输出:'arn:aws:iam :: 847047967498:role / service-role / AmazonSageMaker-ExecutionRole-20190825T121483'

bucket = 'testprojectshiva2' 
data_key = 'ext_image6.jpg' 
data_location = 's3://{}/{}'.format(bucket, data_key) 
print(data_location)

输出:s3://testprojectshiva2/ext_image6.jpg

test = load_img(data_location)

输出:没有此类文件或目录

有人提出类似的问题(Load S3 Data into AWS SageMaker Notebook),但没有找到任何解决方案?

2 个答案:

答案 0 :(得分:2)

感谢您使用Amazon SageMaker!

我从您的描述中有点猜测,但是您是否正在尝试使用Keras load_img函数直接从S3存储桶中加载图像?

不幸的是,the load_img function is designed to only load files from disk,因此将s3:// URL传递给该函数将始终返回FileNotFoundError

通常在使用S3之前先下载图像,因此您可以在调用load_img之前使用boto3或AWS CLI下载文件。

或者,由于load_img函数只是创建一个PIL Image对象,因此您可以使用boto3直接从S3中的数据创建PIL对象,而根本不使用load_img函数。

换句话说,您可以执行以下操作:

from PIL import Image

s3 = boto3.client('s3')
test = Image.open(BytesIO(
    s3.get_object(Bucket=bucket, Key=data_key)['Body'].read()
    ))

希望这对您的项目有所帮助!

答案 1 :(得分:0)

您可以使用以下代码将CSV文件拉入sagemaker。

import pandas as pd

bucket='your-s3-bucket'
data_key = 'your.csv'
data_location = 's3://{}/{}'.format(bucket, data_key)
df = pd.read_csv(data_location)

data_location变量的替代格式:

data_location = f's3://{bucket}/{data_key}'