【问题标题】:Train neural network model on multiple datasets在多个数据集上训练神经网络模型
【发布时间】:2021-12-31 06:41:15
【问题描述】:

我有什么:

  1. 神经网络模型
  2. 10 个结构相同的数据集

我想要什么:

  1. 分别在所有数据集上训练模型
  2. 分别保存他们的模型

我可以单独训练数据集并一次保存一个模型。但我想加载我的 10 个数据集并在一次运行中使用它们创建 10 个模型。解决方案可能很明显,但我对此很陌生。我如何做到这一点?

提前致谢。

【问题讨论】:

    标签: python tensorflow keras deep-learning neural-network


    【解决方案1】:

    您可以使用concurrency and parallelism 的概念之一,即Multi-Threading,或在某些情况下使用Multi-Processing 来实现此目的。
    最简单的编码方法是使用 python 的concurrent-futures 模块。

    您可以在 ThreadPoolExecutor 下为要使用的每个数据集调用模型上的训练函数,以便触发并行线程以执行单独的训练。

    代码可能有点像这样:


    第 1 步:必要的导入
    from concurrent.futures import ThreadPoolExecutor, as_completed
    
    import tensorflow as tf
    from tensorflow.keras.models import load_model, Sequential
    from tensorflow.keras.layers import Dense, Activation, Flatten
    

    第 2 步:创建和构建模型
    def create_model():                                                 # responsible for creating model
        model = Sequential()
        model.add(Flatten())                                            # adding NN layers
        model.add(Dense(64))
        model.add(Activation('relu'))
        # ........ so on
        model.compile(optimizer='..', loss='..', metrics=[...])         # compiling the model
        return model                                                    # finally returning the model
    

    第 3 步:定义拟合函数(执行模型训练)
    def fit(model, XY_train):                                      # performs model.fit(...parameters...)
        model.fit(XY_train[0], XY_train[1], epochs=5, validation_split=0.3)     # use your already defined x_train, y_train
        return model                                                    # finally returns trained model
    

    第 4 步:并行训练方法,使用 TPE 上下文管理器触发同步训练
    # trains provided model on each dataset parallelly by using multi-threading
    def parallel_trainer(model, XY_train_datasets : list[tuple]):
        with ThreadPoolExecutor(max_workers = len(XY_train_datasets)) as executor:
            futureObjs = [
                executor.submit(
                    lambda ds: fit(model, ds), XY_train_datasets) # Call Fit for each dataset iterate through the datasets
                ]
    
            for i, obj in enumerate(as_completed(futureObjs)):          # iterate through trained models
                (obj.result()).save(f"{i}.model")                       # save models
    

    第 5 步:创建模型、加载数据集、调用并行训练器
    model = create_model()                                              # create the model
    
    mnist = tf.keras.datasets.mnist                                     # get dataset - for example :- mnist dataset
    (x_train, y_train), (x_test, y_test) = mnist.load_data()            # get (x_train, y_train), (x_test, y_test)
    datasets = [(x_train, y_train)]*10                                  # list of dataset paths (in your case, same dataset used 10 times)
    
    parallel_trainer(model, datasets)                                   # call parallel trainer
    



    整个程序

    from concurrent.futures import ThreadPoolExecutor, as_completed
    
    import tensorflow as tf
    from tensorflow.keras.models import load_model, Sequential
    from tensorflow.keras.layers import Dense, Activation, Flatten
    
    
    def create_model():                                                 # responsible for creating model
        model = Sequential()
        model.add(Flatten())                                            # adding NN layers
        model.add(Dense(64))
        model.add(Activation('relu'))
        # ........ so on
        model.compile(optimizer='..', loss='..', metrics=[...])         # compiling the model
        return model                                                    # finally returning the model
    
    
    def fit(model, XY_train):                                      # performs model.fit(...parameters...)
        model.fit(XY_train[0], XY_train[1], epochs=5, validation_split=0.3)     # use your already defined x_train, y_train
        return model                                                    # finally returns trained model
    
    
    # trains provided model on each dataset parallelly by using multi-threading
    def parallel_trainer(model, XY_train_datasets : list[tuple]):
        with ThreadPoolExecutor(max_workers = len(XY_train_datasets)) as executor:
            futureObjs = [
                executor.submit(
                    lambda ds: fit(model, ds), XY_train_datasets) # Call Fit for each dataset iterate through the datasets
                ]
    
            for i, obj in enumerate(as_completed(futureObjs)):          # iterate through trained models
                (obj.result()).save(f"{i}.model")                       # save models
    
    
    
    model = create_model()                                              # create the model
    
    mnist = tf.keras.datasets.mnist                                     # get dataset - for example :- mnist dataset
    (x_train, y_train), (x_test, y_test) = mnist.load_data()            # get (x_train, y_train), (x_test, y_test)
    datasets = [(x_train, y_train)]*10                                  # list of dataset paths (in your case, same dataset used 10 times)
    
    parallel_trainer(model, datasets)                                   # call parallel trainer
    

    【讨论】:

    • 我可能没有说清楚。我的数据集结构相同(如相同的列),但数据不同。所以,不同的数据集。如果发生这种情况会有什么变化?
    • 那一行,你放置数据集的 (x_train, y_train) 元组:- datasets = [(x_train, y_train)]*10,在这里你可以简单地放置不同数据集的元组,例如:datasets = [(x_train_1, y_train_1), (x_train_2, y_train_2), (x_train_3, y_train_3)...]
    • 当我以datasets = [(td[0],vd[0]),(td[1],vd[1]),(td[2],vd[2]),(td[3],vd[3]),(td[4],vd[4])] 这种形式获取数据集时,返回了一个错误TypeError: <lambda>() takes 1 positional argument but 5 were given。 PS:这些元组包含 x_train、y_train 数据。
    • 将其放入datasets = [(x_train_1, y_train_1), (x_train_2, y_train_2), (x_train_3, y_train_3)...] 此表单会返回错误。说TypeError: <lambda>() takes 1 positional argument but 5 were given。当使用多个数据集元组时,对 lambda 有什么可做的吗?
    • 我已经修改了代码,只需将lambda ds: load_fit(model, ds), *XY_train_datasets行中的*去掉即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 2020-08-24
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多