h2o DeepLearning失败:字段的非法参数:隐藏模式:DeepLearningParametersV3:无法将“”200“”转换为int

时间:2018-05-29 09:40:02

标签: h2o

我想通过使用H2O来执行DeepLearning示例。但是在运行"DeepLearningV3 dlBody = h2o.train_deeplearning(dlParams);"

时出错了

错误消息:

 Illegal argument for field: 
 hidden of schema: 
 DeepLearningParametersV3: 
 cannot convert ""200"" to type int

这是我的代码,我使用了除"responseColumn"之外的dlParam的默认值。出错后,我添加了一行来设置"hidden"的值,但结果没有改变。

   private void DL() throws IOException {
    //H2O start
    String url = "http://localhost:54321/";
    H2oApi h2o = new H2oApi(url);

    //STEP 0: init a session
    String sessionId = h2o.newSession().sessionKey;

    //STEP 1: import raw file
    String path = "hdfs://kbmst:9000/user/spark/datasets/iris.csv";
    ImportFilesV3 importBody = h2o.importFiles(path, null);
    System.out.println("import: " + importBody);

    //STEP 2: parse setup
    ParseSetupV3 parseSetupParams = new ParseSetupV3();
    parseSetupParams.sourceFrames = H2oApi.stringArrayToKeyArray(importBody.destinationFrames, FrameKeyV3.class);
    ParseSetupV3 parseSetupBody = h2o.guessParseSetup(parseSetupParams);
    System.out.println("parseSetupBody: " + parseSetupBody);

    //STEP 3: parse into columnar Frame
    ParseV3 parseParams = new ParseV3();
    H2oApi.copyFields(parseParams, parseSetupBody);
    parseParams.destinationFrame = H2oApi.stringToFrameKey("iris.hex");
    parseParams.blocking = true;
    ParseV3 parseBody = h2o.parse(parseParams);
    System.out.println("parseBody: " + parseBody);

    //STEP 4: Split into test and train datasets
    String tmpVec = "tmp_" + UUID.randomUUID().toString();
    String splitExpr =
            "(, " +
                    "  (tmp= " + tmpVec + " (h2o.runif iris.hex 906317))" +
                    "  (assign train " +
                    "    (rows iris.hex (<= " + tmpVec + " 0.75)))" +
                    "  (assign test " +
                    "    (rows iris.hex (> " + tmpVec + " 0.75)))" +
                    "  (rm " + tmpVec + "))";
    RapidsSchemaV3 rapidsParams = new RapidsSchemaV3();
    rapidsParams.sessionId = sessionId;
    rapidsParams.ast = splitExpr;
    h2o.rapidsExec(rapidsParams);

    // STEP 5: Train the model
    // (NOTE: step 4 is polling, which we don't require because we specified blocking for the parse above)
    DeepLearningParametersV3 dlParams = new DeepLearningParametersV3();
    dlParams.trainingFrame = H2oApi.stringToFrameKey("train");
    dlParams.validationFrame = H2oApi.stringToFrameKey("test");

    dlParams.hidden=new int[]{200,200};

    ColSpecifierV3 responseColumn = new ColSpecifierV3();
    responseColumn.columnName = "class";
    dlParams.responseColumn = responseColumn;

    System.out.println("About to train DL. . .");
    DeepLearningV3 dlBody = h2o.train_deeplearning(dlParams);
    System.out.println("dlBody: " + dlBody);

    // STEP 6: poll for completion
    JobV3 job = h2o.waitForJobCompletion(dlBody.job.key);
    System.out.println("DL build done.");

    // STEP 7: fetch the model
    ModelKeyV3 model_key = (ModelKeyV3)job.dest;
    ModelsV3 models = h2o.model(model_key);
    System.out.println("models: " + models);
    DeepLearningModelV3 model = (DeepLearningModelV3)models.models[0];
    System.out.println("new DL model: " + model);


    // STEP 8: predict!
    ModelMetricsListSchemaV3 predict_params = new ModelMetricsListSchemaV3();
    predict_params.model = model_key;
    predict_params.frame = dlParams.trainingFrame;
    predict_params.predictionsFrame = H2oApi.stringToFrameKey("predictions");

    ModelMetricsListSchemaV3 predictions = h2o.predict(predict_params);
    System.out.println("predictions: " + predictions);

    // STEP 9: end the session
    h2o.endSession();
}

我找到了相关的源代码,但我无法理解为什么会出错。 这是隐藏的定义。

