Вычислить уравнение с нелинейными данными

Я делаю первые шаги с Tensorflow.js, и мне нужно вычислить уравнение

y = [(x * 100) / a]/100

I.E. учитывая 4 тензора вроде:

[1,1,1,0], [2,2,2,1], [0,0,1,0], [0,2,2,1]

суммы всех значений для каждого тензора будут:

3, 7, 1, 5

суммы этих значений будут:

15

и приведенное выше уравнение будет:

y = [(3 * 100) / 15]/100
y = [(7 * 100) / 15]/100
y = [(1 * 100) / 15]/100
y = [(5 * 100) / 15]/100

поэтому выходной тензор должен быть:

[0.19], [0.44], [0.06], [0.31]

Я создал приведенный ниже код, в котором я пытался обучить модель решению уравнения, но результаты далеки от приемлемых. Я даже попытался создать 60 пар примеров ввода и вывода, увеличив эпохи обучения до 50 тысяч и увеличив количество единиц входного слоя, но результаты кажутся еще хуже. Вы можете мне чем-нибудь помочь? Где я ошибаюсь? Спасибо!

<script>
    async function predictOutput() {

        const model = tf.sequential();
        //config for the hidden layer
        const config_hidden = {
          inputShape:[4],
          activation:'sigmoid',
          units:4
        }
        //config for the output layer
        const config_output = {
          units:1,
          activation:'sigmoid'
        }
        //defining the hidden and output layer
        const hidden = tf.layers.dense(config_hidden);
        const output = tf.layers.dense(config_output);
        //adding layers to model
        model.add(hidden);
        model.add(output);
        //define an optimizer
        const optimize=tf.train.sgd(0.1);
        //config for model
        const config = {
        optimizer:optimize,
        loss:'meanSquaredError'
        }
        //compiling the model
        model.compile(config);

        //Dummy training data
        const x_train = tf.tensor([
        [1,0,0,3], [0,0,3,0], [1,0,0,0], [0,1,0,4],
        [0,0,0,1], [2,0,2,1], [2,4,1,0], [0,2,0,1],
        [1,1,1,0], [2,2,2,1], [0,0,1,0], [0,2,2,1],
        [1,0,0,0], [0,1,0,0], [1,1,1,0], [2,2,2,2],
        [2,5,7,9], [2,1,0,10], [22,5,7,9], [2,0,3,1],
        [1,1,1,1], [2,2,2,2], [0,5,8,1], [5,5,8,1],
        [3,4,1,5], [1,0,3,1], [5,5,1,0], [4,2,6,0],
        [1,0,0,0], [1,1,2,1], [1,3,2,1], [1,2,0,0],
        [1,0,0,2], [0,0,0,7], [0,1,0,0], [5,0,0,0],
        [0,4,0,0], [1,0,7,0], [3,2,8,1], [0,10,9,0]
        ]);

        //Dummy training labels
        const y_train = tf.tensor([
        [0.31], [0.23], [0.08], [0.38],
        [0.07], [0.31], [0.44], [0.18],
        [0.19], [0.44], [0.06], [0.31],
        [0.08], [0.08], [0.23], [0.61],
        [0.27], [0.15], [0.51], [0.07],
        [0.09], [0.18], [0.31], [0.42],
        [0.32], [0.12], [0.27], [0.29],
        [0.07], [0.31], [0.44], [0.18],
        [0.19], [0.44], [0.06], [0.31],
        [0.09], [0.18], [0.31], [0.42]
        ]);

        //Dummy testing data
        const x_test = tf.tensor([
            [1,0,0,1], [0,1,1,0], [2,0,1,2], [0,0,0,1]
        ]);

        // expected result: [0.20], [0.20], [0.50], [0.10]


        await model.fit(x_train, y_train, {
            batchSize: 1,
            epochs: 5000
        });

        // Test the model and display output 
        document.getElementById("output").innerText = model.predict(x_test);
    }
    predictOutput();
</script>

Некоторые моменты, на которые следует обратить внимание: 1) у вас очень мало образцов обучающих данных 2) если вы знаете явную функцию, что вы пытаетесь сделать с ее моделированием с помощью NN? Не пытайтесь грубо ответить на второй вопрос, просто хочу знать, какую проблему вы пытаетесь решить.

IanQ 09.11.2018 20:18

