0

大家好,我是机器学习的新手。我正在使用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 )
4

1 回答 1

0

我可以找到我的问题的一些原因,所以我想我可以和你分享一下:
1-序列中不同项目的比例不平衡。我的意思是,例如,我有 1000 个“2”和 100 个其他数字,所以经过几轮后,模型适合 2,因为特定数字的数据要多得多。
2-我改变了我的序列,因为序列中没有任何两个项目,而两者都具有相同的值。所以我可以从序列中删除一些重复的数据,使它们更加平衡。也许这不是活动的全部介绍,但就我而言,这是有道理的。

于 2021-01-06T07:42:16.357 回答