如何解决LSTM 序列预测仅在一个特定值上过拟合
大家好,我是机器学习的新手。我正在使用 LSTM 实施联邦学习以预测序列中的下一个标签。我的序列看起来像这样[2,3,5,1,4,2,7]。例如,意图是预测这个序列中的 7。所以我用keras尝试了一个简单的联邦学习。我将这种方法用于另一个模型(不是 LSTM),它对我有用,但在这里它总是过拟合 2。它总是为任何输入预测 2。我使输入数据如此平衡,这意味着最后一个索引中每个标签的数量几乎相等(这里是 7 个)。我在简单的深度学习上测试了这些数据,效果很好。所以在我看来这个数据不适合 LSTM 或任何其他问题。请帮我。这是我的联邦学习代码。如果需要更多信息,请告诉我,我真的需要它。谢谢
def get_lstm(units):
"""LSTM(Long Short-Term Memory)
Build LSTM Model.
# Arguments
units: List(int),number of input,output and hidden units.
# Returns
model: Model,nn model.
"""
model = Sequential()
inp = layers.Input((units[0],1))
x = layers.LSTM(units[1],return_sequences=True)(inp)
x = layers.LSTM(units[2])(x)
x = layers.Dropout(0.2)(x)
out = layers.Dense(units[3],activation='softmax')(x)
model = Model(inp,out)
optimizer = keras.optimizers.Adam(lr=0.01)
seqLen=8 -1;
global_model = Mymodel.get_lstm([seqLen,64,15]) # 14 categories we have,array start from 0 but never can predict zero class
global_model.compile(loss="sparse_categorical_crossentropy",optimizer=optimizer,metrics=tf.keras.metrics.SparsetopKCategoricalAccuracy(k=1))
def main(argv):
for comm_round in range(comms_round):
print("round_%d" %( comm_round))
scaled_local_weight_list = list()
global_weights = global_model.get_weights()
np.random.shuffle(train)
temp_data = train[:]
# data divided among ten users and shuffled
for user in range(10):
user_data = temp_data[user * userDataSize: (user+1)*userDataSize]
X_train = user_data[:,0:seqLen]
X_train = np.asarray(X_train).astype(np.float32)
Y_train = user_data[:,seqLen]
Y_train = np.asarray(Y_train).astype(np.float32)
local_model = Mymodel.get_lstm([seqLen,15])
X_train = np.reshape(X_train,(X_train.shape[0],X_train.shape[1],1))
local_model.compile(loss="sparse_categorical_crossentropy",metrics=tf.keras.metrics.SparsetopKCategoricalAccuracy(k=1))
local_model.set_weights(global_weights)
local_model.fit(X_train,Y_train)
scaling_factor = 1 / 10 # 10 is number of users
scaled_weights = scale_model_weights(local_model.get_weights(),scaling_factor)
scaled_local_weight_list.append(scaled_weights)
K.clear_session()
average_weights = sum_scaled_weights(scaled_local_weight_list)
global_model.set_weights(average_weights)
predictions=global_model.predict(X_test)
for i in range(len(X_test)):
print('%d,%d' % ((np.argmax(predictions[i])),Y_test[i]),file=f2 )
解决方法
我能找到我的问题的一些原因,所以我想我可以和你分享:
1-不同项目在序列中的比例不均衡。我的意思是,例如我有 1000 个“2”和 100 个其他数字,因此经过几轮后,模型适合 2,因为特定数字的数据要多得多。
2- 我改变了我的序列,因为序列中没有任何两个项目,而它们都具有相同的值。所以我可以从序列中删除一些重复的数据并使它们更加平衡。也许这不是活动的全部介绍,但就我而言,这是有道理的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。