Модель Tensorflow всегда предсказывает одно и то же неверное значение - PullRequest
1 голос
/ 16 мая 2019

Я на самом деле учусь строить машинное обучение в nodejs: для этого я выбираю tenenflow API.Цель этого машинного обучения состоит в том, чтобы ввести 14 записей и вернуть число относительно 14 записей.(Я не могу описать больше контекста, потому что я нахожусь в стажировке, и я не знаю, позволил ли я говорить об этом.) Но модель всегда предсказывает неправильные значения, и я не знаю почему.Я пробовал другую функцию потерь / оптимизатора, конфигурацию модели разных слоев, активацию разных слоев ... но модель всегда дает мне значение с плавающей запятой.

Я пытался заменить значение ввода / вывода на 0,3, прогнозируемое возвращениемне значение от 0,1 до 0,3.(проверено 3 раза).Но значение потерь уменьшается во время тренировок, которые, кажется, работают лучше.

Я также пытался увеличить период обучения до 1000, безрезультатно: /

Прежде всего, я создаю функцию для построения модельной сети.Моя модель имеет входной слой из 14 единиц, затем 2 скрытых слоя по 5 единиц, а затем выходной слой только с одной единицей.(Все слои в «сигмовидной» активации и имеют плотный тип.)

const get_model = async () => {
    const model = tf.sequential();

    const input_layer = tf.layers.dense({
        units: 13,
        inputShape: [14],
        activation: 'sigmoid',
    });
    model.add(input_layer)

    let left = 3;
    while(left >= 2){

        const step_layer = tf.layers.dense({
            units: 5,
            activation: 'sigmoid',
        });
        model.add(step_layer)

        left --;
    }

    const output = tf.layers.dense({
        units: 1,
        activation: 'sigmoid',
    });

    model.add(output)

    model.compile({
        optimizer: tf.train.sgd(0.01),
        loss: tf.losses.absoluteDifference,
        metrics: 'accuracy',
    })

    return model;
}

Чтобы проверить модель, во время поезда я всегда даю список из 13 чисел (все значения равны 100)и я всегда даю следующее значение: 100.

const get_output = () => {
    return 100;
}
const get_input = () => {
    return [
        100,
        100,
        100,
        100,
        100,
        100,
        100,
        100,
        100,
        100,
        100,
        100,
        100,
        100,
    ];
}

У меня есть две функции для преобразования значения в тензорное значение.

const get_input_tensor = (value) => {
    return tf.tensor([value],[1,14])
}
const get_output_tensor = (value) => {
    return tf.tensor(
        [Math.floor(value)],
        [1,1]
    )
}

Затем я получаю модель, я тренирую модельи попробуйте прогноз.

(async () => {
    const model = await get_model();

    let left = 20;
    while(left >= 0){
        const input = get_input();
        const output = get_output();

        await model.fit(get_input_tensor(input),get_output_tensor(output),{
            batchSize: 30,
            epochs: 10,
            shuffle: true,
        });

        left--;
    }

    const input = get_input();

    const output = model.predict(get_input_tensor(input));

    output.print();
})();

Во время обучения значение потери близко к 100. Это подчеркивает, что модель всегда возвращает мне значение, близкое к 1.

Это мойконсоль во время обучения:

Epoch 8 / 10
eta=0.0 ====================================================================> 
11ms 10943us/step - loss=99.14 
Epoch 9 / 10
eta=0.0 ====================================================================> 
10ms 10351us/step - loss=99.14 
Epoch 10 / 10
eta=0.0 ====================================================================> 
12ms 12482us/step - loss=99.14

Затем, когда я пытаюсь сделать прогноз, модель возвращает мне значение, близкое к 1.

Это тензор печати прогноза.

Tensor
     [[0.8586583],]

Можете ли вы мне помочь?Я не знаю, что идет не так.Можно ли иметь прогноз более 1?

Ответы [ 2 ]

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

Я наконец-то решил проблемы!

Мои слои используют следующую активацию: 'sigmoid'. sigmoid - это функция, значения которой находятся в диапазоне от 0 до 1, поэтому я и получаю одинаковые значения. (Активация 'relu' не совсем то, что я ожидаю)

Я установил активацию на «линейную», но эта активация делает значение потерь равным NaN во время обучения, затем я переключил оптимизаторы на Адама, и это решает проблему:)

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

Вот простая модель, которая будет предсказывать 100 из ввода 14 значений.Часто выборка входных значений составляет от 0 до 1. Это улучшает сходимость алгоритмов наискорейшего спуска.

Что касается причины, по которой модель прогнозирует неправильные значения;здесь есть общие ответы здесь

(async () => {
  const model = tf.sequential({
    layers: [tf.layers.dense({units: 1, inputShape: [14], activation: 'relu', kernelInitializer: 'ones'})]
  });
  model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});
  await model.fit(tf.ones([1, 14]), tf.tensor([100], [1, 1]), {epochs: 100})
  model.predict(tf.ones([1, 14])).print();
 })()
<html>
  <head>
    <!-- Load TensorFlow.js -->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"> </script>
  </head>

  <body>
  </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...