Created
February 24, 2023 00:34
-
-
Save MSavisko/ad54f4b8578a4b180a923ff70b298741 to your computer and use it in GitHub Desktop.
MLP network for predicting y based on x
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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