Модель не учится - PullRequest
       44

Модель не учится

1 голос
/ 02 мая 2019

Я пытаюсь обучить модель Tensor-flow js на изображениях, поступающих с моей веб-камеры. В основном я пытаюсь воссоздать игру с тензорным потоком pac-man. Модель не сходится и практически бесполезна после тренировки. Я чувствую, как я готовлю данные.

Захват изображения с холста

function takePhoto(label) {
  let canv = document.getElementById("canv")
  let cont = canv.getContext("2d")
  cont.drawImage(video, 0, 0, width, height)

  let data = tf.browser.fromPixels(canv, 3)
  data.toFloat().div(tf.scalar(127)).sub(tf.scalar(1))
  return data
}

function addExample(label){
      let data = takePhoto()

      addData(train_data => train_data.concat(data))
      addLabel(train_labels => train_labels.concat(labels[label]))
    }

Функция поезда

export async function train_model(image,label){
    let d = tf.stack(image)

    let l = tf.oneHot(tf.tensor1d(label).toInt(),4)

    let data = await model.fit(d,l,{epochs:10,batchSize:label[0].length,callbacks:{
        onBatchEnd: async  (batch, logs) =>{ 
            console.log(logs.loss.toFixed(5))
        }
    }})
    return data
}

Модель

export function buildModel(){
    model = tf.sequential({layers:[ 
        tf.layers.conv2d({inputShape:[width,height,3],
                            kernelSize:3,
                            filters:5, 
                            activation :"relu"}),
        tf.layers.flatten(),
        tf.layers.dense({units:128, activation:"relu",useBias:true}),
        tf.layers.dense({units:32, activation:"relu"}),
        tf.layers.dense({units:4, activation:"softmax"})
    ]})
    model.compile({metrics:["accuracy"], loss:"categoricalCrossentropy", optimizer:"adam",learningRate:.00001})
    console.log(model.summary())
}

Предсказание

export async function predict(img){

    let pred = await tf.tidy(() => {

        img = img.reshape([1,width,height, 3]);

        const output = model.predict(img);

        let predictions = Array.from(output.dataSync());
        return predictions
    })
    return pred
}

Обратный вызов печатает потери, но они не сходятся ни к чему, и прогнозы далеко (случайные)

1 Ответ

1 голос
/ 02 мая 2019

Правильно ли использована модель?

Первый вопрос, который нужно задать, - это правильная модель.Модель вопроса использует смесь сверточного и плотного слоев.Но модель на самом деле не следует структуре CNN, тогда как сверточные слои всегда следуют за пулами.Это причина, почему модель не учится?Не обязательно ...

В задачах классификации существуют разные способы классификации изображений, каждое из которых имеет свои плюсы и минусы.FCNN не достигает хорошей точности, CNN делает.Но обучение модели CNN может быть дорогостоящим для вычислений.Именно здесь в игру вступает трансферное обучение.

Пример pacman использует трансферное обучение.Поэтому, если вы хотите повторить пример, попробуйте выполнить код github примера tfjs.Модель здесь использует только один сверточный слой.На официальном веб-сайте tenorflow есть хорошие учебные пособия по написанию сетей CNN и моделей с обучением на передаче .


Сколько данныхВы использовали для обучения своей модели?

Для моделей глубокого обучения в целом требуется много данных.Поэтому, если модель не увидела много изображений с надписью, не удивительно, если ее точность будет очень низкой.Сколько данных требуется, это в основном вопрос искусства и дизайна, а не науки.Но общее практическое правило: чем больше данных, тем лучше модель для прогнозирования.


Модель настройки

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

Следует отметить, что в объекте, передаваемом в качестве параметра model.compile

, отсутствует такая вещь, как learning rate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...