Я пытаюсь обучить эту нейронную сеть делать прогнозы на основе некоторых данных.
Я попробовал ее на небольшом наборе данных (около 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
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Нейронная сеть C# MNIST увеличивает точность примерно до 20 %, а затем снова падает до 10 %.
Anonymous » » в форуме C# - 0 Ответы
- 21 Просмотры
-
Последнее сообщение Anonymous
-