Определенные функции не распознаются 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 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 и получил аналогичную ошибку.

Знаете ли вы, почему определенные функции активации не были распознаны?

Комментарии:

1. Разве это не должно быть activation_fn=network3.ReLU (или network3.linear ), поскольку вы не импортируете ReLU (или linear ) по имени

2. Ваш код (который использует linear вместо ReLu ) не соответствует вашему сообщению об ошибке. Номера строк также не совпадают.

3. Я отредактировал опечатки при копировании значений из Jupyternotebook в вопросы

Ответ №1:

Как прокомментировал @khelwood, при импорте модулей с использованием import network3 вам необходимо предоставить пространство имен для доступа к функциям и классам, определенным внутри network3 :

 network3.ReLu
network3.linear
network3.ConvPoolLayer
  

Чтобы их можно было просто использовать ReLu , linear и ConvPoolLayer вы можете изменить строку импорта на одну из следующих:

 from network3 import *
  

или

 from network3 import ReLu, linear, ConvPoolLayer
  

Комментарии:

1. Я думал, from network3 import * что нужно импортировать все , так зачем же импортировать отдельную функцию?

2. Я сказал » одну из следующих» . Я отредактирую и разделю на два блока, чтобы избежать недоразумений

3. Привет, Хемерсон, ты знаешь, почему в исходном коде Майкл Нильсен не импортировал функции активации и не использовал префикс network3. для функции активации? Это был недосмотр?