Я - самообучающаяся нейронная сеть, и я начинаю с перцептрона, и я внедряю ее с нуля, используя python и обучая модель с помощью данных рака молочной железы из sklearn, но средние затраты на модели для каждой эпохи / итерации не сходятся к нулю и сохраняются.средняя постоянная стоимости, и модель не предсказывает правильно, как ожидалось.
Я пытаюсь использовать метод сигмоидного и стохастического градиентного спуска на нем, и я обнаружил, что в Интернете есть немного ресурсов, которые пробуют то, что япытаюсь сейчас (извините, если есть еще что-то, чего я не знаю).
Вот код модуля перцептрона:
import numpy
class Perceptron:
value = 0.0
total_sum = 0.0
def __init__(self, inputs, weights):
self.total_sum = inputs * weights[1:] + weights[0]
self.value = 1 / (1 + numpy.exp(-self.total_sum))
def sigmoid_derivative_of_intercept(sigmoid_value):
return sigmoid_value * (1 - sigmoid_value)
def sigmoid_derivative_of_slope(input_x, total_sum, sigmoid_value):
return input_x.sum() * numpy.exp(-total_sum) * sigmoid_value**2
Пояснения к этим производным
assumed cost function of the perceptron is (target - predict) = c(w, b)
let sum(wx + b) = total_sum
let weight[0] += learning_rate * -d(c)/d(b)
let weights[1:] += learning_rate * -d(c)/d(w)
let predict = 1 / (1 + e^(-total_sum))
d(c)/d(b)
= d(target - predict)/d(b)
= -d(predict)/d(b)
= -d(1 / (1 + e^(-total_sum)))/d(b)
= -e^(-total_sum) / (1 + e^(-total_sum))^2
= -predict * (1 - predict)
the part where predict * (1 - predict) is for the intercept or bias and minus sign are already cancle out with the weight update formula
d(c)/d(w)
= -d(predict)/d(w)
= -d(1 / (1 + e^(-total_sum)))/d(w)
= -d(1 / (1 + e^(-sum(wx + b))))/d(w)
= -sum(x)e^(-total_sum) / (1 + e^(-total_sum))^2
= -sum(x) * e^(-total_sum) * predict^2
Процесс подбора
import numpy
import pandas
import matplotlib
imoprt sklearn.datasets as sklearn_datasets
import sklearn.preprocessing as sklearn_preprocessing
# the module or the percetron class above
import perceptron.core as perceptron_core
dataset = sklearn_datasets.load_breast_cancer()
training_data_len_as_percentage = 80
training_data_len = training_data_len_as_percentage * dataset.data.shape[0] / 100
training_data = sklearn_proprocessing.minmax_scale(dataset.data[:training_data_len])
training_target = dataset.target[:training_data_len]
threshold = 10000
bias = 1.0
learning_rate = 0.01
weights = numpy.random.uniform(low=0.0, high=1.0, size=(training_data_len + 1))
average_errors = []
for _ in range(threshold):
total_error_in_one_epoch = 0.0
# NOTE: for stochastic gradient descent
# the method saids to update weight each training data
for n in range(training_data_len):
predict = perceptron_core.Perceptron(training_data[n], weights)
error = training_target[n] - predict.value
total_error_in_one_epoch += error
weights[0] += learning_rate * perceptron_core.sigmoid_derivative_of_intercept(predict.value)
weights[1:] += learning_rate * perceptron_core.sigmoid_derivative_of_slope(training_data[n], predict.total_sum, predict.value)
average_errors.append(total_error_in_one_epoch / training_data_len)
График средней стоимости выглядит следующим образом:
Прогноз был неверным.Для остальных данных в качестве тестового набора все прогнозы предсказывают одно и то же значение.