Python 浮动对象不可编辑 让我们考虑下面的代码 from google.colab import drive drive.mount('/content/drive') import numpy as np from copy import deepcopy x =[[1],[2],[3],[4]] y = [[2],[4],[6],[8]] w = [[[1.477867]], [0.]] print(len(w)) #define y =k*x+b def feed_forward(inputs,outputs, weights): out =np.dot(inputs,weights[0])+weights[1] squared_error =(np.square(out-outputs)) return squared_error def update_weights(inputs,outputs,weights,epochs): for epoch in range(epochs): org_loss =feed_forward(inputs,outputs,weights) wts_tmp = deepcopy(weights) wts_tmp2 = deepcopy(weights) for i in range(len(weights)): wts_tmp[-(i+1)] += 0.0001 loss = feed_forward(inputs, outputs, wts_tmp) delta_loss = np.sum(org_loss - loss)/(0.0001*len(inputs)) wts_tmp2[-(i+1)]+= delta_loss*0.01 wts_tmp = deepcopy(weights) weights = deepcopy(wts_tmp2) return wts_tmp2 weigths_new =update_weights(x,y,w,1000) for i in range(len(weights)):
当我运行此代码时,它显示以下错误Python 浮动对象不可编辑 让我们考虑下面的代码 from google.colab import drive drive.mount('/content/drive') import numpy as np from copy import deepcopy x =[[1],[2],[3],[4]] y = [[2],[4],[6],[8]] w = [[[1.477867]], [0.]] print(len(w)) #define y =k*x+b def feed_forward(inputs,outputs, weights): out =np.dot(inputs,weights[0])+weights[1] squared_error =(np.square(out-outputs)) return squared_error def update_weights(inputs,outputs,weights,epochs): for epoch in range(epochs): org_loss =feed_forward(inputs,outputs,weights) wts_tmp = deepcopy(weights) wts_tmp2 = deepcopy(weights) for i in range(len(weights)): wts_tmp[-(i+1)] += 0.0001 loss = feed_forward(inputs, outputs, wts_tmp) delta_loss = np.sum(org_loss - loss)/(0.0001*len(inputs)) wts_tmp2[-(i+1)]+= delta_loss*0.01 wts_tmp = deepcopy(weights) weights = deepcopy(wts_tmp2) return wts_tmp2 weigths_new =update_weights(x,y,w,1000) for i in range(len(weights)):,python,Python,当我运行此代码时,它显示以下错误 TypeError: 'float' object is not iterable 此错误发生在下一行 ---> 20 wts_tmp[-(i+1)] += 0.0001 我并没有理解这个错误,因为我使用了以下代码 from google.colab import drive drive.mount('/content/drive') import numpy as np from copy import deepcopy x =[[1]
TypeError: 'float' object is not iterable
此错误发生在下一行
---> 20 wts_tmp[-(i+1)] += 0.0001
我并没有理解这个错误,因为我使用了以下代码
from google.colab import drive
drive.mount('/content/drive')
import numpy as np
from copy import deepcopy
x =[[1],[2],[3],[4]]
y = [[2],[4],[6],[8]]
w = [[[1.477867]], [0.]]
print(len(w))
#define y =k*x+b
def feed_forward(inputs,outputs, weights):
out =np.dot(inputs,weights[0])+weights[1]
squared_error =(np.square(out-outputs))
return squared_error
def update_weights(inputs,outputs,weights,epochs):
for epoch in range(epochs):
org_loss =feed_forward(inputs,outputs,weights)
wts_tmp = deepcopy(weights)
wts_tmp2 = deepcopy(weights)
for i in range(len(weights)):
wts_tmp[-(i+1)] += 0.0001
loss = feed_forward(inputs, outputs, wts_tmp)
delta_loss = np.sum(org_loss - loss)/(0.0001*len(inputs))
wts_tmp2[-(i+1)]+= delta_loss*0.01
wts_tmp = deepcopy(weights)
weights = deepcopy(wts_tmp2)
return wts_tmp2
weigths_new =update_weights(x,y,w,1000)
for i in range(len(weights)):
因为当我搜索这个错误时,用户说使用范围命令,我使用了,我也按部分检查,索引工作正常,那么错误的来源是什么呢?谢谢我找到了下面的解决方案
from google.colab import drive
drive.mount('/content/drive')
import numpy as np
from copy import deepcopy
x =[[1],[2],[3],[4]]
y = [[2],[4],[6],[8]]
w = [[1.477867], [0.]]
#define y =k*x+b
def feed_forward(inputs,outputs, weights):
out =np.dot(inputs,weights[0])+weights[1]
squared_error =(np.square(out-outputs))
return squared_error
def update_weights(inputs,outputs,weights,epochs):
for epoch in range(epochs):
org_loss =feed_forward(inputs,outputs,weights)
wts_tmp = deepcopy(weights)
wts_tmp2 = deepcopy(weights)
for i in range(len(weights)):
wts_tmp[i][0] += 0.0001
loss = feed_forward(inputs, outputs, wts_tmp)
delta_loss = np.sum(org_loss - loss)/(0.0001*len(inputs))
wts_tmp2[i][0]+= delta_loss*0.01
wts_tmp = deepcopy(weights)
weights = deepcopy(wts_tmp2)
return wts_tmp2
weigths_new =update_weights(x,y,w,10000)
print(weigths_new)
它给了我以下的答案
[[-0.000999999090816253],[5.0004499999979719]您会收到一个打字错误,因为此时
i=0
,所以-(i+1)=-1
,您的列表wts_tmp=[[1.477867]],[0.0]
,所以wts_tmp[-1]
是列表[0.0]
,当您尝试执行,python实际上使用了list
类中的inplace add特殊方法\uuu iadd\uuu
,像这样传递float0.0001
。\uuu iadd\uuuu(0.0001)
,然后它假设您正在添加两个iterable,但0.0001
不是,因此,您得到的错误TypeError:“float”对象是不可编辑的
注意:
上面的答案是在@deceze comment之后编辑的,以反映这里使用的主要机制是
\uuuu iadd\uuu
,而不是operator.iadd()
operator.iadd([0.0],0.0001)
相当于[0.0]+=0.0001
,最终从list
类调用\uu iadd\uuu
,因此operator.iadd([0.0],0.0001)
的结果是相同的:类型错误:“float”对象是不可移植的
wts\u tmp
是一个dict吗?不,是list,我尝试添加额外的括号,但仍然不起作用,为什么括号中有一个-
,我想访问列表的第一个和最后一个元素,可能我认为这更像是[0.0]。\uuuu iadd\uuuuu(0.0001)
,操作符
模块不是这里的主要机制…但是,是的,通常你的解释是正确的。@deceze感谢你的更正。我更新了我的答案,将\uuuu iadd\uuuuuuu
作为主要机制,见上文。更挑剔的是,它类似于类型([0.0])。\uuu iadd\uuuuu([0.0],0.0001)
,但你明白了…