【问题标题】:Load dataset from amazon S3 to jupyter notebook on EC2将数据集从亚马逊 S3 加载到 EC2 上的 jupyter 笔记本
【发布时间】:2019-02-17 23:57:00
【问题描述】:

我想尝试使用 AWS 进行深度学习的图像分割。我将数据存储在 Amazon S3 上,我想从在 Amazon EC2 实例上运行的 Jupyter Notebook 访问它。

我正计划使用 Tensorflow 进行分割,因此使用 Tensorflow 自己提供的选项 (https://www.tensorflow.org/deploy/s3) 对我来说似乎是合适的,因为我觉得最终我希望我的数据以 tf 的格式表示.数据集。然而,这对我来说并不完全奏效。我尝试了以下方法:

filenames = ["s3://path_to_first_image.png", "s3://path_to_second_image.png"]
dataset = tf.data.TFRecordDataset(filenames)

iterator = dataset.make_one_shot_iterator()
next_element = iterator.get_next()

with tf.Session() as sess:
for i in range(2):
    print(sess.run(next_element))

我收到以下错误:

OutOfRangeError: End of sequence
 [[Node: IteratorGetNext_6 = IteratorGetNext[output_shapes=[[]], output_types=[DT_STRING], _device="/job:localhost/replica:0/task:0/device:CPU:0"](OneShotIterator_6)]]

我对 tensorflow 还是很陌生,最近才开始尝试一些 AWS 的东西,所以我希望我的错误对有更多经验的人来说是显而易见的。我将不胜感激任何帮助或建议!也许这甚至是错误的方式,我最好使用 boto3 之类的东西(也偶然发现它,但认为 tf 在我的情况下更合适)或其他东西?

附: Tensorflow 还建议使用以下部分测试设置:

from tensorflow.python.lib.io import file_io
print (file_io.stat('s3://path_to_image.png'))

对我来说,这会导致 Object doesn't exist 错误,尽管该对象肯定存在,并且如果我使用它会在其他列表中列出

for obj in s3.Bucket(name=MY_BUCKET_NAME).objects.all():
print(os.path.join(obj.bucket_name, obj.key))

我还填写了我的凭据/.aws/credentials。这里可能有什么问题?

【问题讨论】:

  • 您找到解决方案了吗?我仍然在使用 tf.data.TFRecordDataset 和 s3 时遇到错误
  • @Roelant 嗨!正如我在 Farzan 的回答下的评论部分中提到的 - 我决定将我的所有文件移动到 EBS,该 EBS 可以安装到我的 EC2 实例并用作驱动器,因此所有文件都可以直接访问。最后,我没有弄清楚如何直接使用来自 S3 的数据进行训练,我建议将数据保存在运行代码的服务器上,因为它比必须不断下载数据要快几个数量级从云服务器。干杯!

标签: amazon-web-services tensorflow amazon-s3 amazon-ec2 jupyter-notebook


【解决方案1】:

不是对您问题的直接回答,但我仍然注意到为什么您无法使用 Tensorflow 加载数据。

您文件名中的文件是.png,而不是.tfrecord 文件格式,这是一种二进制存储格式。所以,tf.data.TFRecordDataset(filenames) 不应该工作。

我认为以下方法会起作用。注意:这是TF2的,不知道TF1是否一样。可以在 TensorFlow 的网站tensorflow example

上找到类似的示例

步骤 1

使用tf.data.Dataset.list_files 将您的文件加载到 TensorFlow 数据集中。

import tensorflow as tf

list_ds = tf.data.Dataset.list_files(filenames)

第二步

使用map创建一个将应用于数据集中每个元素的函数;这将对 TF 数据集中的每个元素使用该函数。

def process_path(file_path):
    '''reads the path and returns an image.''' 
    # load the raw data from the file as a string
    byteString = tf.io.read_file(file_path)
    # convert the compressed string to a 3D uint8 tensor
    img = tf.image.decode_png(byteString, channels=3)
    return img

dataset = list_ds.map(preprocess_path)

第三步

查看图片。

import matplotlib.pyplot as plt

for image in dataset.take(1): plt.imshow(image)

【讨论】:

    【解决方案2】:

    通过

    直接从 Ubuntu 深度学习实例访问 S3 数据
    cd ~/.aws
    aws configure
    

    然后更新实例的 aws 密钥和密钥,以确保。使用以下命令检查 awscli 版本:

    aws --version
    

    阅读更多配置

    https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
    

    你可以输入jupyter

    import pandas as pd
    from smart_open import smart_open
    import os
    
    aws_key = 'aws_key'
    aws_secret = 'aws_secret'
    
    bucket_name = 'my_bucket'
    object_key = 'data.csv'
    
    path = 's3://{}:{}@{}/{}'.format(aws_key, aws_secret, bucket_name, object_key)
    
    df = pd.read_csv(smart_open(path))
    

    此外,存储在存储桶中的对象具有唯一的键值,并使用 HTTP URL 地址进行检索。例如,如果一个具有键值的对象

    /photos/mygarden.jpg 
    

    存储在

    myawsbucket 
    

    bucket,则可以使用 URL 寻址

    http://myawsbucket.s3.amazonaws.com/photos/mygarden.jpg.
    

    如果您的数据不敏感,您可以使用 http 选项。更多详情:

    https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonS3.html

    您可以将存储桶的设置更改为公开。希望这会有所帮助。

    【讨论】:

    • 感谢您的回答!最后我决定使用 EBS 系统来存储和使用我的数据进行深度学习
    猜你喜欢
    • 2019-07-30
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 2011-10-05
    相关资源
    最近更新 更多