问题描述
我有一个监督学习任务f(X)= y,其中X是np.int8的2维np.array,而y是np.float64的1维二维数组,包含概率 (因此,数字介于0和1之间)。我想建立一个执行回归的神经网络模型,以便预测给定X的概率。
由于我网络的输出是一个实数值(即输出层具有一个神经元)并且是一个概率(因此在[0,1]范围内),我相信我应该将softmax用作网络的激活函数输出层(即输出神经元)以便将网络的输出压缩为[0,1]。
由于这是一项回归任务,因此我选择使用mean_squared_error损失(而不是通常在分类任务中使用的cross_entropy_loss,并且经常与softmax配对)。
但是,当我尝试拟合(X,y)时,损失在历元之间完全没有变化,并且保持不变。有什么想法吗?出于某些原因,为什么softmax和mean_squared_error损失组合错误?
如果我删除softmax,它确实可以工作,但是我的模型也可以预测不需要的非概率。是的,我稍后可以自己压扁,但这似乎不正确。
我的代码基本上是(删除了一些与EarlyStopping和学习率抑制无关的附加回调之后):
model = Sequential()
model.add(Dense(W1_size,input_shape=(input_dims,),activation='relu'))
model.add(Dense(1,activation='softmax'))
# compile model
model.compile(optimizer=Adam(),loss='mse') # mse is the standard loss for regression
# fit
model.fit(X,y,batch_size=batch_size,epochs=MAX_EPOCHS)
编辑:事实证明,我需要S型函数将一个实际值压缩为[0,1],这是公认的答案所建议的。大小为1的向量的softmax函数始终为1。
解决方法
如您所说,您要执行regression task
。 (这意味着在您的输入和所需的输出之间找到连续的映射)。
softmax
函数为多维输出创建伪概率分布(所有值的总和为1
)。这就是softmax
函数完全适合classification tasks
(预测不同类的概率)的原因。
由于您要执行regression task
并且您的输出是一维的,因此softmax将无法正常工作,因为对于一维输入,softmax始终为1
。
可以将一维输入连续映射到[0,1]的函数在这里很好用(例如Sigmoid)。
请注意,您还可以将sigmoid
和softmax
函数的输出解释为概率。但请注意:这些只是伪概率,并不代表模型进行预测时的确定性或不确定性。