Нейронная сеть выводит все 1s

#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 правильна ли ваша функция потерь? Я только что понял, что это не функция потерь для логистической регрессии