【问题标题】:Providing bucket path to program through command line通过命令行为程序提供存储桶路径
【发布时间】:2018-03-16 09:53:57
【问题描述】:

我的谷歌云存储桶在 gs://MYBucket/demo2/TFRecords/ 下有两个文件夹 traintest,其中包含图像的 TFRecords嵌入。我将存储桶的 url 作为参数传递给程序。

在终端中输入以下内容以提交作业:

$training='gs://MYBucket/demo2/'

$gcloud ml-engine jobs submit training $JOB_NAME \
--job-dir $JOB_DIR \
--module-name $TRAINER_MODULE \
--package-path $TRAINER_PATH \
--region $REGION \
-- \
--train-files $training

这里 training 包含我的存储桶的地址

我的代码

from tensorflow.python.lib.io import file_io
from StringIO import StringIO

BUCKET=None
DATA_DIR = "TFRecords/train/"

~Some code~

def Load_input():
    global BUCKET    

    filenames = [os.path.join(BUCKET+DATA_DIR, "train-0000%d-of-00002.tfrecord" % i) for i in xrange(0, 1)]

    for f in filenames:
        if not tf.gfile.Exists(f):
            raise ValueError("Failed to find file: " + f)
    filename_queue = tf.train.string_input_producer(filenames)

~Some code~

def main(unused_args):    
  parser.add_argument('--train-files',help='BUCKET path to training data',nargs='+',required=True)
  args = parser.parse_args()
  global BUCKET
  BUCKET = StringIO(file_io.read_file_to_string(args.__dict__['train_files'][0]))

  ~Some other code that internally calls **Load_input()**~

行:

filenames = [os.path.join(BUCKET+DATA_DIR, "train-0000%d-of-00002.tfrecord" % i) for i in xrange(0, 1)]

抛出错误:

TypeError: +: 'instance' 和 'str' 的操作数类型不受支持

我尝试过的:

BUCKET = file_io.read_file_to_string(args.train_files[0])

但它会引发错误:

raise ValueError("Failed to find file: " + f)
ERROR   2018-03-16 15:57:55 +0530   master-replica-0        
ValueError: Failed to find file: TFRecords/train/train-00000-of-00002.tfrecord

我的问题: 我应该如何加入 BUCKET 和 DATA_DIR 才能正确提供训练文件的路径?

【问题讨论】:

    标签: python google-cloud-platform filepath google-cloud-ml


    【解决方案1】:

    如果我正确理解了您的问题,--train-files 只是一条路径。

    在这种情况下,您只需要执行以下操作

    def main(unused_args):    
      parser.add_argument('--train-files',help='BUCKET path to training data',nargs='+',required=True)
      args = parser.parse_args()
      global BUCKET
      BUCKET = args.train_files[0]
    

    另外,您将考虑使用os.path.join 构建整个路径;目前您正在使用BUCKET+DATA 构建零件,请尝试:

    filenames = [os.path.join(BUCKET, DATA_DIR, "train-0000%d-of-00002.tfrecord" % i) for i in xrange(0, 1)]
    

    最后,如果可能的话,我建议避免为 BUCKET 使用全局变量,因为它最终可能会导致细微的错误(例如,如果您在初始化之前不小心使用了它们)。考虑将值作为参数传递,例如

    def load_input(bucket):
        filenames = [os.path.join(bucket, DATA_DIR, "train-0000%d-of-00002.tfrecord" % i) for i in xrange(0, 1)]
    # ...
    
    def main(unused_args):    
      parser.add_argument('--train-files',help='BUCKET path to training data',nargs='+',required=True)
      args = parser.parse_args()
    
      load_input(bucket=args.train_files[0])
    

    (另外,您可能会发现命令行参数使用与变量名称相同的名称会很有帮助)。

    【讨论】:

    • 对,如果您想将存储桶位置传递给python 文件阅读器,例如open(),则需要StringIO(file_io.read_file_to_string(args.__dict__['train_files'][0])),因为他们不了解存储桶位置,即gs://...直接传递存储桶地址的 tensorflow 文件处理程序可以理解。早该尝试这个。如此简单,我的问题似乎很愚蠢。
    【解决方案2】:

    你应该能够在没有 StringIO 的情况下使用字符串:

    BUCKET = file_io.read_file_to_string(args.__dict__['train_files'][0])
    

    另外,这应该是同一件事:

    BUCKET = file_io.read_file_to_string(args.train_files[0])
    

    【讨论】:

    • 我早些时候尝试过,因为file_io.read_file_to_string 返回字符串,但我得到了raise ValueError("Failed to find file: " + f) ERROR 2018-03-16 15:57:55 +0530 master-replica-0 ValueError: Failed to find file: TFRecords/train/train-00000-of-00002.tfrecord
    • 那么正确的文件名是什么?可能是文件名的构造有小错误。
    猜你喜欢
    • 2016-04-08
    • 2012-01-03
    • 2019-03-16
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 2017-09-18
    相关资源
    最近更新 更多