public class DeepLearningParametersV3 extends ModelParametersSchemaV3 {{
    /**
     * Hidden layer sizes (e.g. [100, 100]).
    */
    public int[] hidden;
    //other params
}

这是错误消息显示的代码。它是行String msg = "Illegal argument for field: " + field_name + " of schema: " + schemaClass.getSimpleName() + ": cannot convert \"" + s + "\" to type " + fclz.getSimpleName();

static <E> Object parse(String field_name, String s, Class fclz, boolean required, Class schemaClass) {
if (fclz.isPrimitive() || String.class.equals(fclz)) {
  try {
    return parsePrimitve(s, fclz);
  } catch (NumberFormatException ne) {
    String msg = "Illegal argument for field: " + field_name + " of schema: " +  schemaClass.getSimpleName() + ": cannot convert \"" + s + "\" to type " + fclz.getSimpleName();
    throw new H2OIllegalArgumentException(msg);
  }
}
// An array?
if (fclz.isArray()) {
  // Get component type
  Class<E> afclz = (Class<E>) fclz.getComponentType();
  // Result
  E[] a = null;
  // Handle simple case with null-array
  if (s.equals("null") || s.length() == 0) return null;
  // Handling of "auto-parseable" cases
  if (AutoParseable.class.isAssignableFrom(afclz))
    return gson.fromJson(s, fclz);
  // Splitted values
  String[] splits; // "".split(",") => {""} so handle the empty case explicitly
  if (s.startsWith("[") && s.endsWith("]") ) { // It looks like an array
    read(s, 0, '[', fclz);
    read(s, s.length() - 1, ']', fclz);
    String inside = s.substring(1, s.length() - 1).trim();
    if (inside.length() == 0)
      splits = new String[]{};
    else
      splits = splitArgs(inside);
  } else { // Lets try to parse single value as an array!
    // See PUBDEV-1955
    splits = new String[] { s.trim() };
  }

  // Can't cast an int[] to an Object[].  Sigh.
  if (afclz == int.class) { // TODO: other primitive types. . .
    a = (E[]) Array.newInstance(Integer.class, splits.length);
  } else if (afclz == double.class) {
    a = (E[]) Array.newInstance(Double.class, splits.length);
  } else if (afclz == float.class) {
    a = (E[]) Array.newInstance(Float.class, splits.length);
  } else {
    // Fails with primitive classes; need the wrapper class.  Thanks, Java.
    a = (E[]) Array.newInstance(afclz, splits.length);
  }

  for (int i = 0; i < splits.length; i++) {
    if (String.class == afclz || KeyV3.class.isAssignableFrom(afclz)) {
      // strip quotes off string values inside array
      String stripped = splits[i].trim();

      if ("null".equals(stripped.toLowerCase()) || "na".equals(stripped.toLowerCase())) {
        a[i] = null;
        continue;
      }

      // Quotes are now optional because standard clients will send arrays of length one as just strings.
      if (stripped.startsWith("\"") && stripped.endsWith("\"")) {
        stripped = stripped.substring(1, stripped.length() - 1);
      }

      a[i] = (E) parse(field_name, stripped, afclz, required, schemaClass);
    } else {
      a[i] = (E) parse(field_name, splits[i].trim(), afclz, required, schemaClass);
    }
  }
  return a;
}

// Are we parsing an object from a string? NOTE: we might want to make this check more restrictive.
if (! fclz.isAssignableFrom(Schema.class) && s != null && s.startsWith("{") && s.endsWith("}")) {
  return gson.fromJson(s, fclz);
}

if (fclz.equals(Key.class))
  if ((s == null || s.length() == 0) && required) throw new H2OKeyNotFoundArgumentException(field_name, s);
  else if (!required && (s == null || s.length() == 0)) return null;
  else
    return Key.make(s.startsWith("\"") ? s.substring(1, s.length() - 1) : s); // If the key name is in an array we need to trim surrounding quotes.

if (KeyV3.class.isAssignableFrom(fclz)) {
  if ((s == null || s.length() == 0) && required) throw new H2OKeyNotFoundArgumentException(field_name, s);
  if (!required && (s == null || s.length() == 0)) return null;

  return KeyV3.make(fclz, Key.make(s.startsWith("\"") ? s.substring(1, s.length() - 1) : s)); // If the key name is in an array we need to trim surrounding quotes.
}

if (Enum.class.isAssignableFrom(fclz)) {
  return EnumUtils.valueOf(fclz, s);
}

// TODO: these can be refactored into a single case using the facilities in Schema:
if (FrameV3.class.isAssignableFrom(fclz)) {
  if ((s == null || s.length() == 0) && required) throw new H2OKeyNotFoundArgumentException(field_name, s);
  else if (!required && (s == null || s.length() == 0)) return null;
  else {
    Value v = DKV.get(s);
    if (null == v) return null; // not required
    if (!v.isFrame()) throw H2OIllegalArgumentException.wrongKeyType(field_name, s, "Frame", v.get().getClass());
    return new FrameV3((Frame) v.get()); // TODO: version!
  }
}

if (JobV3.class.isAssignableFrom(fclz)) {
  if ((s == null || s.length() == 0) && required) throw new H2OKeyNotFoundArgumentException(s);
  else if (!required && (s == null || s.length() == 0)) return null;
  else {
    Value v = DKV.get(s);
    if (null == v) return null; // not required
    if (!v.isJob()) throw H2OIllegalArgumentException.wrongKeyType(field_name, s, "Job", v.get().getClass());
    return new JobV3().fillFromImpl((Job) v.get()); // TODO: version!
  }
}

// TODO: for now handle the case where we're only passing the name through; later we need to handle the case
// where the frame name is also specified.
if (FrameV3.ColSpecifierV3.class.isAssignableFrom(fclz)) {
  return new FrameV3.ColSpecifierV3(s);
}

if (ModelSchemaV3.class.isAssignableFrom(fclz))
  throw H2O.fail("Can't yet take ModelSchemaV3 as input.");
/*
  if( (s==null || s.length()==0) && required ) throw new IllegalArgumentException("Missing key");
  else if (!required && (s == null || s.length() == 0)) return null;
  else {
  Value v = DKV.get(s);
  if (null == v) return null; // not required
  if (! v.isModel()) throw new IllegalArgumentException("Model argument points to a non-model object.");
  return v.get();
  }
*/
throw H2O.fail("Unimplemented schema fill from " + fclz.getSimpleName());
} // parse()

1 个答案:

答案 0 :(得分:1)

看起来这可能是一个错误。已针对此问题创建了jira票证,您可以在此处跟踪:https://0xdata.atlassian.net/browse/PUBDEV-5454?filter=-1