code: def test_NNEstimator_multi_input(self):
      zx1 = ZLayer.Input(shape=(1,))
      zx2 = ZLayer.Input(shape=(1,))
      zz = ZLayer.merge([zx1, zx2], mode="concat")
      zy = ZLayer.Dense(2)(zz)
      zmodel = ZModel([zx1, zx2], zy)
  
      criterion = MSECriterion()
      df = self.get_estimator_df()
      estimator = (
          NNEstimator(zmodel, criterion, [[1], [1]])
          .setMaxEpoch(5)
          .setBatchSize(4)
      )
      nnmodel = estimator.fit(df)
      nnmodel.transform(df).collect()
  
imports: import errno
  import shutil
  import pytest
  from bigdl.dllib.nn.criterion import *
  from bigdl.dllib.nn.layer import *
  from bigdl.dllib.optim.optimizer import *
  from numpy.testing import assert_allclose
  from pyspark.ml import Pipeline, PipelineModel
  from pyspark.ml.feature import MinMaxScaler
  from pyspark.ml.tuning import ParamGridBuilder
  from pyspark.sql.types import *
  from bigdl.dllib.nncontext import *
  from bigdl.dllib.feature.common import *
  from bigdl.dllib.feature.image import *
  from bigdl.dllib.keras import layers
  from bigdl.dllib.keras.models import Model
  from bigdl.dllib.keras.optimizers import Adam
  from bigdl.dllib.nnframes import *
  from bigdl.dllib.utils.tf import *
  from pyspark.sql.functions import array
  from pyspark.ml.linalg import DenseVector, VectorUDT
  from pyspark.sql.functions import udf, array
label_desc: Use image node_id 19 for calling the TestNNClassifer obj's underlying member method code with example usage: obj.test_NNEstimator_multi_input() without return types