在使用低规格(例如2.60GHz和6GB RAM)时,Tensorflow神经网络的输入向量中的元素数量在计算上变得不可行吗?
例如,我知道可以输入1,000个单元格,但是100K呢?还是1M?
答案 0 :(得分:3)
这是训练时间,准确性,可用内存,数据大小等之间的权衡。
模型的复杂性与数据大小的关系称为偏差/方差折衷,您可以详细了解here。但是通常最好的做法是从简单开始,然后在模型不断改进的情况下增加复杂性。 如果输入维具有大量类(例如文本中的单词),请考虑使用嵌入(或其他方法)来减小维。
假设您有足够大的数据集,足够的训练时间,并且可以选择无限复杂的模型(仅受ram限制),那么下面是ram分析。
模型内存大小取决于网络体系结构,dtype和批处理大小。 要测试所需的内存大小以训练网络,可以使用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内存培训。
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))