作者书中给出的sigmod代码是如下部分:
def sigmoid_simple(x):
x = as_avriable(x)
y = 1 / (1 + exp(-x))
return y
在从图灵社区上下载的代码包里,我们可以看到完整的sigmod类及方法的代码,如下:
class Sigmoid(Function):
def forward(self, x):
xp = cuda.get_array_module(x)
# y = 1 / (1 + xp.exp(-x))
y = xp.tanh(x * 0.5) * 0.5 + 0.5 # Better implementation
return y
def backward(self, gy):
y = self.outputs[0]()
gx = gy * y * (1 - y)
return gx
def sigmoid(x):
return Sigmoid()(x)
如果按照上述代码执行step 43里的神经网络案例,由于之前我们对于输入值的格式要求必须是np.ndarray的实例:
def __init__(self, data, name=None): # 初始化数据方法,先给name变量初始为None
if data is not None: # 规范数据输入格式,即必须为np.array格式。
if not isinstance(data, np.ndarray): # 判断数据是否是ndarray的实例,如果不是,则报错
raise TypeError('{} is not supported'.format(type(data)))
所以会报出错误:
raise TypeError('{} is not supported'.format(type(data)))
TypeError: <class 'xxx.core.Variable'> is not supported
所以,我们要对作者给出的代码进行调整:
def sigmoid_simple(x):
#x = as_avriable(x) 把这一句标注掉
y = 1 / (1 + np.exp(-x)) # 选用numpy的exp方法
return y
再次运行神经网络的训练代码,得到正确结果:
variable(0.8473695850105871)
variable(0.2514286285183606)
variable(0.2475948546674987)
variable(0.23786120447054812)
variable(0.21222231333102917)
variable(0.1674218111783416)
variable(0.0968193261999267)
variable(0.07849528290602333)
variable(0.07749729552991154)
variable(0.07722132399559317)