LSTM 序列预测仅在一个特定值上过拟合
LSTM sequence prediction overfits on one specific value only
大家好,我是机器学习领域的新手。我正在使用 LSTM 实施联邦学习以预测序列中的下一个标签。我的序列看起来像这样 [2,3,5,1,4,2,5,7]。例如,意图是预测这个序列中的 7。所以我尝试了一个简单的 keras 联邦学习。我将这种方法用于另一个模型(不是 LSTM)并且它对我有用,但在这里它总是过度拟合 2。它总是预测任何输入的 2。我使输入数据如此平衡,这意味着最后一个索引中每个标签的数量几乎相等(这里是 7)。我在简单的深度学习上测试了这个数据并且非常有效。所以在我看来这个数据 mybe 不适合 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, 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, 64, 64, 15])
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
local_model.compile(loss="sparse_categorical_crossentropy", optimizer=optimizer, 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-我改变了我的序列,因为序列中没有任何两个项目,而两者都具有相同的值。所以我可以从序列中删除一些重复的数据并使它们更加平衡。也许这不是活动的全部介绍,但就我而言是有道理的。
大家好,我是机器学习领域的新手。我正在使用 LSTM 实施联邦学习以预测序列中的下一个标签。我的序列看起来像这样 [2,3,5,1,4,2,5,7]。例如,意图是预测这个序列中的 7。所以我尝试了一个简单的 keras 联邦学习。我将这种方法用于另一个模型(不是 LSTM)并且它对我有用,但在这里它总是过度拟合 2。它总是预测任何输入的 2。我使输入数据如此平衡,这意味着最后一个索引中每个标签的数量几乎相等(这里是 7)。我在简单的深度学习上测试了这个数据并且非常有效。所以在我看来这个数据 mybe 不适合 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, 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, 64, 64, 15])
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
local_model.compile(loss="sparse_categorical_crossentropy", optimizer=optimizer, 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-我改变了我的序列,因为序列中没有任何两个项目,而两者都具有相同的值。所以我可以从序列中删除一些重复的数据并使它们更加平衡。也许这不是活动的全部介绍,但就我而言是有道理的。