如何从AWS S3读取图像到SageMaker Jupyter实例及技术咨询
解决方案:在SageMaker中访问S3图像数据集并构建CNN
嘿,作为过来人,我刚接触SageMaker时也在S3数据访问上踩过坑,针对你的三个问题,给你一步步梳理:
1. 如何从SageMaker Jupyter实例简单访问S3存储桶中的图像数据集
首先要确保你的SageMaker实例的IAM角色有访问目标S3桶的权限:
- 打开IAM控制台,找到你创建的那个SageMaker角色(比如
AmazonSageMaker-ExecutionRole-xxxx) - 给它添加一个自定义权限策略,只允许访问你的
Iphone_Classifier桶(比全量S3权限更安全):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::Iphone_Classifier", "arn:aws:s3:::Iphone_Classifier/*" ] } ] }
权限搞定后,有几种简单的访问方式:
- 直接用boto3读取图像到内存
- 用
s3fs把S3桶挂载成实例上的本地目录(像操作本地文件一样) - 用SageMaker内置工具批量下载文件到实例
2. 访问S3图像的参考代码
以下是适配你的conda_tensorflow2_p36环境的实用代码示例:
方式1:用boto3 + Pillow直接读取单张图像到内存
import boto3 from PIL import Image import io # SageMaker实例会自动用IAM角色认证,无需手动配置密钥 s3 = boto3.client('s3') # 读取一张Yes类的训练图 bucket_name = "Iphone_Classifier" file_key = "Train/Yes_iphone_images/sample_iphone.jpg" # 获取文件对象并转为PIL图像 response = s3.get_object(Bucket=bucket_name, Key=file_key) image_data = response['Body'].read() image = Image.open(io.BytesIO(image_data)) # 验证图像读取成功 print(f"图像尺寸:{image.size},图像模式:{image.mode}")
方式2:用s3fs挂载S3桶到本地目录
先安装依赖(在Notebook单元格中执行):
!pip install s3fs
然后挂载并遍历图像:
import s3fs from PIL import Image # 挂载S3桶 fs = s3fs.S3FileSystem(anon=False) bucket_root = "s3://Iphone_Classifier" # 遍历Train/Yes_iphone_images下的前5张图 yes_train_files = fs.glob(f"{bucket_root}/Train/Yes_iphone_images/*.jpg")[:5] for img_path in yes_train_files: with fs.open(img_path, 'rb') as f: img = Image.open(f) print(f"路径:{img_path.split('/')[-1]},尺寸:{img.size}")
方式3:用SageMaker工具批量下载到实例本地
from sagemaker.s3 import S3Downloader import os from PIL import Image # 下载整个Train文件夹到实例的本地data目录 local_train_dir = "./data/Train" S3Downloader.download( s3_uri="s3://Iphone_Classifier/Train", local_path=local_train_dir ) # 之后就可以像读取本地文件一样操作 yes_local_path = f"{local_train_dir}/Yes_iphone_images" for img_name in os.listdir(yes_local_path)[:5]: img = Image.open(os.path.join(yes_local_path, img_name)) print(f"本地图像:{img_name},尺寸:{img.size}")
3. 将数据复制到Notebook还是直接从S3操作更优?
这取决于你的数据集规模和训练需求:
- 优先复制到实例本地(适合你的当前场景):
- 你的数据集总共2230张图,体积不大,复制到实例后训练时的IO速度更快,避免S3网络延迟
- 操作更符合本地开发习惯,不需要额外处理S3路径逻辑
- 注意:SageMaker实例的存储是临时的,停止实例后数据会丢失,训练完成后记得把模型、结果等重要文件上传回S3
- 直接从S3操作(适合大数据集):
- 如果数据集超过实例存储容量(比如几十万张图),或者需要分布式训练,直接从S3读取更合适
- 可以用TensorFlow的
tf.data.Dataset配合S3路径,或者SageMaker的管道模式(Pipe Mode)高效读取数据 - 优点是节省实例存储成本,数据始终保存在S3,不会丢失
总结:你现在的数据集规模很小,复制到实例本地是更高效的选择,训练完记得把模型和评估结果同步回S3就行。
内容的提问来源于stack exchange,提问作者Joker
相关产品推荐
相关产品推荐

