Как добавить изображения в модель tenorflow.js и обучить модель для заданных меток изображений - PullRequest
0 голосов
/ 14 февраля 2019

Мы используем TensorFlow.js для создания и обучения модели.Мы используем функцию tf.fromPixels () для преобразования изображения в тензор.Мы хотим создать пользовательскую модель со следующими свойствами:

AddImage (HTML_Image_Element, 'Label'): добавить элемент imageElement с пользовательской меткой Train () / fit (): обучить эту пользовательскую модель с помощью связанных меток. Predict(): Предсказать изображения с помощью соответствующей метки, и он вернет предсказанный ответ с прикрепленной меткой каждого изображения.Для лучшего понимания давайте рассмотрим пример: допустим, у нас есть три изображения для предсказания, а именно: img1, img2, img3 с тремя метками «A», «B» и «C» соответственно.Итак, мы хотим создать и обучить нашу модель с этими изображениями и соответствующими метками, как показано ниже: Когда пользователь хочет предсказать 'img1', тогда он показывает прогноз 'A', аналогично, для предсказания 'img2' с помощью 'B' и для 'img3'Предсказание с' C '

Пожалуйста, предложите мне, как мы можем создать и обучить эту модель.

This is webpage we used to create a model with images and its associate labels:
 
<apex:page id="PageId" showheader="false">
    <head>
        <title>Image Classifier with TensorFlowJS</title> 
        <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.11.2"></script>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    </head>
    <div id="output_field"></div>
    <img id="imgshow" src="{!$Resource.cat}" crossorigin="anonymous" width="400" height="300" />
    
    <script>
    async function learnlinear(){
        
        
        //img data set
        const imageHTML = document.getElementById('imgshow');           
        console.log('imageHTML::'+imageHTML.src);
        
        //convert to tensor 
        const tensorImg = tf.fromPixels(imageHTML);
        tensorImg.data().then(async function (stuffTensImg){
            console.log('stuffTensImg::'+stuffTensImg.toString());
            
        });
        const model = tf.sequential();
            
        model.add(tf.layers.conv2d({
            kernelSize: 5,
            filters: 20,
            strides: 1,
            activation: 'relu',
            inputShape: [imageHTML.height, imageHTML.width, 3],
        }));
        
        model.add(tf.layers.maxPooling2d({
            poolSize: [2, 2],
            strides: [2, 2],
        }));
        
        model.add(tf.layers.flatten());
        
        model.add(tf.layers.dropout(0.2));
        
        // Two output values x and y
        model.add(tf.layers.dense({
            units: 2,
            activation: 'tanh',
        }));
        
        // Use ADAM optimizer with learning rate of 0.0005 and MSE loss
        model.compile({
            optimizer: tf.train.adam(0.0005),
            loss: 'meanSquaredError',
        });
        await model.fit(tensorImg, {epochs: 500});
        model.predict(tensorImg).print();
    }
    learnlinear();
    </script>
   
</apex:page>

при выполнении фрагмента кода мы получили следующую ошибку: tfjs@0.11.2: 1 Uncaught (в обещании) Ошибка: ошибка при проверке ввода: ожидается, что conv2d_Conv2D1_input имеет 4размеры).но получил массив с формой 300 400,3 при новом t (tfjs@0.11.2: 1) в standardizeInputData (tfjs@0.11.2: 1) в t.standardizeUserData (tfjs@0.11.2: 1) в t.(tfjs@0.11.2: 1) в n (tfjs@0.11.2: 1) в Object.next (tfjs@0.11.2: 1) в tfjs@0.11.2: 1 в новом Promise () в __awaiter $ 15 (tfjs@0.11.2: 1) в t.fit (tfjs@0.11.2: 1)

Эта ошибка возникает при передаче этого примера ошибки

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Вам просто нужно изменить ваши тензорные данные.

Данные, которые вы передали в вашу модель, должны быть на одно измерение больше, чем inputShape.На самом деле predict принимает массив элементов формы InputShape.Количество элементов - размер партии.Поэтому данные вашего изображения должны иметь следующую форму [batchsize, ...inputShape] (используя многоточие для параметра покоя, чтобы указать, что более поздняя часть формы равна значению inputShape)

Поскольку вы тренируетесь только содин элемент (который на самом деле не происходит в действительности), нужно просто использовать размер пакета 1. 1. 1009 *

model.predict(tensorImg.expandDims(0)).print()
0 голосов
/ 14 февраля 2019

TLDR: Вам просто нужно изменить размер данных, используя np.expand_dims() или np.reshape().

Во-первых, давайте сгенерируем некоторый случайный тензор, который имитирует ваш текущий тензорный ввод -

# Some random numpy array
In [20]: x = np.random.random((2,2,4))

In [21]: x
Out[21]: 
array([[[0.8454901 , 0.75157647, 0.1511371 , 0.53809724],
        [0.50779498, 0.41321185, 0.45686143, 0.80532259]],

       [[0.93412402, 0.02820063, 0.5452628 , 0.8462806 ],
        [0.4315332 , 0.9528761 , 0.69604215, 0.538589  ]]])

# Currently your tensor is a similar 3D shape like x
In [22]: x.shape
Out[22]: (2, 2, 4)

Теперь вы можете преобразовать его в 4D-тензор, например, так -

[23]: y = np.expand_dims(x, axis = 3)

In [24]: y
Out[24]: 
array([[[[0.8454901 ],
         [0.75157647],
         [0.1511371 ],
         [0.53809724]],

        [[0.50779498],
         [0.41321185],
         [0.45686143],
         [0.80532259]]],


       [[[0.93412402],
         [0.02820063],
         [0.5452628 ],
         [0.8462806 ]],

        [[0.4315332 ],
         [0.9528761 ],
         [0.69604215],
         [0.538589  ]]]])

In [25]: y.shape
Out[25]: (2, 2, 4, 1)

Вы можете найти np.expand_dims документацию здесь .


РЕДАКТИРОВАТЬ: Вот одна строка

np.reshape(np.ravel(x), (x.shape[0], x.shape[1], x.shape[2], 1)).shape 

Вы можете посмотреть np.reshape документацию здесь .

...