Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在回归(非分类)问题中,使用softmax作为隐藏层激活函数是否可以接受?_Python_Keras_Softmax - Fatal编程技术网

Python 在回归(非分类)问题中,使用softmax作为隐藏层激活函数是否可以接受?

Python 在回归(非分类)问题中,使用softmax作为隐藏层激活函数是否可以接受?,python,keras,softmax,Python,Keras,Softmax,我以前对ML模型进行过手动超参数优化,并始终默认使用tanh或relu作为隐藏层激活函数。最近,我开始尝试Keras Tuner来优化我的架构,并意外地将softmax作为隐藏层激活的选择 我只见过softmax在输出层的分类模型中使用,从未作为隐藏层激活,尤其是在回归中。这个模型在预测温度方面有很好的性能,但我很难证明使用这个模型是正确的 我看到过这样的帖子,其中谈到了为什么它应该只用于输出,但在我的情况下有什么理由吗?我在下面展示整体架构,以供参考 model = Sequential()

我以前对ML模型进行过手动超参数优化,并始终默认使用tanh或relu作为隐藏层激活函数。最近,我开始尝试Keras Tuner来优化我的架构,并意外地将softmax作为隐藏层激活的选择

我只见过softmax在输出层的分类模型中使用,从未作为隐藏层激活,尤其是在回归中。这个模型在预测温度方面有很好的性能,但我很难证明使用这个模型是正确的

我看到过这样的帖子,其中谈到了为什么它应该只用于输出,但在我的情况下有什么理由吗?我在下面展示整体架构,以供参考

model = Sequential()
model.add(Dense(648, activation='relu',input_shape=(train_x.shape[1],)))
model.add(Dropout(0.3))
model.add(LayerNormalization())
model.add(Dense(152,activation='relu'))
model.add(Dropout(0.15))
model.add(LayerNormalization())
model.add(Dense(924,activation='softsign'))
model.add(Dropout(0.37))
model.add(LayerNormalization())
model.add(Dense(248,activation='softmax'))
model.add(Dropout(0.12))
model.add(LayerNormalization())
model.add(Dense(1,activation='linear'))
model.compile(loss='mse',optimizer='Adam')

我可能是错的,无论是分类还是回归都应该是一样的。从数学角度考虑

一般来说,在隐藏层中使用
softmax
是不可取的,因为我们希望每个神经元彼此独立。如果应用
softmax
,则它们将线性相关,因为激活将强制它们的总和等于一。这并不意味着它从未被使用过,你可以参考

假设使用一些高级激活,例如
LeakyReLU
,通过使用它,神经元将受到控制,因为阿尔法速率可以调节。但如果使用
softmax
,这将是不可能的

现在回到问题上来,我认为这取决于数据集。模型能够使用
softmax
概括此数据集。然而,我不认为它会一直这样工作。如上所述,您正在使它们彼此线性相关。所以,如果一个神经元学习到错误的东西,就会影响整个网络的泛化,因为其他值也会受到影响

编辑:我测试了两个模型。对于某些数据,
softmax
relu
一样有效。但事实是所有的神经元都是相互依赖的。让它们相互依赖并不是一个应该承担的风险,特别是在大型网络中

数据:

使用Softmax

model = Sequential()
model.add(Dense(512, activation='relu',input_shape=(20,)))
model.add(Dense(256,activation='softmax'))
model.add(Dense(512,activation='softmax'))
model.add(Dense(256,activation='softmax'))
model.add(Dense(128,activation='softmax'))
model.add(Dense(1,activation='linear'))
model.compile(loss='mse',optimizer='adam')
model.fit(X_train, y_train, epochs = 16, validation_data= (X_test, y_test)) 
model = Sequential()
model.add(Dense(512, activation='relu',input_shape=(20,)))
model.add(Dense(256,activation='relu'))
model.add(Dense(512,activation='relu'))
model.add(Dense(256,activation='relu'))
model.add(Dense(128,activation='relu'))
model.add(Dense(1,activation='linear'))
model.compile(loss='mse',optimizer='adam')
model.fit(X_train, y_train, epochs = 16, validation_data= (X_test, y_test))

# Obviously overfitting but that's not the case.
结果:模型无法学习此数据。它发散并停留在与发散相同的区域。似乎一个神经元想要学习,但另一个不让另一个学习

Epoch 15/16
313/313 [==============================] - 1s 3ms/step - loss: 1.0259 - val_loss: 1.0269
Epoch 16/16
313/313 [==============================] - 1s 3ms/step - loss: 1.0020 - val_loss: 1.0271
使用relu

model = Sequential()
model.add(Dense(512, activation='relu',input_shape=(20,)))
model.add(Dense(256,activation='softmax'))
model.add(Dense(512,activation='softmax'))
model.add(Dense(256,activation='softmax'))
model.add(Dense(128,activation='softmax'))
model.add(Dense(1,activation='linear'))
model.compile(loss='mse',optimizer='adam')
model.fit(X_train, y_train, epochs = 16, validation_data= (X_test, y_test)) 
model = Sequential()
model.add(Dense(512, activation='relu',input_shape=(20,)))
model.add(Dense(256,activation='relu'))
model.add(Dense(512,activation='relu'))
model.add(Dense(256,activation='relu'))
model.add(Dense(128,activation='relu'))
model.add(Dense(1,activation='linear'))
model.compile(loss='mse',optimizer='adam')
model.fit(X_train, y_train, epochs = 16, validation_data= (X_test, y_test))

# Obviously overfitting but that's not the case.
结果:带有
relu
的模型能够学习这两个数据

Epoch 15/16
313/313 [==============================] - 1s 3ms/step - loss: 0.5580 - val_loss: 1.3091
Epoch 16/16
313/313 [==============================] - 1s 3ms/step - loss: 0.4808 - val_loss: 1.3290 

你的数据集有多大?我有6个输入和1个输出。调谐器使用的训练样本数为100000个,但我总共有8000多万个。