我有一个网络,其中包含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
答案 0 :(得分:1)
我建议首先更改一些超级参数。
尝试使用'relu'
或LeakyReLU()
作为非输出层的激活功能。基本上relu
是基准模型的标准激活功能。
当前(大多数情况下)的标准优化器是Adam,请尝试使用它。在需要时调整其学习率。使用sgd可能会获得更好的结果,但是通常会花费很多时间和大量的超参数调整。亚当基本上是实现“低”损失的最快(通常)最快的优化器。
为防止过度拟合,您可能还想实现Dropout(0.5)
,以0.5为例。
一旦您达到最低的损失,您可能会开始更多地更改这些超级参数,以尝试降低损失。
除此之外,我实际上建议的第一件事是尝试添加多个具有不同大小的隐藏层。与尝试优化所有超级参数相比,这可能会产生更大的影响。
编辑:也许您可以发布训练损失和历时数据的训练损失与历时的屏幕截图?这可能会使其他人更清楚。