#tensorflow #keras #tensorflow.js
#tensorflow #keras #tensorflow.js
Вопрос:
У меня есть эта модель:
Который представляет собой слой 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]);
};
РЕДАКТИРОВАТЬ: это моя функция прогнозирования :
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. Не могли бы вы распечатать форму тензора, когда он выходит из функции выше? Также используете ли вы это в приложении react native?
2. Я думаю, вы совершенно неправильно поняли мой ответ на ваш другой вопрос, здесь нет, это означает, что это может быть любое значение, а не то, что оно должно быть нулевым. В вашем случае использование 1 полностью подходит, и это предполагаемое правильное значение!
3. @Dr.Snoopy вот что происходит, когда я это делаю: ошибка при проверке: ожидаемый conv2d_8_input должен иметь форму [null,48,48,1], но получил массив с формой [1,560,617,3] .
4. @yuRa ошибка вроде как показывает форму, ее в react native: Ошибка при проверке: ожидаемый conv2d_8_input должен иметь форму [null,48,48,1], но получил массив с формой [1,560,617,3] . что вы думаете?
5. Изображение должно быть 48×48 с одним каналом, в то время как ваше изображение 560×617 с тремя каналами, вам нужно изменить размер изображения и преобразовать в оттенки серого. Ошибка не имеет ничего общего с первым измерением.
Ответ №1:
Вам нужно изменить размер тензора с [1,560, 617,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
Или более простым способом было бы использовать 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)
Вот пример кода с использованием cameraWithTensor с подробным кодом для него
Комментарии:
1. спасибо за помощь, но что касается первого метода, когда мне нужно преобразовать его в оттенки серого, сразу после того, как я извлек фотографию? поскольку я получаю эту ошибку: пиксели, передаваемые в tf.browser.fromPixels(), должны быть либо HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData в браузере, либо OffscreenCanvas, ImageData в webworker, либо {data: Uint32Array, width: number, height: number} , но это число, я передаю ему изображениечто я требовал
2. Я добавил код в свой исходный пост, так что будет понятнее