警告:Python 中可能未定义名称“xxx”。

5
我正在尝试在Python中运行别人的代码,但是我遇到了这个警告:

名称“embedding_vector”未定义。

## Making an embeddings matrix from embeddings vector ##

embedding_dim = 100
embedding_matrix = np.zeros((max_words, embedding_dim))

for word, i in word_index.items():
   if i < max_words:
       embedding_vector = embeddings_index.get(word)
   if embedding_vector is not None:
       embedding_matrix[i] = embedding_vector

这两行代码有警告。

我该怎么修复这个问题?


1
你的逻辑有错误。第一个if语句可能并不总是被满足,因此embedding_vector未被分配一个值,这意味着你的第二个if语句会失败,因为embedding_vector实际上不存在。 - logan_9997
注意:由于后来的更改,图像变得占主导地位,并且错误消息实际上已经包含(除了实际名称embedding_vector)。因此,这个不适用。 - Peter Mortensen
“Name 'embedding_vector' undefined.” 似乎与图像不同步。或者它们在两个不同的位置? - Peter Mortensen
2个回答

1

在循环之前声明embedding_vector

embedding_dim = 100
embedding_matrix = np.zeros((max_words, embedding_dim))
embedding_vector = None

for word, i in word_index.items():
  # ...

从静态代码分析的角度来看,存在一些情况下embedding_vector未定义(即i < max_words始终为false),但在实际数据中可能是不可能的。


现在我已经更改了其他部分,但没有更改这一部分,我收到了用户警告,其中说:“\ venv \ Lib \ site-packages \ keras \ optimizers \ legacy \ adam.py:117:UserWarning:lr参数已弃用,请使用learning_rate代替。 super().__init__(name,** kwargs)“ 有什么想法如何解决这个问题吗? - Ted_k
@Ted_k,这显然来自你使用的库,这意味着这应该是一个新问题(带有[mre])。附注:如果此问题提供的任何答案适用于您,请将其标记为已接受的答案(左侧的复选框),并点赞所有有用的答案。 - Guru Stron

0

你的代码表达的算法看起来很奇怪。我的感觉是只有在这个向量刚刚接收到值时,才应该将向量分配给矩阵的一行,因此缩进应该像这样:

for word, i in word_index.items():
    if i < max_words:
        embedding_vector = embeddings_index.get(word)
        if embedding_vector is not None:
            embedding_matrix[i] = embedding_vector

甚至有可能(但不太可能)embeddings_index.get(word)调用从未返回None,因此您可以删除最后一个条件语句。这意味着代码的作者认为is not None包括“未定义”,并为此编写了此测试,但是这是错误的。

否则,如其他人所述,保持相同逻辑并在for循环之前将embedding_vector初始化为None是消除警告的简单方法:

embedding_vector = None

一般来说,我不太喜欢代码检查工具,但是在这里,检查工具是正确的:这段代码确实很奇怪。

也许想法是变量 i 的值将按升序排序,例如从 0 开始,每次增加 1。当它超过某个 max_words 值(即矩阵中的行数)时,就不需要再执行任何操作了。此时,最好直接退出循环以提高效率:

for word, i in word_index.items():
    if i >= max_words:
        break
    embedding_vector = embeddings_index.get(word)
    if embedding_vector is not None:
        embedding_matrix[i] = embedding_vector

现在我已经更改了一些其他部分,但没有更改这个部分,我正在收到用户警告,该警告显示“\ venv \ Lib \ site-packages \ keras \ optimizers \ legacy \ adam.py:117:UserWarning:lr'参数已停用,请使用learning_rate'代替。 super()。__init__(name,** kwargs)",由于这是我第一次使用keras,所以我不知道如何解决它。 - Ted_k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接