【问题标题】:Tensorflow maximum input layer size [closed]Tensorflow最大输入层大小[关闭]
【发布时间】:2019-06-17 10:29:15
【问题描述】:

当使用低规格(例如 2.60GHz 和 6GB RAM)时,Tensorflow 神经网络的输入向量中的元素数量在哪个数量级变得计算不切实际?

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

【问题讨论】:

  • 如果你开始有这么多的输入,那么在任何情况下都应该开始考虑减少维度了。要么通过以更有效的方式(卷积、池化层等)设计神经网络,要么使用 PCA 等老派方法在输入 NN 之前降低维度

标签: python python-3.x tensorflow input


【解决方案1】:

这是训练时间、准确性、可用内存、数据大小等之间的权衡。

模型的复杂性与数据的大小被称为偏差/方差权衡,您可以阅读更多关于它的信息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))

【讨论】:

    猜你喜欢
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2021-05-10
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多