Я пытаюсь обучить эту нейронную сеть делать прогнозы на основе некоторых данных.
Я попробовал ее на небольшом наборе данных (около 100 записей), и она работала как часы. Затем я подключил новый набор данных и обнаружил, что NN сходится к 0 на выходе, а ошибка сходится примерно к соотношению количества положительных примеров к общему количеству примеров.
Мой набор данных состоит из признаков типа «да/нет» (1.0/0.0), и основная истина также равна «да/нет».
Мои предположения:
1) на выходе имеется локальный минимум 0 (но я пробовал со многими значениями скорости обучения и начальных весов, кажется, они всегда сходятся)
2) мое обновление веса неверно (но мне кажется, что это хорошо)
3) это просто проблема масштабирования вывода. Я пытался масштабировать выходные данные (т. е. выход/макс(выход) и выход/среднее(выход)), но результаты не очень хорошие, как вы можете видеть в коде, приведенном ниже. Должен ли я масштабировать его по-другому? Софтмакс?
вот код:
import pandas as pd
import numpy as np
import pickle
import random
from collections import defaultdict
alpha = 0.1
N_LAYERS = 10
N_ITER = 10
#N_FEATURES = 8
INIT_SCALE = 1.0
train = pd.read_csv("./data/prediction.csv")
y = train['y_true'].as_matrix()
y = np.vstack(y).astype(float)
ytest = y[18000:]
y = y[:18000]
X = train.drop(['y_true'], axis = 1).as_matrix()
Xtest = X[18000:].astype(float)
X = X[:18000]
def tanh(x,deriv=False):
if(deriv==True):
return (1 - np.tanh(x)**2) * alpha
else:
return np.tanh(x)
def sigmoid(x,deriv=False):
if(deriv==True):
return x*(1-x)
else:
return 1/(1+np.exp(-x))
def relu(x,deriv=False):
if(deriv==True):
return 0.01 + 0.99*(x>0)
else:
return 0.01*x + 0.99*x*(x>0)
np.random.seed()
syn = defaultdict(np.array)
for i in range(N_LAYERS-1):
syn = INIT_SCALE * np.random.random((len(X[0]),len(X[0]))) - INIT_SCALE/2
syn[N_LAYERS-1] = INIT_SCALE * np.random.random((len(X[0]),1)) - INIT_SCALE/2
l = defaultdict(np.array)
delta = defaultdict(np.array)
for j in xrange(N_ITER):
l[0] = X
for i in range(1,N_LAYERS+1):
l = relu(np.dot(l[i-1],syn[i-1]))
error = (y - l[N_LAYERS])
e = np.mean(np.abs(error))
if (j% 1) == 0:
print "\nIteration " + str(j) + " of " + str(N_ITER)
print "Error: " + str(e)
delta[N_LAYERS] = error*relu(l[N_LAYERS],deriv=True) * alpha
for i in range(N_LAYERS-1,0,-1):
error = delta[i+1].dot(syn.T)
delta = error*relu(l,deriv=True) * alpha
for i in range(N_LAYERS):
syn += l.T.dot(delta[i+1])
pickle.dump(syn, open('neural_weights.pkl', 'wb'))
# TESTING with f1-measure
# RECALL = TRUE POSITIVES / ( TRUE POSITIVES + FALSE NEGATIVES)
# PRECISION = TRUE POSITIVES / (TRUE POSITIVES + FALSE POSITIVES)
l[0] = Xtest
for i in range(1,N_LAYERS+1):
l = relu(np.dot(l[i-1],syn[i-1]))
out = l[N_LAYERS]/max(l[N_LAYERS])
tp = float(0)
fp = float(0)
fn = float(0)
tn = float(0)
for i in l[N_LAYERS][:50]:
print i
for i in range(len(ytest)):
if out > 0.5 and ytest == 1:
tp += 1
if out[i] 0.5 and ytest[i] == 0:
fp += 1
if out[i]
Подробнее здесь: https://stackoverflow.com/questions/442 ... ero-output
Нейронная сеть сходится к нулевому выходу ⇐ Python
Программы на Python
1732306085
Anonymous
Я пытаюсь обучить эту нейронную сеть делать прогнозы на основе некоторых данных.
Я попробовал ее на небольшом наборе данных (около 100 записей), и она работала как часы. Затем я подключил новый набор данных и обнаружил, что NN сходится к 0 на выходе, а ошибка сходится примерно к соотношению количества положительных примеров к общему количеству примеров.
Мой набор данных состоит из признаков типа «да/нет» (1.0/0.0), и основная истина также равна «да/нет».
Мои предположения:
1) на выходе имеется локальный минимум 0 (но я пробовал со многими значениями скорости обучения и начальных весов, кажется, они всегда сходятся)
2) мое обновление веса неверно (но мне кажется, что это хорошо)
3) это просто проблема масштабирования вывода. Я пытался масштабировать выходные данные (т. е. выход/макс(выход) и выход/среднее(выход)), но результаты не очень хорошие, как вы можете видеть в коде, приведенном ниже. Должен ли я масштабировать его по-другому? Софтмакс?
вот код:
import pandas as pd
import numpy as np
import pickle
import random
from collections import defaultdict
alpha = 0.1
N_LAYERS = 10
N_ITER = 10
#N_FEATURES = 8
INIT_SCALE = 1.0
train = pd.read_csv("./data/prediction.csv")
y = train['y_true'].as_matrix()
y = np.vstack(y).astype(float)
ytest = y[18000:]
y = y[:18000]
X = train.drop(['y_true'], axis = 1).as_matrix()
Xtest = X[18000:].astype(float)
X = X[:18000]
def tanh(x,deriv=False):
if(deriv==True):
return (1 - np.tanh(x)**2) * alpha
else:
return np.tanh(x)
def sigmoid(x,deriv=False):
if(deriv==True):
return x*(1-x)
else:
return 1/(1+np.exp(-x))
def relu(x,deriv=False):
if(deriv==True):
return 0.01 + 0.99*(x>0)
else:
return 0.01*x + 0.99*x*(x>0)
np.random.seed()
syn = defaultdict(np.array)
for i in range(N_LAYERS-1):
syn[i] = INIT_SCALE * np.random.random((len(X[0]),len(X[0]))) - INIT_SCALE/2
syn[N_LAYERS-1] = INIT_SCALE * np.random.random((len(X[0]),1)) - INIT_SCALE/2
l = defaultdict(np.array)
delta = defaultdict(np.array)
for j in xrange(N_ITER):
l[0] = X
for i in range(1,N_LAYERS+1):
l[i] = relu(np.dot(l[i-1],syn[i-1]))
error = (y - l[N_LAYERS])
e = np.mean(np.abs(error))
if (j% 1) == 0:
print "\nIteration " + str(j) + " of " + str(N_ITER)
print "Error: " + str(e)
delta[N_LAYERS] = error*relu(l[N_LAYERS],deriv=True) * alpha
for i in range(N_LAYERS-1,0,-1):
error = delta[i+1].dot(syn[i].T)
delta[i] = error*relu(l[i],deriv=True) * alpha
for i in range(N_LAYERS):
syn[i] += l[i].T.dot(delta[i+1])
pickle.dump(syn, open('neural_weights.pkl', 'wb'))
# TESTING with f1-measure
# RECALL = TRUE POSITIVES / ( TRUE POSITIVES + FALSE NEGATIVES)
# PRECISION = TRUE POSITIVES / (TRUE POSITIVES + FALSE POSITIVES)
l[0] = Xtest
for i in range(1,N_LAYERS+1):
l[i] = relu(np.dot(l[i-1],syn[i-1]))
out = l[N_LAYERS]/max(l[N_LAYERS])
tp = float(0)
fp = float(0)
fn = float(0)
tn = float(0)
for i in l[N_LAYERS][:50]:
print i
for i in range(len(ytest)):
if out[i] > 0.5 and ytest[i] == 1:
tp += 1
if out[i] 0.5 and ytest[i] == 0:
fp += 1
if out[i]
Подробнее здесь: [url]https://stackoverflow.com/questions/44213659/neural-network-converging-to-zero-output[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия