Есть ли способ получить атрибут coefs_ перед установкой sklearn MLPRegressor? - PullRequest
0 голосов
/ 26 июня 2018

Я новичок в машинном обучении, и я тренируюсь, чтобы создать нейронную сеть, которая приближает функции. Просто с целью изучения и просмотра состояний нейронной сети, я хотел бы знать начальные коэффициенты нейронной сети. Вот воспроизводимый пример:

import sklearn.neural_network as sknn
import numpy as np

LIMIT = 10.0

# Function I want to approximate
def funcion(x):
    if x<3:
        return 0
    if x>7:
        return 12
    return 3*(x-3)

X = np.array([])    
Y = np.array([])    

# Data training set
for x in np.arange(0.0, LIMIT, 1.5):
    X = np.append(X, x)
    Y = np.append(Y, funcion(x))

X = np.append(X,10)
Y = np.append(Y, funcion(10))

X = np.reshape(X, (-1,1))

nn = sknn.MLPRegressor(
    learning_rate_init=0.01, 
    learning_rate = 'constant',
    activation='logistic',  
    hidden_layer_sizes=(2,1),
    max_iter=1,
    random_state=None)


print('coefficients: ', nn.coefs_)  # THIS GIVES THE ERROR

nn.fit(X, Y)

Выход:

Traceback (most recent call last):
  File "aproxFun2.py", line 41, in <module>
    print('coefficients: ', nn.coefs_)
AttributeError: 'MLPRegressor' object has no attribute 'coefs_'

Он печатает данные всякий раз, когда я вызываю nn.coefs_ после Я вызываю функцию nn.fit(X, Y), но я хочу узнать значения перед установкой.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Считывая исходный код ( ссылка ), инициализация выполняется итеративно для всех слоев следующим способом:

def _init_coef(self, fan_in, fan_out):
    if self.activation == 'logistic':
        # Use the initialization method recommended by
        # Glorot et al.
        init_bound = np.sqrt(2. / (fan_in + fan_out))
    elif self.activation in ('identity', 'tanh', 'relu'):
        init_bound = np.sqrt(6. / (fan_in + fan_out))
    else:
        # this was caught earlier, just to make sure
        raise ValueError("Unknown activation function %s" %
                         self.activation)

    coef_init = self._random_state.uniform(-init_bound, init_bound,
                                           (fan_in, fan_out))
    intercept_init = self._random_state.uniform(-init_bound, init_bound,
                                                fan_out)
    return coef_init, intercept_init

, где fan_in и fan_out представляют размер ввода соответственно. выходной слой.

Таким образом, вы можете определить инициализацию для фиксированного случайного состояния, запустив приведенный выше код.

Что касается самой инициализации, веса выбираются из равномерного распределения с центром в 0. Поддержка распределения является функцией размеров выходного и входного слоев. См. Справочный документ Понимание сложности обучения глубоких нейронных сетей прямой связи для получения более подробной информации.

0 голосов
/ 26 июня 2018

coefs_ не инициализируется перед вызовом _initialize(self, y, layer_units) (в fit ()), поэтому я думаю, вы не можете.

...