关于python中的 take no arguments 的解决方法
针对第四章编写的代码出现的错误做一个总结
Traceback (most recent call last):
File "H:\image\chapter4\p81_chongxie.py", line 160, in <module>
l1 = Linear(X, W1, b1)
TypeError: Linear() takes no arguments
出问题时的init方法的图片
可以看出init两边只有一个下划线 _.
解决办法:把init的两边改成两个下划线 __。即可。
代码运行环境:win7系统 + anaconda3_2020
第四章的代码如下:
#######################数据结构部分#############################################
import numpy as np
import matplotlib.pyplot as plt # %matplotlib inline class Node(object):
def __init__(self, inbound_nodes = []):
self.inbound_nodes = inbound_nodes
self.value = None
self.outbound_nodes = [] self.gradients = {} for node in inbound_nodes:
node.outbound_nodes.append(self) def forward(self):
raise NotImplementedError def backward(self):
raise NotImplementedError class Input(Node):
def __init__(self):
Node.__init__(self) def forward(self):
pass def backward(self):
self.gradients = {self : 0}
for n in self.outbound_nodes:
self.gradients[self] += n.gradients[self] ##################################################################################
class Linear(Node):
def __init__(self, X, W, b):
Node.__init__(self, [X, W, b]) def forward(self):
X = self.inbound_nodes[0].value
W = self.inbound_nodes[1].value
b = self.inbound_nodes[2].value
self.value = np.dot(X, W) + b def backward(self):
self.gradients = {n: np.zeros_like(n.value) for n in self.inbound_nodes }
for n in self.outbound_nodes:
grad_cost = n.gradients[self]
self.gradients[self.inbound_nodes[0]] += np.dot(grad_cost, self.inbound_nodes[1].value.T)
self.gradients[self.inbound_nodes[1]] += np.dot(self.inbound_nodes[0].value.T, grad_cost)
self.gradients[self.inbound_nodes[2]] += np.sum(grad_cost, axis = 0, keepdims = False) ###################################################################################
class Sigmoid(Node):
def __init__(self, node):
Node.__init__(self, [node]) def _sigmoid(self, x):
return 1. / (1. + np.exp(-x)) #exp() 方法返回x的指数,e的x次幂 def forward(self):
input_value = self.inbound_nodes[0].value
self.value = self._sigmoid(input_value) def backward(self):
self.gradients = {n: np.zeros_like(n.value) for n in self.inbound_nodes}
for n in self.outbound_nodes:
grad_cost = n.gradients[self]
sigmoid = self.value
self.gradients[self.inbound_nodes[0]] += sigmoid * (1 - sigmoid) * grad_cost class MSE(Node):
def __init__(self, y, a):
Node.__init__(self, [y, a]) def forward(self):
y = self.inbound_nodes[0].value.reshape(-1, 1)
a = self.inbound_nodes[1].value.reshape(-1, 1) self.m = self.inbound_nodes[0].value.shape[0]
self.diff = y - a
self.value = np.mean(self.diff**2) def backward(self):
self.gradients[self.inbound_nodes[0]] = (2 / self.m) * self.diff
self.gradients[self.inbound_nodes[1]] = (-2 / self.m) * self.diff ##########################计算图部分#############################################
def topological_sort(feed_dict):
input_nodes = [n for n in feed_dict.keys()]
G = {}
nodes = [n for n in input_nodes]
while len(nodes) > 0:
n = nodes.pop(0)
if n not in G:
G[n] = {'in' : set(), 'out' : set()}
for m in n.outbound_nodes:
if m not in G:
G[m] = {'in' : set(), 'out' : set()}
G[n]['out'].add(m)
G[m]['in'].add(n)
nodes.append(m) L = []
S = set(input_nodes)
while len(S) > 0 :
n = S.pop()
if isinstance(n, Input):
n.value = feed_dict[n]
L.append(n)
for m in n.outbound_nodes:
G[n]['out'].remove(m)
G[m]['in'].remove(n)
if len(G[m]['in']) == 0 :
S.add(m)
return L #######################使用方法##############################################
#首先由图的定义执行顺序
#graph = topological_sort(feed_dict)
def forward_and_backward(graph):
for n in graph :
n.forward() for n in graph[:: -1]:
n.backward() #对各个模块进行正向计算和反向求导
#forward_and_backward(graph) #########################介绍梯度下降################
def sgd_update(trainables, learning_rate = 1e-2):
for t in trainables :
t.value = t.value - learning_rate * t.gradients[t] ###########使用这个模型#################################
from sklearn.utils import resample
from sklearn import datasets # %matplotlib inline data = datasets.load_iris()
X_ = data.data
y_ = data.target
y_[y_ == 2] = 1 # 0 for virginica, 1 for not virginica
print(X_.shape, y_.shape) # out (150,4) (150,) ########################用写的模块来定义这个神经网络######################### np.random.seed(0)
n_features = X_.shape[1]
n_class = 1
n_hidden = 3 X, y = Input(), Input()
W1, b1 = Input(), Input()
W2, b2 = Input(), Input() l1 = Linear(X, W1, b1)
s1 = Sigmoid(l1)
l2 = Linear(s1, W2, b2)
t1 = Sigmoid(l2)
cost = MSE(y, t1) ###########训练模型###########################################
#随即初始化参数值
W1_0 = np.random.random(X_.shape[1] * n_hidden).reshape([X_.shape[1], n_hidden])
W2_0 = np.random.random(n_hidden * n_class).reshape([n_hidden, n_class])
b1_0 = np.random.random(n_hidden)
b2_0 = np.random.random(n_class) #将输入值带入算子
feed_dict = {
X: X_, y: y_,
W1:W1_0, b1: b1_0,
W2:W2_0, b2: b2_0
} #训练参数
#这里训练100轮(eprochs),每轮抽4个样本(batch_size),训练150/4次(steps_per_eproch),学习率 0.1
epochs = 100
m = X_.shape[0]
batch_size = 4
steps_per_eproch = m // batch_size
lr = 0.1 graph = topological_sort(feed_dict)
trainables = [W1, b1,W2, b2] l_Mat_W1 = [W1_0]
l_Mat_W2 = [W2_0] l_loss = []
for i in range(epochs):
loss = 0
for j in range(steps_per_eproch):
X_batch, y_batch = resample(X_, y_, n_samples = batch_size)
X.value = X_batch
y.value = y_batch forward_and_backward(graph)
sgd_update(trainables, lr)
loss += graph[-1].value l_loss.append(loss)
if i % 10 ==9 :
print("Eproch %d, Loss = %1.5f" % (i, loss)) #图形化显示
plt.plot(l_loss)
plt.title("Cross Entropy value")
plt.xlabel("Eproch")
plt.ylabel("Loss")
plt.show() ##########最后用模型预测所有的数据的情况
X.value = X_
y.value = y_
for n in graph:
n.forward() plt.plot(graph[-2].value.ravel())
plt.title("predict for all 150 Iris data")
plt.xlabel("Sample ID")
plt.ylabel("Probability for not a virginica")
plt.show()
关于python中的 take no arguments 的解决方法的更多相关文章
- Python中pip install MySQL-python报错解决方法
环境 Centos 7(其他Centos或者RHEL一样) 问题 在执行 pip install MySQL-python 时报错如: Command "python setup.py eg ...
- Python中执行系统命令常见的几种方法--转载
Python中执行系统命令常见的几种方法 Python中执行系统命令常见的几种方法有: (1)os.system # 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 # 如果再命令行下执 ...
- Python中日期和时间格式化输出的方法
本文转自:https://www.jb51.net/article/62518.htm 本文实例总结了python中日期和时间格式化输出的方法.分享给大家供大家参考.具体分析如下: python格式化 ...
- python中readline判断文件读取结束的方法
注:内容来自网络 本文实例讲述了python中readline判断文件读取结束的方法.分享给大家供大家参考.具体分析如下: 大家知道,python中按行读取文件可以使用readline函数,下面现介绍 ...
- python中执行shell命令的几个方法小结(转载)
转载:http://www.jb51.net/article/55327.htm python中执行shell命令的几个方法小结 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014- ...
- Python中转换角度为弧度的radians()方法
Python中转换角度为弧度的radians()方法 这篇文章主要介绍了Python中转换角度为弧度的radians()方法,是Python入门中的基础知识,需要的朋友可以参考下 radians()方 ...
- Python使用easy-install安装时报UnicodeDecodeError的解决方法
Python使用easy-install安装时报UnicodeDecodeError的解决方法,有需要的朋友可以参考下. 问题描述: 在使用easy-install安装matplotlib.pypar ...
- sql server 还原数据库后,删除用户,提示数据库主体在该数据库中拥有架构,无法删除解决方法
将另一台服务器上的数据库备份文件,在现在用的这台服务器上还原之后,再创建相同的用户名,提示用户已存在 想将之前的用户先删除掉,却提示“数据库主体在该数据库中拥有架构,无法删除解决方法” 在网上找到方法 ...
- jquery中checkbox全选失效的解决方法
这篇文章主要介绍了jquery中checkbox全选失效的解决方法,需要的朋友可以参考下 如果你使用jQuery 1.6 ,代码if ( $(elem).attr(“checked”) ),将 ...
随机推荐
- 性能测试之jmeter逻辑控制种类详解一
逻辑控制器介绍 Jmeter逻辑控制可以对元件的执行逻辑进行控制,除Once only Controller仅一次控制器以外,其他控制器都可以可以嵌套其他种类的控制器,下面是jmeter5.3支持的控 ...
- JavaScript学习 Ⅵ (正则表达式)
十三. 正则表达式 正则表达式用于定义一些字符串的规则,计算机可以根据正则表达式,来检查一个字符串是否符合规则,将字符串中符合规则的内容提取出来. 创建正则表达式对象 构造函数 var reg = n ...
- CentOS7安装Oracle 11g
准备工作 1.下载Oracle安装包:linux.x64_11gR2_database_1of2.zip 和 linux.x64_11gR2_database_2of2.zip ,可以下载到本地,通过 ...
- MYSQL 之 JDBC(七):增删改查(五) DAO设计模式
Data Access Object,数据访问对象 what:访问数据信息的类.包含了对数据的CRUD(create.read.update.delete,增删改查)操作,而不包含任何业务相关的信息. ...
- 接口测试框架实战(三)| JSON 请求与响应断言
关注公众号,获取测试开发实战干货合辑.本文节选自霍格沃兹<测试开发实战进阶>课程教学内容. 数据驱动就是通过数据的改变驱动自动化测试的执行,最终引起测试结果的改变.简单来说,就是参数化在自 ...
- bzoj4236JOIOJI
bzoj4236JOIOJI 题意: 给一个只由JOI三个字母组成的串,求最长的一个子串使其中JOI三个字母出现次数相等.串长度≤200000 题解: 有点像bzoj4384,因此推算的过程是差不多的 ...
- Oracle-常见的命令
--------------输入一下指令,按下快捷键 F8 select * from emp; --------------创建表格 create table 表名( 字段名1 数据类型1, 字段名 ...
- js获取div对象几何信息
/** * @description 获取对象信息: * bottom: 208 * height: 200 (老版本IE不兼容) * width: 200 (老版本IE不兼容) * left: 8 ...
- 怎样从gitHub上面拉项目
1.注册 https://gitee.com/oschina 2.拿到代码在gitHub上的地址 3.打开eclipse-->import https://git.oschina.net/cai ...
- 阿里面试官:这些软件测试面试题都答对了,I want you!
[ 你悄悄来,请记得带走一丝云彩 ] 测试岗必知必会 01请描述如何划分缺陷与错误严重性和优先级别? 给软件缺陷与错误划分严重性和优先级的通用原则: 1. 表示软件缺陷所造成的危害和恶劣程度. 2. ...