第一个形状参数应该为空,但不允许
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
我有这个型号:
这是一个可以检测面部情绪的转换层,
我尝试在我的 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