通过命令行

时间:2018-03-16 09:53:58

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

我的谷歌云存储桶在 gs:// MYBucket / demo2 / TFRecords / 下有两个文件夹训练测试,其中包含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

此处培训包含我的广告素材的地址

我的代码

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才能正确提供训练文件的路径?

2 个答案:

答案 0 :(得分:0)

你应该能够使用没有StringIO的字符串:

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

此外,这应该是一样的:

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

答案 1 :(得分:0)

如果我已正确理解您的问题,--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])

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