Tensorflowjs: Uncaught (в обещании) TypeError: Невозможно прочитать свойство 'length' из неопределенного - PullRequest
1 голос
/ 01 декабря 2019

Это была самая последняя проблема в моей попытке предварительно обработать изображение, которое я извлекаю из DOM после загрузки страницы. Мы добрались до места, где пользователь может загрузить изображение, и когда они нажимают нашу кнопку, чтобы идентифицировать изображение, он проходит процесс предварительной обработки изображения, которое будет принято в нашей модели, распечатывает значения объекта Tensor и затем, когда онпопадает в строку model.predict, разрывается с ошибкой в ​​заголовке;Uncaught (in promise) TypeError: Cannot read property 'length' of undefined с этим в самом низу;at HTMLDivElement.<anonymous> (main.js:39)

Тем не менее, HTMLDivElement, о котором он говорит, определяется, когда я консоль регистрирую его для проверки работоспособности каждый раз, когда я нажимаю кнопку идентификации;User Image: <img src="data:image/png;base64,..." class="user_pic">

Это мой Тензорный Объект, который напечатан в подробном формате:

Tensor
  dtype: float32
  rank: 4
  shape: [1,200,200,3]
  values:
    [[[[56 , 105, 11 ],
       [53 , 101, 9  ],
       [49 , 97 , 8  ],
       ...,
       [91 , 151, 99 ],
       [92 , 152, 101],
       [91 , 151, 99 ]],

      [[56 , 102, 12 ],
       [52 , 98 , 9  ],
       [48 , 93 , 8  ],
       ...,
       [94 , 154, 103],
       [95 , 155, 104],
       [94 , 154, 103]],

      [[53 , 99 , 11 ],
       [51 , 97 , 11 ],
       [44 , 90 , 7  ],
       ...,
       [92 , 151, 103],
       [93 , 152, 104],
       [94 , 153, 105]],

      ...
      [[21 , 61 , 8  ],
       [21 , 61 , 8  ],
       [21 , 61 , 8  ],
       ...,
       [28 , 88 , 1  ],
       [36 , 93 , 4  ],
       [44 , 99 , 9  ]],

      [[22 , 62 , 9  ],
       [22 , 62 , 9  ],
       [22 , 62 , 9  ],
       ...,
       [29 , 92 , 3  ],
       [29 , 89 , 1  ],
       [40 , 98 , 7  ]],

      [[22 , 62 , 10 ],
       [22 , 62 , 10 ],
       [22 , 62 , 10 ],
       ...,
       [32 , 97 , 7  ],
       [30 , 92 , 3  ],
       [34 , 94 , 4  ]]]]

Другая странная часть, и это то, что я заметил в других уроках, и это работает,заключается в том, что когда я обрабатываю свое тензорное изображение в приемлемом формате, я присваиваю его переменной, но когда эта переменная вызывается позже, это undefined

Полная ошибка ниже:

Uncaught (in promise) TypeError: Cannot read property 'length' of undefined
    at Fm (tfjs@latest:2)
    at e.predict (tfjs@latest:2)
    at e.predict (tfjs@latest:2)
    at HTMLDivElement.<anonymous> (main.js:39)

Мой код ниже

let identify = document.querySelector('.identify')
if (identify) {
    identify.addEventListener('click', async function () {
        event.preventDefault()

        // Just a promise but is the model I need. Checked the layers and it matches up
        const model = await tf.loadLayersModel('model_json')
        console.log('This is your model: ', model)

        let user_pic = document.querySelector('.user_pic')
        console.log('User Image: ', user_pic)

        // Preprocessing is done here as it wasn't working when I saved it to a variable
        prediction = model.predict(
            tf.browser.fromPixels(user_pic).cast('float32').expandDims().print(true), { batchSize: 4 })

        console.log('This is your model: ', model, 'This is your prediction: ', prediction)
    })

Мне любопытно, сталкивались ли другие с этой проблемой и понимали, как ее можно исправить. Я новичок в Tensorflow.js и то, что мне удалось найти, не совсем то, что мне нужно. Если кто-то может помочь, большое спасибо

1 Ответ

1 голос
/ 01 декабря 2019

Вы переходите к model.predict, что возвращается print вместо самого тензора

prediction = model.predict(
    tf.browser.fromPixels(user_pic).cast('float32').expandDims())
...