Что означает ошибка «Данные объекта, сгенерированные набором данных, не имеют требуемого ключа ввода», означают в тензорном потоке js? - PullRequest
1 голос
/ 13 февраля 2020

Что означает ошибка Uncaught (в обещании) Ошибка: в данных объекта, сгенерированных набором данных, отсутствует требуемый ключ ввода 'density_Dense1_input'. означает? Я пробовал разные вещи, чтобы решить эту проблему, например, разные формы ввода и разный размер пакета, но, похоже, ничего не получалось. У меня есть ввод данных с 484 объектами и 30 строками, а также набор меток с 1 столбцом и 30 строками.

Точная ошибка:

Uncaught (in promise) Error: The feature data generated by the dataset lacks the required input key 'dense_Dense1_input'.
    at new e (errors.ts:48)
    at Wd (training_dataset.ts:277)
    at Pd (training_dataset.ts:222)
    at training_dataset.ts:421
    at common.ts:14
    at Object.next (common.ts:14)
    at o (common.ts:14)

Мой код

<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.5.2/dist/tf.min.js"></script>
<title>test</title>             
</head>
<body>
<script>

const csvUrlData = '/image_data.csv';
const csvUrlLabel = '/number_data.csv';
const headers_image = Array.from(Array(484).keys());
const headers_image_string = headers_image.map(String);

async function run() {
  const csvDataset = tf.data.csv(
    csvUrlData,{
        hasHeader: false,
        columnNames: headers_image_string
    });
  const csvLabelset = tf.data.csv(
    csvUrlLabel, {
        columnConfigs: {
            label_numbers: {
                isLabel: true
            }
        }
    }
  );

  const flattenedDataset = tf.data.zip({xs: csvDataset, ys: csvLabelset}).batch(5);

  const model = tf.sequential();
  model.add(tf.layers.dense({
    inputShape: [484],
    units: 1
  }));
  model.compile({
    optimizer: tf.train.sgd(0.00000001),
    loss: 'meanSquaredError'
  });

  return await model.fitDataset(flattenedDataset, {
    epochs: 10,
    callbacks: {
      onEpochEnd: async (epoch, logs) => {
        console.log(epoch + ':' + logs.loss);
      }
    }
  });
}
run();
</script>
</body>
</html>

1 Ответ

1 голос
/ 26 февраля 2020

Свойство isLabel не должно использоваться в labelDataset, поскольку данные архивируются после. Это создаст вложенный объект для метки. Если его необходимо использовать, то оператор map должен использоваться для извлечения только свойства ys labelDataset.

  const csvDataset = tf.data.csv(
    csvUrlData,{
        hasHeader: false,
        columnNames: headers_image_string
    });
  const csvLabelset = tf.data.csv(
    csvUrlLabel, {
        columnConfigs: {
            label_numbers: {
                isLabel: true
            }
        }
    }
  );

  const flattenedcsvDataset =
    csvDataset
    .map((data) =>
      {
        return Object.values(data)
      })

  const flattenedcsvLabelset =
    csvDataset
    .map((data) =>
      {
        return Object.values(data)
      })

  const flattenedDataset = tf.data.zip({xs: flattenedcsvDataset, ys: flattenedcsvLabelset}).batch(5);

. Затем можно использовать flattenedDataset для обучения. .

const csvUrl =
'https://storage.googleapis.com/tfjs-examples/multivariate-linear-regression/data/boston-housing-train.csv';

(async function run() {
 
  const csvDataset = tf.data.csv(
    csvUrl, {
      columnConfigs: {
       /* medv: {
          isLabel: true
        }*/
      }
    });

  // Number of features is the number of column names minus one for the label
  // column.
  const numOfFeatures = (await csvDataset.columnNames()).length ;

  // Prepare the Dataset for training.
  const flattenedDataset =
    csvDataset
    .map((data) =>
      {
      return Object.values(data)
      })
  
  const zip = tf.data.zip({xs: flattenedDataset, ys: flattenedDataset}).batch(10)
  
  // Define the model.
  const model = tf.sequential();
  model.add(tf.layers.dense({
    inputShape: [numOfFeatures],
    units: numOfFeatures
  }));
  model.compile({
    optimizer: tf.train.sgd(0.000001),
    loss: 'meanSquaredError'
  });

  // Fit the model using the prepared Dataset
  return model.fitDataset(zip, {
    epochs: 10,
    callbacks: {
      onEpochEnd: async (epoch, logs) => {
        console.log(epoch + ':' + logs.loss);
      }
    }
  });
})()
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.5.2/dist/tf.min.js"></script>
<title>test</title>             
</head>
<body>
<script>


</script>
</body>
</html>
...