#python #machine-learning #deep-learning #neural-network #prediction
#python #машинное обучение #глубокое обучение #нейронная сеть #прогнозирование
Вопрос:
Я пытаюсь создать сеть ANN для прогнозирования (т. Е. Не просто классифицировать на 0 или 1).
Мой код выглядит следующим образом:
import os
import pandas as pd
import numpy as np
from sklearn import preprocessing
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
data = pd.read_csv('ANNData.csv', skiprows=0, usecols=(1,2,3,4,5,6,7,8,9,11)) #importing data
data.interpolate(axis=0, method='linear', inplace=True) #interpolates = fills in missing values
data=data.values #converts to array
#scaling the data
min_max_scaler = preprocessing.MinMaxScaler()
scaled_data = min_max_scaler.fit_transform(data)
inputs=scaled_data[:,0:8]
output=scaled_data[:,8]
output = output.reshape(1095,1)
def sigmoid(x):
return 1/(1 (np.exp(-x)))
def sigmoid_der(x):
return (sigmoid(x)*(1-sigmoid(x)))
X_train, X_test, y_train, y_test = train_test_split(inputs, output, test_size=0.2)
synaptic_weights=2*np.random.random((8,1))-1
for iteration in range(10000):
input_layer= X_train
outputs = sigmoid(np.dot(input_layer, synaptic_weights))
error = outputs-y_train
adjustments = error*sigmoid_der(outputs)
synaptic_weights =np.dot(input_layer.T, adjustments)
print(outputs)
Для моего результата я получаю все единицы. Чтобы представить в перспективе, первые 5 выходных данных для данных y_train являются
[0.69083156]
[0.07889126]
[0.3880597 ]
[0.3880597 ]
[0.23240938]
Я должен упомянуть, что когда я запускаю код для одной итерации, я получаю результат, который имеет смысл. Когда итераций 2 или более, я получаю массив всех единиц.
т.е.
[1.]
[1.]
[1.]
[1.]
Есть предложения? Или это единственное решение для добавления дополнительных слоев?
Комментарии:
1. Является ли sigmoid_der производной от sigmoid? Если да, вы уверены, что это правильно? d сигмоид / dx = np.exp(-x)/((1 np.exp(-x)**2). Возможно, это можно записать так, как вы сделали, но я не могу этого видеть.
2. Да, это производная от сигмоида. Я изменил его на предложенное вами значение и получил тот же результат (работает для 1 итерации, но все ‘1’ для 2 или более итераций.
Ответ №1:
Предполагая, что вы используете градиентный спуск, я думаю, вам не хватает скорости обучения.
попробуйте установить
lr = 1-e3 # try different range from 1-e2 to 1-e5
adjustments = lr * error * sigmoid_der(outputs)
Комментарии:
1. После добавления этого я получаю все единицы для 2 итераций, а затем все нули.
2. @Laura правильна ли ваша функция потерь? Я только что понял, что это не функция потерь для логистической регрессии