【发布时间】:2018-11-27 04:53:53
【问题描述】:
我有一个包含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.7301。它起起落落,但是当我每 10 分钟左右检查一次时,我只能看到一点点改善。我将如何微调它?
更新:
训练已经停止,但没有收敛。它的损失是.4614,准确度是.7422
【问题讨论】:
-
我建议尝试使用默认值的 Adam 优化器。它会自动调整学习率,因此它往往是最简单的最小化方法。如果 Adam 不起作用,那么您的网络可能无法学会表示数据。
-
@bivouac0 -> 我已经尝试过 Adam,但它没有收敛。我对数据进行编码时可能有问题。或隐藏节点的数量?请指导我如何调整它。
-
“收敛”和“给出我想要的损失”是有区别的,对吧?
标签: python tensorflow machine-learning keras neural-network