Keras型号softmax输出总和不为1

2024-09-28 03:14:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个LSTM文本生成器,其中最后一层是一个密集层,通过softmax激活来决定输出哪个字符。 为了从这个输出中获得字符,我使用了一个随机选择,其中每个字符的概率由这个输出设置。 但是,执行随机化的行会导致崩溃,因为softmax函数的输出总和不是1。 我在生成器的单个输出上用sum()函数手动检查了总和,总和总是非常接近1。例如,“0.999999 8640269041”或“1.000000050291419”

这是发电机型号

activ='elu'
optim=optimizers.Adam(lr=0.01, clipnorm=0.1)
G = Sequential()
G.add(LSTM(700,activation=activ,kernel_regularizer=regularizers.l2(0.01),input_shape=(None, GnoiseSize),return_sequences=True,kernel_initializer='random_uniform',bias_initializer='zeros'))
G.add(Dropout(0.5))
G.add(BatchNormalization())
G.add(LSTM(500,activation=activ,kernel_regularizer=regularizers.l2(0.01),return_sequences=True,kernel_initializer='random_uniform',bias_initializer='zeros'))
G.add(Dropout(0.5))
G.add(BatchNormalization())
G.add(LSTM(200,activation=activ,kernel_regularizer=regularizers.l2(0.01),return_sequences=True,kernel_initializer='random_uniform',bias_initializer='zeros'))
G.add(Dropout(0.5))
G.add(BatchNormalization())
G.add(Dense(n_vocab,activation='softmax'))

#G.load_weights("G.h5")

G.compile(loss='categorical_crossentropy', optimizer=optim, metrics=['accuracy'], sample_weight_mode='temporal')

下面是对其输出的一个测试,其总和不等于1:

allText[0:numGeneratedText,:,:] = G.predict(Gnoise)
print(sum(self.allEpisodes_states[0,0,:]))
charIndex = np.random.choice(range(0, n_vocab), p=self.allEpisodes_states[0,0,:])

我猜这是某种舍入错误,但我已将allText设置为float64 dtype,但没有任何帮助。我不知道四舍五入或任何不精确的错误是在哪里发生的。是在凯拉斯本身吗(我使用Tensorflow作为后端)


Tags: addreturnrandom字符activationkernelinitializerlstm
1条回答
网友
1楼 · 发布于 2024-09-28 03:14:43

好的,所以我试着把G.predict的输出保存到一个新变量中,这显然修正了它。 i、 e.代替:

allText = np.zeros((max_Episodes, max_steps, n_vocab)
allText[0:max_Episodes,:,:] = G.output
charIndex = np.random.choice(range(0, n_vocab), p=allText[0,0,:])

我做到了:

newVariable = G.output
charIndex = np.random.choice(range(0, n_vocab), p=newVariable[0,0,:])

它给了我查林德克斯没有任何问题

相关问题 更多 >

    热门问题