如何改变Keras中softmax输出的温度

时间:2016-05-16 02:50:12

标签: python neural-network theano keras softmax

我目前正在尝试重现以下文章的结果 http://karpathy.github.io/2015/05/21/rnn-effectiveness/
我正在使用Keras和theano后端。在文章中,他谈到了控制最终softmax层的温度以提供不同的输出。

  

温度。我们也可以玩Softmax的温度   在采样期间。将温度从1降低到更低   数字(例如0.5)使RNN更有信心,但也更多   保守的样本。相反,温度会升高   更多的多样性,但代价是更多的错误(例如拼写错误,   等等)。特别是,设定温度非常接近零将给出   保罗格雷厄姆可能会说的最可能的事情是:

我的模型如下。

model = Sequential()
model.add(LSTM(128, batch_input_shape = (batch_size, 1, 256), stateful = True, return_sequences = True))
model.add(LSTM(128, stateful = True))
model.add(Dropout(0.1))
model.add(Dense(256, activation = 'softmax'))

model.compile(optimizer = Adam(),
              loss = 'categorical_crossentropy', 
              metrics = ['accuracy'])

我能想到调整最终密集层温度的唯一方法是获得权重矩阵并将其乘以温度。有谁知道更好的方法吗?此外,如果有人看到我如何设置模型有任何错误,请告诉我,因为我是RNN的新手。

2 个答案:

答案 0 :(得分:9)

看起来温度是你对softmax层输出做的事情。我找到了这个例子。

https://github.com/fchollet/keras/blob/master/examples/lstm_text_generation.py

他应用以下函数对soft-max输出进行采样。

def sample(a, temperature=1.0):
    # helper function to sample an index from a probability array
    a = np.log(a) / temperature
    a = np.exp(a) / np.sum(np.exp(a))
    return np.argmax(np.random.multinomial(1, a, 1))

答案 1 :(得分:2)

来自@ chasep255的答案正常但你会因为log(0)而收到警告。你可以简化操作e ^ log(a)/ T = a ^(1 / T)并摆脱日志

def sample(a, temperature=1.0):
  a = np.array(a)**(1/temperature)
  p_sum = a.sum()
  sample_temp = a/p_sum 
  return np.argmax(np.random.multinomial(1, sample_temp, 1))

希望它有所帮助!