Tensorflow 第一个形状参数应为null,但它为';这是不允许的
我有这个模型: 这是一个conv层,用来检测面部情绪, 我尝试在我的TensorFlowJS上实现它,所以我转换了它,当我尝试输入一个输入时,它需要一个4d张量,第一个输入为null, 但tensor4d不允许: 形状应该只是一个数字,但当我尝试将其添加到模型中时,它会要求null,我该怎么办? 这是我将jpg转换为张量的函数: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
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)