gpt4 book ai didi

尝试构建简单的神经网络时出现 Python 内存错误

转载 作者:太空宇宙 更新时间:2023-11-04 04:49:30 25 4
gpt4 key购买 nike

下面的一段代码在我运行时给我一个内存错误。它是我正在构建的简单神经网络的一部分。请记住,所有数学都是为了学习目的而写出来的:

learning_rate = 0.2
costs = []
for i in range(50000):
ri = np.random.randint(len(data))
point =data[ri]
## print (point)
z = point[0] * w1 + point[1] * w2 + b
pred = sigmoid(z)
target = point[2]
cost = np.square(pred-target)
costs.append(cost)
dcost_pred = 2* (pred-target)
dpred_dz = sigmoid_p(z)

dz_dw1 = point[0]
dz_dw2 = point[1]
dz_db = 1

dcost_dz = dcost_pred*dpred_dz
dcost_dw1 = dcost_pred*dpred_dz*dz_dw1
dcost_dw2 = dcost_pred*dpred_dz
dcost_db = dcost_dz * dz_db

w1 = w1 - learning_rate*dcost_dw1
w2 = w2 - learning_rate*dcost_dw2
b = b - learning_rate*dcost_db
plt.plot(costs)


if i % 100 == 0:

for j in range(len(data)):
cost_sum = 0
point = data[ri]
z = point[0]*w1+point[1]*w2+b
pred = sigmoid(z)
target = point[2]
cost_sum += np.square(pred-target)
costs.append(cost_sum/len(data))

当程序到达这一部分时,会导致以下错误:

Traceback (most recent call last):
File "D:\First Neual Net.py", line 89, in <module>
plt.plot(costs)
File "C:\Program Files (x86)\Python36-32\lib\site-packages\matplotlib\pyplot.py", line 3261, in plot
ret = ax.plot(*args, **kwargs)
File "C:\Program Files (x86)\Python36-32\lib\site-packages\matplotlib\__init__.py", line 1717, in inner
return func(ax, *args, **kwargs)
File "C:\Program Files (x86)\Python36-32\lib\site-packages\matplotlib\axes\_axes.py", line 1373, in plot
self.add_line(line)
File "C:\Program Files (x86)\Python36-32\lib\site-packages\matplotlib\axes\_base.py", line 1779, in add_line
self._update_line_limits(line)
File "C:\Program Files (x86)\Python36-32\lib\site-packages\matplotlib\axes\_base.py", line 1801, in _update_line_limits
path = line.get_path()
File "C:\Program Files (x86)\Python36-32\lib\site-packages\matplotlib\lines.py", line 957, in get_path
self.recache()
File "C:\Program Files (x86)\Python36-32\lib\site-packages\matplotlib\lines.py", line 667, in recache
self._xy = np.column_stack(np.broadcast_arrays(x, y)).astype(float)
File "C:\Program Files (x86)\Python36-32\lib\site-packages\numpy\lib\shape_base.py", line 353, in column_stack
return _nx.concatenate(arrays, 1)
MemoryError

有什么方法可以使这段代码更有效率吗?也许使用发电机?

最佳答案

错误

您可能打算将 cost_sum = 0 移出循环!

内存错误

您正在尝试绘制 50000 个点,matplotlib 肯定不会接受这一点,因此您可能希望减少绘制的点数。您似乎试图在代码底部的循环中执行此操作?

效率

让我们解决您问题的效率部分。现在,我无法评论如何使算法本身更高效,但我想我会提供让 Python 代码运行得更快的智慧。

我首先要说的是:Python 编译器(位于解释器后面)几乎没有进行任何优化,因此常见的优化编译器通常会自行应用到我们这里。

公共(public)子表达式消除

在你的代码中你使用了这样的东西:

dcost_dz = dcost_pred*dpred_dz    
dcost_dw1 = dcost_pred*dpred_dz*dz_dw1
dcost_dw2 = dcost_pred*dpred_dz

这真的很低效!我们正在重新计算 dcost_pred*dpred_dx 3 次!只使用我们已经分配给的变量会好得多:

dcost_dz = dcost_pred*dpred_dz    
dcost_dw1 = dcost_dz*dz_dw1
dcost_dw2 = dcost_dz

从正确的角度来看,循环的每次迭代少了 4 条指令(14 对 10)。

以类似的方式,每次迭代重新计算 point[0]point[1] 两次,为什么不使用 (x, y) = data [ri] 代替?

循环提升

您还可以在循环迭代期间进行一些重新计算。例如,每次迭代您都会发现数据大小多达 3 次不同的时间,并且这不会改变。所以在循环之前计算它:

for i in range(50000):
ri = np.random.randint(len(data))

成为

datasz = len(data)
for i in range(50000):
ri = np.random.randint(datasz)

此外,np.random.randint 甚至需要花费 3 条指令才能访问,甚至无需考虑调用。如果您真的对性能很敏感,您也可以将其移出循环:

datasz = len(data)
randint = np.random.randint
for i in range(50000):
ri = randint(datasz)

强度降低

有时,某些运算符的执行速度比其他运算符更快。例如;

b = b - learning_rate*dcost_db

使用BINARY_SUBTRACT指令,但是

b -= learning_rate*dcost_db

使用 INPLACE_SUBTRACT 指令。就地指令可能会更快一些,因此需要考虑一些事情(但您需要测试该理论)。

绘制每次迭代

如评论中所述(很好地发现了@HFBrowning),您在每次迭代中绘制所有点,这绝对会削弱性能!

列表追加

因为您知道要插入的列表的大小(50500 或什么?),您可以使用类似以下内容将列表分配为该大小:costs = [0] * 50500,这当列表变满时,可以节省大量重新分配列表大小的时间。您将停止使用追加并开始分配给索引。但请记住,除非您只在循环结束后绘制一次,否则这会导致您的情节变得怪异!

关于尝试构建简单的神经网络时出现 Python 内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48716033/

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