@MisCam

Как настроить нейронную сеть на python?

Есть следующий код на 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)
  • Вопрос задан
  • 143 просмотра
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
Почему ты делаешь np.mean(result)?
Если я верно помню, softmax-слой даст наибольший отклик в элементе, соответствующем выбранному классу. Т.е. нужно сделать argmax по этому слою, чтобы узнать ответ сети.

P.S.: обалдеть, я и не знал что в питоне есть оператор @.
Ответ написан
@AlexSku
не буду отвечать из-за модератора
Попробуйте примеры PyTorch, мне кажется, там понятнее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы