Есть следующий код на Python (используются библиотеки numpy и OpenCV), так же у меня есть по 100 фотографий котов и собак в папках для обучения. Я достаю фото из функции load_images, складывая их в общий массив. По итогу получаю массив из 200 фотографий размера IMG_SIZE на IMG_SIZE пикселей, где каждый элемент - яркость пикселя от 0 до 1, тоесть фотографии достаются верно. Посмотрев кучу видосов на эту тему, я нашёл алгоритм для прямого распространения и обратного, однако ничего из этого не было заточено под фотографии.
СУТЬ ПРОБЛЕМЫ: На выходе из forward (прямого распространения) я ожидаю увидеть число от 0 до 1, которое означает вероятность того, собака это или кошка. Однако у меня на выходе всегда одно и то же число, а именно 0.05. Проблема в том, что оно всегда такое, неважно, какие веса и смещения я беру, оно не меняется, хотя должно, в этом и суть программы (веса и смещения с каждым запуском новое)
Возможные полезные данные: output_hidden_layer_sum выдаёт мне матрицу 100 на 2, формата
[
[842.23323, 728.932],
[592.25123, 582.232],
...
[392.1233, 369.231],
[203/23, 240.2312],
]
Меня смущают немного такие большие числа, с учётом того, что изначально было от 0 до 1 матрица, и матрица, где числа не превышали 10, но полагаю я всё сделал правильно.
Надеюсь на вашу помощь, уже 2 дня парюсь, заранее спасибо
import numpy as np
import cv2
import os
IMG_SIZE = 100
learning_rate = 0.1
# Задаем размеры слоев
input_layer_size = IMG_SIZE
hidden_layer_size = IMG_SIZE * 2
output_layer_size = 2
# Задаём веса и смещения
W1 = np.random.rand(input_layer_size, hidden_layer_size)
B1 = np.random.rand(hidden_layer_size)
W2 = np.random.rand(hidden_layer_size, output_layer_size)
B2 = np.random.rand(output_layer_size)
def load_images():
images = []
labels = []
cat_folder_path = os.path.join('pets', 'cat')
dog_folder_path = os.path.join('pets', 'dog')
def get_images(path, answer):
for i in range(100):
file_path = os.path.join(path, f'{i}.jpg')
image = cv2.imread(file_path)
image = cv2.resize(image, (IMG_SIZE, IMG_SIZE))
image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
image = image / 255.0
images.append(image)
labels.append(answer)
get_images(cat_folder_path, 1)
get_images(dog_folder_path, 0)
return np.array(images), np.array(labels)
def relu(x):
return np.maximum(x, 0)
def softmax(x):
x = normalize(x)
exp_x = np.exp(x)
res = exp_x / np.sum(exp_x)
return res
def normalize(x):
x_norm = np.linalg.norm(x)
x_normalized = x / x_norm
return x_normalized
def forward(image):
hidden_layer_sum = image @ W1 + B1
activated_hidden_layer = relu(hidden_layer_sum)
output_hidden_layer_sum = activated_hidden_layer @ W2 + B2
result = softmax(output_hidden_layer_sum)
return np.mean(result)
def train(image, answer, num_epochs):
y_pred = forward(image)
print(y_pred)
images, answers = load_images()
train(images[0], answers[0], 1)