Python-Keras模型无法收敛

时间:2018-11-27 04:53:54

标签: python tensorflow machine-learning keras neural-network

我有一个网络,其中包含32个输入节点,20个隐藏节点和65个输出节点。我的网络输入实际上是长度为32的哈希码,输出是单词。 输入是哈希码每个字符的ascii值。网络的输出是我所做的二进制表示。假设a等于00000,而b等于00001,依此类推。它仅包含字母和空格,因此每个字符只有5位。我的训练输入中最多只能有13个字符,因此我的输出节点是13 * 5 = 65。我期望二进制输出像10101010101010101010101010101010101010101010101010101010101001011。给定32长度的哈希码作为输入,该位序列最多可以预测16个字符的单词。下面是我当前的代码:

scaler = MinMaxScaler(feature_range=(0,1))
scaled_train_samples = scaler.fit_transform((train_samples).reshape(-1, 32))
train_labels = train_labels.reshape(-1, 65)


model = Sequential([
    Dense(32, input_shape=(32,), activation = 'sigmoid'),
    BatchNormalization(),
    Dense(25, activation='tanh'),
    BatchNormalization(),
    Dense(65, input_shape=(65,), activation='sigmoid')
])

overfitCallback = EarlyStopping(monitor='loss', min_delta=0, patience = 1000)

model.summary()
model.compile(SGD(lr=.01, decay=1e-6,  momentum=0.9),     loss='binary_crossentropy', metrics=['accuracy'])
model.fit(train_samples, train_labels, batch_size=1000, epochs=1000000, callbacks=[overfitCallback], shuffle = True, verbose=2)

我计划过度拟合该模型,以便它可以存储字典中单词的所有哈希码。最初,我的训练样本仅为5,000。我只是想看看它是否会从一个小的数据集中学习。如何使网络融合更快?我认为它运行了一个多小时,它的损失函数仍然是0.5004,准确度是0.701。它起伏不定,但是每隔10分钟左右检查一次,我只会看到一点点改进。我该如何微调?

更新:

培训已经停止,但没有收敛。损失为.4614,准确性为.7422

1 个答案:

答案 0 :(得分:1)

我建议首先更改一些超级参数。

尝试使用'relu'LeakyReLU()作为非输出层的激活功能。基本上relu是基准模型的标准激活功能。

当前(大多数情况下)的标准优化器是Adam,请尝试使用它。在需要时调整其学习率。使用sgd可能会获得更好的结果,但是通常会花费很多时间和大量的超参数调整。亚当基本上是实现“低”损失的最快(通常)最快的优化器。

为防止过度拟合,您可能还想实现Dropout(0.5),以0.5为例。

一旦您达到最低的损失,您可能会开始更多地更改这些超级参数,以尝试降低损失。

除此之外,我实际上建议的第一件事是尝试添加多个具有不同大小的隐藏层。与尝试优化所有超级参数相比,这可能会产生更大的影响。

编辑:也许您可以发布训练损失和历时数据的训练损失与历时的屏幕截图?这可能会使其他人更清楚。