Привет, спасибо за комментарий. 1) Как я писал в вопросе, я сгенерировал 60 пар входов и выходов, но результаты не кажутся лучше. 2) Я уже написал рабочий код без использования Tensorflow, меня просто попросили сделать то же самое с Tensorflow.

ing.gambardella 12.11.2018 09:11
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
144
1

Ответы 1

Если известно линейное уравнение, например, y = 1/15x, то выход можно рассчитать напрямую, используя следующую функцию

const calc = (t) => t.add(tf.scalar(1/15))

Если наклон a и смещение b теперь известны заранее и их необходимо вычислить, можно использовать нейронную сеть персептрона. InputShape модели неверен, поскольку прогноз должен быть сделан для одного значения. Он должен быть [1] вместо 4. Что касается x_test, он должен выглядеть как массив из массива длиной 1, что означает следующее: [[1], [2], [3], [56], [49]]

Также использование меньшей скорости обучения может привести к большей точности.

Обновлено:

Если модель должна предсказывать сумму входных данных, тогда inputShape должен быть [4]. Ваши входные значения малы, и это влияет на потерю ошибок при использовании модели персептрона. Перед тем, как передать данные модели, можно обработать входные значения, умножив, например, на 10. В результате прогноз модели будет в 10 раз больше правильных значений.

const model = tf.sequential()
model.add(tf.layers.dense({inputShape: [4], units: 1 }))
model.add(tf.layers.dense({units: 1}))
const x_train = tf.tensor([
        [1,0,0,3], [0,0,3,0], [1,0,0,0], [0,1,0,4], [0,0,0,1]]);
const y = tf.tensor([
        [0.31], [0.23], [0.08], [0.38],[0.07]
        ]);

const y_train = y.mul(tf.scalar(10))
const optimizer = tf.train.sgd( 0.01 )
model.compile({optimizer: optimizer, loss: 'meanSquaredError' })
model.fit(x_train, y_train, {epochs: 1000, 
      callbacks: {
      onEpochEnd: (epoch, log) => {
        console.info(epoch, log.loss);
        if (epoch === 100 ) {
           model.optimizer.setLearningRate(.001);
        }
      }
    }}).then(() => {
  const y_predict = model.predict(x_train)
  const y_correct = y_predict.div(tf.scalar(10)).print()
})
<html>
  <head>
    <!-- Load TensorFlow.js -->
    <script src = "https://cdn.jsdelivr.net/npm/@tensorflow/[email protected]"> </script>
  </head>

  <body>
  </body>
</html>

Привет, спасибо за ответ. Я уже написал рабочий код, который вычисляет результаты без использования обучения и прогнозирования модели, мне просто нужно сделать это для исследовательских рабочих целей. По вашему ответу я понимаю, что независимо от того, сколько входов я использую для обучения модели и сколько эпох я добавляю в функцию model.fit, прогноз никогда не сработает. Это правильно? Мне нужно, чтобы входная форма была этой формой, потому что я не могу суммировать входные данные до доступа к функции прогнозирования. Мне нужна функция, чтобы понять, что она должна суммировать входные данные, чтобы сделать прогноз.

ing.gambardella 12.11.2018 09:18

@ ing.gambardella, если прогноз должен быть сделан на сумме, тогда inputShape будет 4. Пожалуйста, примите во внимание изменение вопроса. И не забудьте проголосовать за ответ и пометить его как принятый :)

edkeveked 12.11.2018 16:03

Я попытался изменить ваш код, чтобы адаптировать его к моей работе, но он не предсказывает результат правильно. Вход может иметь 5 тензоров, проблема в том, что сумма выходных тензоров всегда должна быть 100. В вашем примере: [0,31], [0,23], [0,08], [0,38], [0,07] = 107 Итак, я удалил последний тензор как из входа, так и из выхода следующим образом: [1,0,0,3], [0,0,3,0], [1,0,0,0], [0,1, 0,4] -> [0,31], [0,23], [0,08], [0,38] Он по-прежнему предсказывает правильный результат, но если я попытаюсь предсказать другой тензор, это не сработает: [1,0,0, 1], [0,1,1,0], [2,0,1,2], [0,0,0,1] -> должно быть: [0.20] [0.20] [0.50] [0.10]

ing.gambardella 13.11.2018 11:34

Другие вопросы по теме