第一个形状参数应该为空,但不允许

first shape parameter should be null,but it's not allowed

我有这个型号:

这是一个可以检测面部情绪的转换层, 我尝试在我的 TensorFlowJS 上实现它,所以我转换了它,当我尝试输入一个输入时,它需要一个以 null 作为第一个输入的 4d 张量, 但 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]);
  };

编辑:这是我的预测函数:

const trypredict = async () => {
    try {
      let image = require("../assets/smile.jpg");
      image = tf.browser
        .fromPixels(image)
        .mean(2)
        .toFloat()
        .expandDims(0)
        .expandDims(-1);
      const imageAssetPath = Image.resolveAssetSource(image);
      const response = await fetch(imageAssetPath.uri, {}, { isBinary: true });
      const imageData = await response.arrayBuffer();

      let imageTensor = imageToTensor(imageData);
      imageTensor = imageTensor.resizeBilinear([48, 48]);
      if (model) {
        const prediction = await model.predict(imageTensor);
      }
    } catch (error) {
      console.log(error);
    }
  };

您需要将张量的大小从 [1,560, 617,3] 调整为 [null,48,48,1]

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

方法一

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

方法二

或者更简单的方法是使用 cameraWithTensor 并立即调整张量的大小。您可以使用以下方法执行此操作,然后您只需将其重塑为 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>

然后你可以将它重塑为 4D 张量:

image = image.reshape(1,48,48,1)

Here is a code example using cameraWithTensor with detailed code for it