最初在堆栈溢出上发布。
我想要实现一个模型,实际上是两个神经网络叠加在一起。然而,这两个架构的大小太大,不能同时适用于GPU。
我的想法如下:
我其实不需要训练第一个模特,因为它是预先训练的。但我需要训练第二个模特。
我已经尝试过先计算整个数据集的第一个模型的输出,然后使用它作为第二个数据集的输入。但是,第一个数据集的输出非常大,而且我没有存储整个预处理数据集的可用空间。这就是为什么我想每一批都这么做。
在@Gal Avineri给出了一个非常好的答案之后,只需再精确一次:我希望只使用一个GPU实现我的体系结构。
发布于 2018-11-15 19:59:23
我建议一种类似@ignatius提供的方法。
由于您不需要培训第一个模型和第二个模型,所以您可以这样做:
这样,您将只需要加载一个模型在给定的时间。
此外,这将使第二种模式的培训更快。
( op已经指定他没有足够的内存来处理推理结果)
在这种情况下,我可以建议在第一个模型的推理和第二个模型的训练之间并行化。
这可以通过预加脂来实现。
让我们将原始数据集表示为data1,并将第一个模型的相应推断结果表示为data2。
我们还将第一个模型表示为M1,第二个模型表示为M2。
因此,您可以执行以下操作:
这样,当M2被训练成一个批处理时,下一个批正在准备。这称为预取下一批。
这将使M2的训练和data2的制作并行化。
我前面描述的方法使用tensorflow "Data“api有一个非常简单的实现方法。
下面是一个代码示例:
import numpy as np
from tensorflow.keras import backend as K
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
from tensorflow.data import Dataset
with K.device('cpu0'):
input = Input((10,))
x = Dense(100)(input)
m1 = Model(input_shape=input, outputs=x)
with K.device('gpu0'):
input = Input((100,))
x = Dense(5)(input)
m2 = Model(input_shape=input, outputs=x)
features = np.random.rand(10, 2000)
labels = np.random.randint(2, size=2000)
dataset = Dataset.from_tensor_slices((features, labels))
def preprocess_sample(features, label):
inference = m2.predict(features, batch_size=1)
return inference, label
dataset = dataset.shuffle(2000).repeat().map(preprocess_sample).batch(32)
dataset = dataset.prefetch(1)
m2.fit(dataset, epochs=100, steps_per_epoch=2000//32)发布于 2018-11-15 21:28:46
我以前在有线电视新闻网( CNN )的大型架构中见过这个问题。如果第一个网络不会改变,那么使用该网络对所有数据进行预测,并使用输出作为第二个网络的培训数据。您可以将其保存为单独的数据集并重用它。
编辑-我刚刚注意到Gal Avineri发布了同样的答案。
https://datascience.stackexchange.com/questions/41252
复制相似问题