这是训练时间、准确性、可用内存、数据大小等之间的权衡。
模型的复杂性与数据的大小被称为偏差/方差权衡,您可以阅读更多关于它的信息here。但通常最好的做法是从简单开始,然后在模型不断改进的情况下增加复杂性。
如果输入维度具有大量类(如文本中的单词),请考虑使用嵌入(或其他方法)来降低维度。
假设你有足够大的数据集,足够的训练时间,可以选择无限复杂的模型,只受ram的限制,那么下面就是ram分析。
模型内存大小取决于网络架构、数据类型和批量大小。
要测试训练网络所需的内存大小,您可以使用 ZFTurbo 的答案 here 中的函数,下面有一份副本。
def get_model_memory_usage(batch_size, model):
import numpy as np
from tensorflow.keras import backend as K
shapes_mem_count = 0
for l in model.layers:
single_layer_mem = 1
for s in l.output_shape:
if s is None:
continue
single_layer_mem *= s
shapes_mem_count += single_layer_mem
trainable_count = np.sum([K.count_params(p) for p in set(model.trainable_weights)])
non_trainable_count = np.sum([K.count_params(p) for p in set(model.non_trainable_weights)])
number_size = 4.0
if K.floatx() == 'float16':
number_size = 2.0
if K.floatx() == 'float64':
number_size = 8.0
total_memory = number_size*(batch_size*shapes_mem_count + trainable_count + non_trainable_count)
gbytes = np.round(total_memory / (1024.0 ** 3), 3)
return gbytes
现在我们可以轻松测试不同的设置,以及所需的相应内存大小。下面是一个示例 2 个隐藏层,dtype 为 float32,批量大小为 256,我们将第一个隐藏层大小设置为 1k、10k、100k 和 1000k,这导致相应的 0.06、0.052、0.517 和 5.16 GB ram训练。
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
import tensorflow.keras.backend as K
K.set_floatx('float32')
n_input_nodes = [1e3, 1e4, 1e5, 1e6]
for n in n_input_nodes:
inputs = Input(shape=(1000,))
x = Dense(n, activation='relu')(inputs)
x = Dense(256, activation='relu')(x)
outputs = Dense(1)(x)
model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='adam', loss='mse')
print(get_model_memory_usage(128, model))