【发布时间】:2021-12-31 06:41:15
【问题描述】:
我有什么:
- 神经网络模型
- 10 个结构相同的数据集
我想要什么:
- 分别在所有数据集上训练模型
- 分别保存他们的模型
我可以单独训练数据集并一次保存一个模型。但我想加载我的 10 个数据集并在一次运行中使用它们创建 10 个模型。解决方案可能很明显,但我对此很陌生。我如何做到这一点?
提前致谢。
【问题讨论】:
标签: python tensorflow keras deep-learning neural-network
我有什么:
我想要什么:
我可以单独训练数据集并一次保存一个模型。但我想加载我的 10 个数据集并在一次运行中使用它们创建 10 个模型。解决方案可能很明显,但我对此很陌生。我如何做到这一点?
提前致谢。
【问题讨论】:
标签: python tensorflow keras deep-learning neural-network
您可以使用concurrency and parallelism 的概念之一,即Multi-Threading,或在某些情况下使用Multi-Processing 来实现此目的。
最简单的编码方法是使用 python 的concurrent-futures 模块。
您可以在 ThreadPoolExecutor 下为要使用的每个数据集调用模型上的训练函数,以便触发并行线程以执行单独的训练。
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
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
【讨论】:
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行中的*去掉即可。