Python无法识别已定义的函数
我有一个名为Python无法识别已定义的函数,python,conv-neural-network,Python,Conv Neural Network,我有一个名为network3的对象,其中包含定义激活函数linear和ReLu和层ConvPoolLayer的代码: ### network3.py # Libraries import numpy as np import theano import theano.tensor as T from theano.tensor.nnet import conv from theano.tensor.nnet import softmax from theano.tensor import sha
network3
的对象,其中包含定义激活函数linear
和ReLu
和层ConvPoolLayer
的代码:
### network3.py
# Libraries
import numpy as np
import theano
import theano.tensor as T
from theano.tensor.nnet import conv
from theano.tensor.nnet import softmax
from theano.tensor import shared_randomstreams
from theano.tensor.signal import pool
# Activation functions for neurons
def linear(z): return z
def ReLU(z): return T.maximum(0.0, z)
from theano.tensor.nnet import sigmoid
from theano.tensor import tanh
...
class ConvPoolLayer(object):
def __init__(self, filter_shape, image_shape, poolsize=(2, 2), activation_fn=sigmoid):
self.activation_fn=activation_fn
...
但是,在Jupyter笔记本中,当我运行以下代码时:
import network3
from network3 import Network
from network3 import ConvPoolLayer , FullyConnectedLayer , SoftmaxLayer
net = Network([
ConvPoolLayer(image_shape=(mini_batch_size , 1, 28, 28),
filter_shape=(20, 1, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
ConvPoolLayer(image_shape=(mini_batch_size , 20, 12, 12),
filter_shape=(40, 20, 5, 5),
poolsize=(2, 2),
activation_fn=ReLU),
FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU),
SoftmaxLayer(n_in=100, n_out=10)],
mini_batch_size)
net.SGD(expanded_training_data, 60, mini_batch_size, 0.03,
validation_data, test_data , lmbda=0.1)
它返回了一个错误:
NameError Traceback (most recent call last)<ipython-input-4-55105ca84f86> in <module>
5 filter_shape=(20, 1, 5, 5),
6 poolsize=(2, 2),
----> 7 activation_fn=ReLU),
8 ConvPoolLayer(image_shape=(mini_batch_size , 20, 12, 12),
9 filter_shape=(40, 20, 5, 5),
NameError: name 'ReLU' is not defined
namererror回溯(最近一次调用最后一次)
5过滤器_形状=(20,1,5,5),
6池大小=(2,2),
---->7激活(fn=ReLU),
8层(图像形状=(最小批量大小,20,12,12),
9过滤器_形状=(40,20,5,5),
NameError:未定义名称“ReLU”
我将代码更改为activation\u fn=linear
,得到了类似的错误
您知道定义的激活函数未被识别的原因吗?正如@khelwood在使用
import network3
导入模块时所评论的那样,您需要提供名称空间来访问network3
中定义的函数和类:
network3.ReLu
network3.linear
network3.ConvPoolLayer
为了能够简单地使用ReLu
、linear
和ConvPoolLayer
,您可以将导入行更改为以下选项之一:
from network3 import *
或
这不应该是
activation\u fn=network3.ReLU
(或network3.linear
),因为您不是按代码名导入ReLU
(或linear
),而是使用linear
)与您的错误消息不匹配。行号也不匹配。我在将Jupyternotebook中的值复制到问题中时编辑了打字错误。我认为network3 import*的意味着导入所有内容,那么为什么需要导入单个函数呢?我说了“以下其中一项”.为了避免误解,我将编辑并分为两个块Shi Hemerson,你知道为什么在原始代码中,Michael Nielsen没有导入激活函数,也没有使用前缀network3.对于激活函数,这是一个疏忽吗?
from network3 import ReLu, linear, ConvPoolLayer