Tensorflow最大输入层大小

时间:2019-06-17 10:29:15

标签: python python-3.x tensorflow input

在使用低规格(例如2.60GHz和6GB RAM)时,Tensorflow神经网络的输入向量中的元素数量在计算上变得不可行吗?

例如,我知道可以输入1,000个单元格,但是100K呢?还是1M?

1 个答案:

答案 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))