Tensorflow 第一个形状参数应为null,但它为';这是不允许的

Tensorflow 第一个形状参数应为null,但它为';这是不允许的,tensorflow,keras,tensorflow.js,Tensorflow,Keras,Tensorflow.js,我有这个模型: 这是一个conv层,用来检测面部情绪, 我尝试在我的TensorFlowJS上实现它,所以我转换了它,当我尝试输入一个输入时,它需要一个4d张量,第一个输入为null, 但tensor4d不允许: 形状应该只是一个数字,但当我尝试将其添加到模型中时,它会要求null,我该怎么办? 这是我将jpg转换为张量的函数: const imageToTensor = (rawData: ArrayBuffer) => { const { width, height, da

我有这个模型:

这是一个conv层,用来检测面部情绪, 我尝试在我的TensorFlowJS上实现它,所以我转换了它,当我尝试输入一个输入时,它需要一个4d张量,第一个输入为null, 但tensor4d不允许:

形状应该只是一个数字,但当我尝试将其添加到模型中时,它会要求null,我该怎么办? 这是我将jpg转换为张量的函数:

const imageToTensor = (rawData: ArrayBuffer) => {
    const { width, height, data } = jpeg.decode(rawData, true);
    const buffer = new Uint8Array(width * height * 3);
    let offset = 0;
    for (let i = 0; i < buffer.length; i += 3) {
      buffer[i] = data[offset]; //red
      buffer[i + 1] = data[offset + 1]; //green
      buffer[i + 2] = data[offset + 2]; //blue
      offset += 4; //skips Alpha value
    }
      //instead of 1 I need null, but wont let me -----
    return tf.tensor4d(buffer, [1, height, width, 3]);
  };

您需要将张量从
[1560617,3]
调整为
[null,48,48,1]

但您的模型采用灰度图像,因此您需要首先将其从RGB转换为灰度:

方法1

tf.browser.fromPixels(image)
    .mean(2)
    .toFloat()
    .expandDims(0)
    .expandDims(-1)
然后你可以调整它的大小

第二个参数的数组表示
[newHeight,newWidth]

张量是要调整为新形状(即灰度图像)的张量

 const alignCorners = true;
 const imageResize = tf.image.resizeBilinear(
          tensor,
          [48, 48],
          alignCorners
        );
方法2

或者更简单的方法是立即使用张量并调整其大小。您可以使用以下方法执行此操作,然后只需将其重塑为4D张量:

return <View>
      <TensorCamera
       // Standard Camera props
       style={styles.camera}
       type={Camera.Constants.Type.front}
       // Tensor related props
       cameraTextureHeight={textureDims.height}
       cameraTextureWidth={textureDims.width}
       resizeHeight={48}
       resizeWidth={48}
       resizeDepth={1}
       onReady={this.handleCameraStream}
       autorender={true}
      />
    </View>
image = image.reshape(1,48,48,1)

当张量从上述函数中导出时,您能打印出它的形状吗?你在react原生应用程序中也使用了这个吗?我想你完全误解了我对你另一个问题的回答,这里没有。这意味着它可以是任何值,而不是它必须为null。在您的情况下,使用1是完全正确的,它是预期的正确值@史努比博士,当我这么做时会发生这样的情况:检查时出错:预期conv2d_8_输入有形状[null,48,48,1],但得到了形状为[156017,3]的数组。@yuRa错误有点显示形状,它的反应本机:检查时出错:预期conv2d_8_输入有形状[null,48,48,1],但得到了形状为[156017,3]的数组。你认为呢?图像必须是48x48,有一个通道,而图像是560x617,有三个通道,你需要调整图像大小并转换为灰度。这个错误与第一个维度无关。谢谢你的帮助,但是关于第一个方法,我什么时候需要将它转换为灰度,就在我获取照片之后?因为我得到了这个错误:传递给tf.browser.fromPixels()的像素必须是浏览器中的HTMLVideoElement、HTMLIAGEElement、HTMLCanvasElement、ImageData或OffscreenCavas、webworker中的ImageData或{data:UINT32数组,宽度:数字,高度:数字},但为数字,我把我需要的图片传给了它。我把代码添加到了我原来的帖子中,这样会更清晰
image = image.reshape(1,48,48,1)