检查目标时发生错误:预期density_Dense2的形状为x,但数组的形状为y

时间:2020-09-20 06:11:01

标签: tensorflow tensorflow2.0 tensorflow.js

这是我在张量流中的第一步。

想法

有一些数字模式(数字数组:Pattern = number[])。以及与此模式相对应的类别(从0到2的数字:Category = 0 | 1 | 2)。我遵循以下结构数据:xs = Pattern[]ys = Category[]

例如:

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

我希望神经网络在xs[0]xy[0]之间找到匹配项,依此类推。我想传递像[1, 2, 3, 4]这样的神经网络数据,并得到接近1的结果。

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

我的代码

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 });

我收到关注错误:

检查输入时出错:预期density_Dense1_input具有3个维度。但是得到了形状为3,4的数组

我不明白如何解释神经网络的数据结构。

2 个答案:

答案 0 :(得分:2)

模型inputShape是[3,4]。为了适合该模型或对其进行预测,它需要格式为[b, 3, 4]的数据,其中b是批生产形状。尝试使用xs拟合模型时,批次形状丢失。

模型inputShape应该为[4],以便可以将xs用于预测。可以使用xs.shape代替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()

此外,如果模型的目标是预测使用softmaxcategoricalCrossentropy所指示的类别,则标签应进行一次热编码。

类似的答案:

答案 1 :(得分:0)

我找到了适合我任务的解决方案。 只需使用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 });

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

{{1}}