Я делаю первые шаги с 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) Как я писал в вопросе, я сгенерировал 60 пар входов и выходов, но результаты не кажутся лучше. 2) Я уже написал рабочий код без использования Tensorflow, меня просто попросили сделать то же самое с Tensorflow.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если известно линейное уравнение, например, 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, если прогноз должен быть сделан на сумме, тогда inputShape будет 4. Пожалуйста, примите во внимание изменение вопроса. И не забудьте проголосовать за ответ и пометить его как принятый :)
Я попытался изменить ваш код, чтобы адаптировать его к моей работе, но он не предсказывает результат правильно. Вход может иметь 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]
Некоторые моменты, на которые следует обратить внимание: 1) у вас очень мало образцов обучающих данных 2) если вы знаете явную функцию, что вы пытаетесь сделать с ее моделированием с помощью NN? Не пытайтесь грубо ответить на второй вопрос, просто хочу знать, какую проблему вы пытаетесь решить.