первый параметр формы должен быть нулевым, но это недопустимо

#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. Я добавил код в свой исходный пост, так что будет понятнее