Нейронная сеть генерирует отрицательные значения - PullRequest
1 голос
/ 14 июля 2020

У меня есть набор данных X, который состоит из среднего и стандартного отклонения, это повторяется 5 раз, поэтому 10 столбцов в массиве

И Y состоит из диапазонов:

Пример:

  • от 0 до 20
  • от 20 до 40
  • от 40 до 60
  • от 60 до 80
  • От 80 до 100

Чтобы преобразовать значения в 0 и 1, каждый элемент был разделен на наибольшее вхождение его столбца, это относится к X и Y

Цель: Чтобы заставить X и Y генерировать следующие 60 значений

X = блоки из 60 значений

Y = следующие 30 значений каждого блока

Проблема: по какой-то причине я получаю отрицательные значения, похоже, что моя нейронная сеть не работает

X:

[[0.573 0.699 0.412 0.224 0.696 0.512 0.326 0.314 0.79  0.685]
 [0.456 0.251 0.629 0.523 0.344 0.286 0.8   0.699 0.721 1.   ]
 ...
 [0.229 0.148 0.683 0.624 0.222 0.146 0.687 0.732 0.296 0.184]
 [0.646 0.627 0.204 0.152 0.542 0.632 0.36  0.224 0.291 0.215]]

Y:

[[1.    0.5   0.    0.    0.   ]
 [1.    0.5   0.    0.    0.   ]
 ...
 [1.    0.5   0.    0.    0.   ]
 [1.    0.5   0.    0.    0.   ]]

Скрипт:

model = keras.Sequential(
    [
        layers.Dense(10, activation="sigmoid", name="hidden-input"),
        layers.Dense(5, name="output"),
    ]
)

model.compile(optimizer = 'Adam', loss = 'mse', metrics = ['mae'])

model.fit(X, Y, epochs = 20, batch_size = 10)
print(model.summary())

y = model.predict(X)

Итоги:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
hidden-input (Dense)         multiple                  110       
_________________________________________________________________
output (Dense)               multiple                  55        
=================================================================
Total params: 165
Trainable params: 165
Non-trainable params: 0

Поезд:

Epoch 1/20
48/48 [==============================] - 0s 2ms/sample - loss: 0.3500 - mean_absolute_error: 0.4904
...
Epoch 20/20
48/48 [==============================] - 0s 178us/sample - loss: 0.0283 - mean_absolute_error: 0.1172

Выход:

[[ 8.6036199e-01  4.6452054e-01  1.3958054e-02 -2.3673278e-01 3.2733783e-02]
 [ 9.7470945e-01  4.6182287e-01  6.4254209e-02 -2.0704785e-01 -2.0927802e-02]
  ...
 [ 7.7844203e-01  4.5801651e-01 -2.5306268e-02 -2.8805625e-01 4.5798883e-02]]

1 Ответ

1 голос
/ 14 июля 2020

Вы получаете отрицательный результат, потому что вы не указали активацию на последнем слое, это означает, что по умолчанию он установлен на None, что является линейной функцией активации, поэтому вероятность получения отрицательного выхода не равна нулю.

В первом слое вы выбрали sigmoid в качестве функции активации, поэтому независимо от входных данных он будет давать положительные значения, тогда отрицательные числа получены из весов, соединяющих первый слой со вторым слоем, они должны иметь отрицательные веса, и при соответствующем вводе он может выдавать отрицательные числа.

...