gpt4 book ai didi

python - tf.keras.Model类~自变量性能

转载 作者:行者123 更新时间:2023-12-01 06:28:42 25 4
gpt4 key购买 nike

编辑:

事实证明,继承树中更高的基类继承了Tf.keras.Model,当存在此类继承时,可以观察到下面描述的行为。与纯脚本相比,纯 Python 类的性能可以忽略不计。

我还没有找到任何与此行为相关的文档,如果有可用的更新将会随之而来。

编辑2:

我还没有找到任何关于此的文档(因此需要确认),但似乎:如果我将任何对象分配给 self(在 Tf.keras.Model 继承类中),则所有包含的 tf.Variables 都会被提取并出现在类的 trainable_variables 属性。所以我的假设是 keras.Model 检查对 self 的任何赋值,试图找到一些特定的对象,并且此检查会导致对 self 进行赋值巨大的字典要慢。

供引用:检查深入嵌套列表和字典,但不检查类,除非它们扩展了 ts.keras.Modeltf.keras.Layer

原始问题:

我有一个字符串列表 col (约 300k 行约 30 个字符的字符串,给你一个想法)。准确地说,是 pandas.DataGrid 而不是列表。

我正在创建一个查找字典以供将来使用,如下所示:

direct = {}
inverse = {}
# progressive
progressive = 0

# create direct map
for label in col:
# skip if present
if str(label) in direct:
continue
# else add to direct
direct[str(label)] = progressive
inverse[progressive] = str(label)
progressive += 1

这里没什么奇怪的,它需要 0.15 秒,并且 python 进程内存使用情况是合理的。

然后我将代码移到了一个类中,事情变得很奇怪。这里提供了同一功能的两个略有不同的版本。

版本A:

def fromDataset(self, column):
# reset map
self.direct = {}
self.inverse = {}

# progressive
progressive = 0

# create direct map
for label in column:
# skip if present
if str(label) in self.direct:
continue
# else add to direct
self.direct[str(label)] = progressive
self.inverse[progressive] = str(label)
progressive += 1

版本B:

def fromDataset(self, column):
# reset map
direct = {}
inverse = {}

# progressive
progressive = 0

# create direct map
for label in column:
# skip if present
if str(label) in direct:
continue
# else add to direct
direct[str(label)] = progressive
inverse[progressive] = str(label)
progressive += 1

self.direct = direct
self.inverse = inverse

所有建议的函数都会产生相同的结果(约 120k 条目的字典,约 30MB RAM 占用)

我可以接受版本 A 可能会比版本 B 访问 self 变量慢一些,但我无法理解的是版本 B 怎么可能花费 2.16 秒(比以前快 14 倍)天气版本 A 甚至无法测试(10 多分钟后还没有结果,进程内存使用量增加了 500+ MB)

更奇怪的是版本 B 需要 0.17 秒来创建字典,大约 2 秒来执行:

self.direct = direct
self.inverse = inverse

在为此迷失了一整天之后,我开始想知道是否有一些与我遗漏的与 Python 内存分配相关的东西。我得出的唯一有意义的假设是 self.direct = direct 导致 Python 实际上移动/复制 ram 中的字典。

任何人都可以向我解释一下版本 A 和版本 B 中发生的情况与直接脚本版本有何根本不同吗?

最佳答案

我创建了一个可重现的示例,没有遇到任何问题:

import random
import string

import pandas


def gen_random_word(word_length=30):
return ''.join((random.choice(string.ascii_letters) for _ in range(word_length)))

# I create a list of 300000 labels (but only 150k distinct labels) of 30 characters
labels = [gen_random_word() for _ in range(150000)]
labels = labels + labels
random.shuffle(labels)

# A dataframe here is useless but I try to get close to your own example
df = pandas.DataFrame(
{'labels': labels}
)

class A:
def __init__(self):
self.direct = {}
self.inverse = {}
self.progressive = 0

def fromDataset(self, column):

# create direct map
for label in column:
# skip if present
if str(label) in self.direct:
continue
# else add to direct
self.direct[str(label)] = self.progressive
self.inverse[self.progressive] = str(label)
self.progressive += 1

class B:
def __init__(self):
self.direct = {}
self.inverse = {}
self.progressive = 0

def fromDataset(self, column):
# reset map
direct = {}
inverse = {}

# progressive
progressive = 0

# create direct map
for label in column:
# skip if present
if str(label) in direct:
continue
# else add to direct
direct[str(label)] = progressive
inverse[progressive] = str(label)
progressive += 1

self.direct = direct
self.inverse = inverse
self.progressive = progressive

第一次测试:

%%time # remove that if you are not using jupyter and use another timing solution

direct = {}
inverse = {}
# progressive
progressive = 0

# create direct map
for label in df['labels']:
# skip if present
if str(label) in direct:
continue
# else add to direct
direct[str(label)] = progressive
inverse[progressive] = str(label)
progressive += 1

挂起时间:267 毫秒

第二次测试:

%%time
a = A()
a.fromDataset(df['labels'])

挂起时间:249 毫秒

第三次测试:

%%time
b = B()
b.fromDataset(df['labels'])

挂起时间:220 毫秒

所以...没什么重要的。

关于python - tf.keras.Model类~自变量性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60006722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com