有这个代码:
from keras.models import Sequential
from keras.layers import Dense
import numpy
from numpy import exp, array, random, dot
# задаем для воспроизводимости результатов
numpy.random.seed(2)
# разбиваем датасет на матрицу параметров (X) и вектор целевой переменной (Y)
X = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
Y = array([[0, 1, 1, 0]]).T
# создаем модели, добавляем слои один за другим
model = Sequential()
model.add(Dense(1, input_dim=3, activation='relu')) # входной слой требует задать input_dim
# компилируем модель, используем градиентный спуск adam
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=['accuracy'])
# обучаем нейронную сеть
model.fit(X, Y, epochs = 10000, batch_size=4)
# оцениваем результат
scores = model.evaluate(X, Y)
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
pre = model.predict(array([[0, 1, 0]]))
print(pre)
precl = model.predict_classes(array([[1,0,0]]))
print(precl)
而当我使用ReLU激活函数时,准确率永远不会超过 50%,而且答案是错误的。当我使用Sigmoid时,一切都会立即收敛。
我读过ReLU现在是大多数情况下的首选。我的情况有什么问题?
结果(应为:0、1):
对于ReLU:
accuracy: 50.00%
[[0.9953842]]
[[0]]
对于乙状结肠:
accuracy: 100.00%
[[0.13338517]]
[[1]]
在不同的情况下使用不同的激活函数。与往常一样,通用激活函数没有
灵丹妙药。ReLU(Rectified Limear Unit) 通常用于 NA 的隐藏层,但不用于输出层。在您的情况下,您已经建立了一个二元分类模型,该模型应该输出正面结果的概率(使用二元分类,我们可以得到负面
False或正面True结果)。因此,对于输出层的二分类问题,使用sigmoid 函数作为激活函数是很方便的。sigmoid 值的范围:(0, 1)- 正是您在二进制分类的情况下所需要的。Sigmoid 图:
Relu 图表:
PS英文文章,帮助理解各种激活函数