Python无法识别已定义的函数

2024-06-10 19:03:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为network3的对象,其中包含定义激活函数linearReLu以及层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 notebook中,当我运行以下代码时:

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

我将代码更改为activation_fn=linear,并得到了类似的错误。你知道吗

你知道为什么定义的激活函数不能被识别吗?你知道吗


Tags: fromimageimportsizebatchtheanofilteractivation
1条回答
网友
1楼 · 发布于 2024-06-10 19:03:06

正如@khelwood在使用import network3导入模块时所评论的那样,您需要提供命名空间来访问network3中定义的函数和类:

network3.ReLu
network3.linear
network3.ConvPoolLayer

为了能够简单地使用ReLulinearConvPoolLayer,您可以将导入行更改为以下内容之一:

from network3 import *

或者

from network3 import ReLu, linear, ConvPoolLayer

相关问题 更多 >