Tensorflow.js inputShape не соответствует вводу модели - PullRequest
0 голосов
/ 18 апреля 2019

Это кажется довольно простым, но я не могу понять это.

Итак, у меня есть образец / данные / входные данные, которые представляют собой массив массивов по 10 дюймов, а выходные данные / метки - это просто массив целых чисел.

Позвольте мне объяснить, поскольку мои данные не структурированы должным образом. Основываясь на вводе 10 целых чисел, я сообщаю модели, что результатом является 1 целое число в метке / выводе.

Кроме того, я не могу пакетировать данные, потому что они последовательные. Это означает, что входные значения сдвигаются на единицу вправо, поэтому первые девять целых чисел в выборке [i + 1] являются последними 9 выборками [i] плюс новый.

Вот как у меня это закодировано.

let labels = [1,0,0...]

let samples = [[0,1,1,0,1,0,1,1,1,0], ...]

в основном массив из 10.

const model = tf.sequential();
let input = tf.tensor2d(samples);
model.add(tf.layers.dense({ units: 10, batchInputShape: [1, 10], activation: "sigmoid" }));
model.add(tf.layers.dense({ units: 1, activation: "softmax" }));
model.summary();
model.compile({ loss: "meanSquaredError", optimizer: "sgd", metrics: ["accuracy"] });
model.fit(labels, input, { batchSize: 1, shuffle: false, verbose: 1 });

Когда я пробую эту или любую другую комбинацию ввода, я получаю следующее

UnhandledPromiseRejectionWarning: Error: Error when checking model input: the Array of Tensors that you are passing to your model is not the size the model expected. Expected to see 1 Tensor(s), but instead got the following list of Tensor(s): 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0

Заранее спасибо за помощь.

1 Ответ

1 голос
/ 26 апреля 2019

inputShape не соответствует вводу модели

Ошибка указывает на несоответствие формы между входом модели и данными.

Как решить эту проблему?

  • Элементы должны иметь ту же форму, что и batchInputShape, или должны быть на одно измерение выше, чем InputShape. Первое измерение batchInputShape обычно равно нулю, чтобы учесть другое batchInputShape во время обучения. Но, указав здесь точно 1 (отличное от нуля), характеристики обучения должны в точности иметь первое измерение, равное 1. Если бы оно было нулевым, то можно было бы иметь особенности формы [b, .. .InputShape]

  • метки должны иметь форму [b, LastLayerUnit]. Опять же, указав жестко закодированное значение пакета (отличное от нуля), первое измерение меток должно точно соответствовать этой длине.

Что такое размер партии?

здесь - интересный ответ, чтобы понять это. Проще говоря, учитывая модель. Следующее позволяет тренировать модель:

model.fit(features, label)

features - это массив объектов, тогда как объект - это один элемент, из которого мы хотим сделать прогноз. Таким образом, размер пакета равен длине этого массива. Первый слой модели может иметь параметры inputShape или batchInputShape или оба, зная, что batchInputShape будет иметь приоритет над inputShape. Когда предоставляется только inputShape, batchInputShape = [null, ... InputShape], что указывает на то, что мы можем подогнать модель к разной длине элементов объекта при условии, что метки имеют одинаковую длину метки, что имеет смысл для метки. быть поставлены для каждой функции.

Следовательно

      inputShape = batchInputShape[1:] // python notation 
      inputShape = batchInputShape.slice(1) // js notation

В любом случае, объект должен иметь ту же форму, что и inputShape.

const model = tf.sequential();
model.add(tf.layers.dense({ units: 10, batchInputShape: [1, 10], activation: "sigmoid" }));
model.add(tf.layers.dense({ units: 1, activation: "softmax" }));
model.summary();
model.compile({ loss: "meanSquaredError", optimizer: "sgd", metrics: ["accuracy"] });


const arr = Array.from({length: 10}, (_, k) => k+1 )
const features =  tf.tensor(arr, [1, 10])
const labels = tf.tensor([1], [1, 1])

logs = await model.fit(features, labels, { batchSize: 1, shuffle: false, verbose: 1 });
console.log(logs)
...