Создать нейросеть на чистом Python вполне возможно, и это отличный способ глубже понять, как работают алгоритмы машинного обучения. Хотя библиотеки, такие как TensorFlow и PyTorch, сильно упрощают процесс, реализация нейросети с нуля поможет вам лучше понять архитектуру, математические принципы и этапы обучения.
### Шаги для создания нейросети на чистом Python:
1. **Определить архитектуру нейросети:**
- Количество входных нейронов (размер входных данных).
- Количество скрытых слоёв и нейронов в них.
- Количество выходных нейронов (зависит от задачи, например, 1 для регрессии или n для классификации на n классов).
2. **Инициализация весов:**
- Весовые коэффициенты (weights) и смещения (biases) должны быть инициализированы случайным образом или с использованием других методов (например, He или Xavier).
3. **Функция активации:**
- Реализуйте функции активации, такие как ReLU, сигмоиду или tanh, а также их производные для вычисления градиента.
4. **Прямое распространение (forward propagation):**
- Реализуйте функцию для вычисления выходного значения нейросети на основе входных данных.
5. **Функция потерь (loss function):**
- Определите функцию потерь, например, среднеквадратическую ошибку (MSE) или кросс-энтропию для классификационных задач.
6. **Обратное распространение (backpropagation):**
- Вычислите градиенты весов и смещений на основе правила цепочки.
- Обновите веса с использованием оптимизационных алгоритмов, например, стохастического градиентного спуска (SGD).
7. **Обучение нейросети:**
- Напишите цикл обучения, который будет повторять прямое и обратное распространение для каждого батча данных.
8. **Тестирование и валидация:**
- Проверьте обученную сеть на тестовых данных и оцените её точность.
### Пример: Простая однослойная нейросеть на Python import numpy as np
# Сигмоида и её производная
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return x * (1 - x)
# Инициализация данных
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) # Входные данные
y = np.array([[0], [1], [1], [0]]) # Целевые значения
# Инициализация весов
input_layer_neurons = 2
hidden_layer_neurons = 2
output_neurons = 1
weights_input_hidden = np.random.uniform(size=(input_layer_neurons, hidden_layer_neurons))
weights_hidden_output = np.random.uniform(size=(hidden_layer_neurons, output_neurons))
bias_hidden = np.random.uniform(size=(1, hidden_layer_neurons))
bias_output = np.random.uniform(size=(1, output_neurons))
# Гиперпараметры
learning_rate = 0.5
epochs = 10000
# Обучение
for epoch in range(epochs):
# Прямое распространение
hidden_layer_input = np.dot(X, weights_input_hidden) + bias_hidden
hidden_layer_output = sigmoid(hidden_layer_input)
output_layer_input = np.dot(hidden_layer_output, weights_hidden_output) + bias_output
predicted_output = sigmoid(output_layer_input)
# Вычисление ошибки
error = y - predicted_output
# Обратное распространение
d_predicted_output = error * sigmoid_derivative(predicted_output)
error_hidden_layer = d_predicted_output.dot(weights_hidden_output.T)
d_hidden_layer = error_hidden_layer * sigmoid_derivative(hidden_layer_output)
# Обновление весов и смещений
weights_hidden_output += hidden_layer_output.T.dot(d_predicted_output) * learning_rate
weights_input_hidden += X.T.dot(d_hidden_layer) * learning_rate
bias_output += np.sum(d_predicted_output, axis=0, keepdims=True) * learning_rate
bias_hidden += np.sum(d_hidden_layer, axis=0, keepdims=True) * learning_rate
if epoch % 1000 == 0:
print(f"Epoch {epoch} - Error: {np.mean(np.abs(error))}"
# Результат
print("Final predicted output:"
print(predicted_output)