2 votes

Erreur lors de la vérification de la cible : on s'attendait à ce que dense_Dense2 ait la forme x, mais on a obtenu un tableau avec la forme y

Ce sont mes premiers pas dans le tensorflow.

Idée

Il existe un certain modèle de nombres (le tableau de nombres) : Pattern = number[] ). Et la catégorie qui correspond à ce modèle (le nombre de 0 à 2 : Category = 0 | 1 | 2 ). J'ai suivi les données de la structure : xs = Pattern[] , ys = Category[] .

Par exemple :

xs = [[1, 2, 3, 4], [5, 6, 7, 8], ..., [9, 10, 11, 12]];
ys = [1, 0, ..., 2];

Je veux que le réseau neuronal trouve une correspondance entre xs[0] y xy[0] et ainsi de suite. Je veux passer les données du réseau neuronal comme suit [1, 2, 3, 4] et obtenir un résultat proche de 1 .

model.predict(tf.tensor([1, 2, 3, 4])) // 1

Mon code

import * as tf from '@tensorflow/tfjs';
require('@tensorflow/tfjs-node');

const xs = tf.tensor2d([
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9, 10, 11, 12],
]);
const ys = tf.tensor1d([0, 1, 2]);

const model = tf.sequential();
model.add(tf.layers.dense({ units: 4, inputShape: xs.shape, activation: 'relu' }));
                                   ^ - Pattern length, it is constant
model.add(tf.layers.dense({ units: 3, activation: 'softmax' }));
model.compile({ optimizer: 'adam', loss: 'categoricalCrossentropy', metrics: ['accuracy'] });

model.fit(xs, ys, { epochs: 500 });

Je reçois l'erreur suivante :

Erreur lors de la vérification de l'entrée : on s'attendait à ce que l'entrée dense_Dense1 ait 3 dimension(s). mais on a obtenu un tableau de forme 3,4

Je ne comprends pas comment expliquer ma structure de données pour le réseau neuronal.

2voto

edkeveked Points 4260

Le modèle inputShape est [3,4] . Pour s'ajuster ou prédire avec ce modèle, il a besoin d'une donnée de la forme [b, 3, 4] où b est la forme du lot. La forme du lot est manquante lorsque vous essayez d'ajuster votre modèle avec xs .

Le modèle inputShape devrait plutôt être [4] afin que xs puisse être utilisé pour la prédiction. Au lieu d'utiliser xs.shape il pourrait être xs.shape.slice(-1) .

const xs = tf.tensor2d([
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9, 10, 11, 12],
]);
const ys = tf.tensor1d([0, 1, 2]);

const model = tf.sequential();
model.add(tf.layers.dense({ units: 4, inputShape: xs.shape.slice(1), activation: 'relu' }));

model.add(tf.layers.dense({ units: 3, activation: 'softmax' }));
model.compile({ optimizer: 'adam', loss: 'categoricalCrossentropy', metrics: ['accuracy'] });

model.fit(xs, ys);
model.predict(xs).print()

Par ailleurs, si le but du modèle est de prédire une catégorie comme l'indique l'utilisation de softmax y categoricalCrossentropy alors, l'étiquette doit être codée à un coup.

Réponses similaires :

0voto

Igor Points 244

J'ai trouvé la bonne solution pour ma tâche. Il suffit d'utiliser le dataset

https://js.tensorflow.org/api/latest/#tf.Sequential.fitDataset

import * as tf from '@tensorflow/tfjs';
require('@tensorflow/tfjs-node');

const xArray = [
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9, 10, 11, 12],
];

const yArray = [0, 1, 2];
const { length } = yArray;

const xs = tf.data.array(xArray);
const ys = tf.data.array(yArray);

const xyDataset = tf.data.zip({ xs: xDataset, ys: yDataset }).batch(length).shuffle(length);

const model = tf.sequential();
model.add(tf.layers.dense({ units: length, inputShape: [length], activation: 'relu' }));
model.add(tf.layers.dense({ units: 3, activation: 'softmax' }));
model.compile({ optimizer: 'adam', loss: 'categoricalCrossentropy', metrics: ['accuracy'] });

model.fitDataset(xyDataset, { epochs: 500 });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X