我有一个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作为后端)
好的,所以我试着把G.predict的输出保存到一个新变量中,这显然修正了它。 i、 e.代替:
我做到了:
它给了我查林德克斯没有任何问题
相关问题 更多 >
编程相关推荐