Skip to content

Instantly share code, notes, and snippets.

@MSavisko
Created February 24, 2023 00:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MSavisko/ad54f4b8578a4b180a923ff70b298741 to your computer and use it in GitHub Desktop.
Save MSavisko/ad54f4b8578a4b180a923ff70b298741 to your computer and use it in GitHub Desktop.
MLP network for predicting y based on x
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import numpy as np
############# Параметри
dots_number = 1000 # Кількість вхідних точок
x_number = 18 # Кількість вхідних параметрів
test_dots_number = 10 # Кількість точок для тестових даних
epochs_number = 1000 # Кількість єпох тренування
############# Визначаємо вхідні та вихідні дани
# Згенеруємо рандомні дані за вхідними параметрами
x_data = np.random.rand(dots_number, x_number)
# Згенеруємо випадкові ваги
w_data = np.random.rand(x_number)
# Обчислимо Y на базі кожного X та W
y_data = np.dot(x_data, w_data.reshape(x_number, 1))
# Визначаємо тестові дані та очікувані вихідні дані
x_new = np.random.rand(test_dots_number, x_number)
expected_new_y = np.dot(x_new, w_data.reshape(x_number, 1))
# Описуємо параметри моделі
input_dim = x_number
hidden_dim = x_number
output_dim = 1
# placeholder використовуються для визначення вхідних даних для обчислювального графа.
# Вони використовуються для зберігання вхідних і цільових даних під час процесу навчання.
x = tf.placeholder(tf.float32, [None, input_dim])
y = tf.placeholder(tf.float32, [None, output_dim])
# Визначаємо ваги та зміщення для кожного шару
W1 = tf.Variable(tf.random.normal([input_dim, hidden_dim]))
b1 = tf.Variable(tf.random.normal([hidden_dim]))
W2 = tf.Variable(tf.random.normal([hidden_dim, output_dim]))
b2 = tf.Variable(tf.random.normal([output_dim]))
# У наведеному коді hidden_layer - це тензор, який представляє вихід першого прихованого
# шару MLP-моделі. Його отримують множенням вхідних даних x на вагову матрицю W1,
# додаванням до результату вектора зсуву b1, а потім застосуванням функції активації ReLU.
#
# Зокрема, вираз tf.matmul(x, W1) + b1 обчислює зважену суму вхідних даних з вагами
# першого прихованого шару, а tf.nn.relu застосовує функцію активації ReLU до результату
# поелементно. Вихід цього шару потім передається до вихідного шару моделі шляхом обчислення
# точкового добутку між прихованим_шаром і вагами W2 вихідного шару та додаванням зміщення
# b2 до результату. Це представлено виразом tf.matmul(hidden_layer, W2) + b2, який
# обчислює лінійне перетворення вхідних даних у простір вихідного шару.
#
# Результуючий тензор y_pred представляє прогнозовані значення вихідної змінної для
# заданих вхідних даних.
hidden_layer = tf.nn.relu(tf.matmul(x, W1) + b1)
# y_pred = tf.matmul(hidden_layer, W2) + b2
y_pred = tf.reduce_sum(tf.matmul(hidden_layer, W2) + b2, axis=-1)
# Вибір квадратичної різниці як функції втрат є поширеним в задачах регресії,
# оскільки вона підкреслює великі помилки і карає викиди сильніше, ніж лінійна різниця.
# Середньоквадратична похибка (MSE) є специфічною формою цієї функції втрат,
# яка широко використовується в задачах регресії.
loss = tf.reduce_mean(tf.square(y_pred - tf.reduce_sum(y, axis=-1)))
# Оптимізатор оновлює ваги в напрямку від'ємного градієнта функції втрат відносно ваг,
# що допомагає мінімізувати втрати і підвищити точність моделі.
# Швидкість навчання, яка в цьому прикладі дорівнює 0.01, визначає розмір кроку,
# який робить оптимізатор у напрямку від'ємного градієнта.
optimizer = tf.train.GradientDescentOptimizer(0.01)
train_op = optimizer.minimize(loss)
# Тренуємо модель
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(epochs_number):
_, loss_val = sess.run([train_op, loss], feed_dict={x: x_data, y: y_data})
if i % 100 == 0:
print("Крок %d, втрати = %f" % (i, loss_val))
# Визначаємо ваги
W1_val = W1.eval()
b1_val = b1.eval()
W2_val = W2.eval()
b2_val = b2.eval()
# Використовуємо навчену модель для прогнозування на основі нових даних
y_pred_val = sess.run(y_pred, feed_dict={x: x_new})
# Виводимо результат для порівняння
from prettytable import PrettyTable
y_table = PrettyTable()
y_table.title = "Результати прогнозування Y"
y_table.field_names = ["Прогноз Y", "Очікуваний Y"]
for i, number in enumerate(y_pred_val):
y_table.add_row([number, expected_new_y[i][0]])
print("")
print(y_table)
weights_table = PrettyTable()
weights_table.title = "Порівнянн вагів"
weights_table.field_names = ["Задані ваги", "Натреновані ваги, шар"]
for i, number in enumerate(w_data):
weights_table.add_row([number, b1_val[i]])
print("")
print(weights_table)
print("\nНатреновані ваги, шар 2:")
print(b2_val)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment