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- 我改变了我的序列,因为序列中没有任何两个项目,而它们都具有相同的值。所以我可以从序列中删除一些重复的数据并使它们更加平衡。也许这不是活动的全部介绍,但就我而言,这是有道理的。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...