Инициализация члена смещения в моей модели нелинейной регрессии с использованием TensorFlow

Я пытаюсь создать базовую модель нелинейной регрессии, которая будет предсказывать индекс доходности компаний в FTSE350.

Я не уверен, как должен выглядеть мой член смещения с точки зрения размеров и правильно ли я использую его в методе вычислений:

w1 = tf.Variable(tf.truncated_normal([4, 10], mean=0.0, stddev=1.0, dtype=tf.float64))
b1 = tf.Variable(tf.constant(0.1, shape=[4,10], dtype = tf.float64))

w2 = tf.Variable(tf.truncated_normal([10, 1], mean=0.0, stddev=1.0, dtype=tf.float64))
b2 = tf.Variable(tf.constant(0.1, shape=[1], dtype = tf.float64))

def calculations(x, y):
    w1d = tf.matmul(x, w1)
    h1 = (tf.nn.sigmoid(tf.add(w1d, b1)))
    h1w2 = tf.matmul(h1, w2)
    activation = tf.add(tf.nn.sigmoid(tf.matmul(h1, w2)), b2)
    error = tf.reduce_sum(tf.pow(activation - y,2))/(len(x))

    return [ activation, error ]        

Мои первоначальные мысли заключались в том, что он должен быть того же размера, что и мои веса, но я получаю эту ошибку:

ValueError: Dimensions must be equal, but are 251 and 4 for 'Add' (op: 'Add') with input shapes: [251,10], [4,10]

Я играл с разными идеями, но, похоже, ничего не получается.

(Мои входные данные имеют 4 функции)

Структура сети, которую я пробовал, состоит из 4 нейронов во входном слое, 10 в скрытом слое и 1 в выходном слое позже, но я чувствую, что могу перепутать размеры и в моем слое весов?


person MahDhan    schedule 26.07.2017    source источник


Ответы (2)


Когда вы строите слои для полностью связанной нейронной сети с прямой связью (как в вашем примере), форма смещений должна быть равна количеству узлов в соответствующем слое. Итак, в вашем случае, поскольку ваша весовая матрица имеет форму (4, 10), у вас есть 10 узлов в этом слое, и вы должны использовать:

b1 = tf.Variable(tf.constant(0.1, shape=[10], type = tf.float64))

Причина этого в том, что когда вы выполняете w1d = tf.matmul(x, w1), вы фактически получаете матрицу формы (batch_size, 10) (если batch_size — это количество строк в вашей входной матрице). Это потому, что вы умножаете матрицу (batch_size, 4) на весовую матрицу (4, 10). Затем вы добавляете смещение к каждому столбцу w1d, которое может быть представлено в виде 10-мерного вектора, который вы получили бы, если бы вы сделали форму b1 [10].

Без последующей нелинейности (сигмоиды) это называется аффинным преобразованием, о котором вы можете узнать больше здесь: https://en.wikipedia.org/wiki/Affine_transformation.

Другим замечательным ресурсом является Stanford Deep Learning Tutorial, в котором хорошо объясняется, как работают эти модели прямой связи: http://ufldl.stanford.edu/tutorial/supervised/MultiLayerNeuralNetworks/.

Надеюсь, это помогло!

person ksrinivasan    schedule 26.07.2017

Я думаю, что ваш b1 должен иметь размерность 10, и ваш код должен работать

Поскольку 4 — это количество функций, а 10 — это количество нейронов в вашем первом слое (я думаю, с точки зрения нейронной сети...)

тогда вы должны добавить смещение размера = 10

Также вы можете увидеть смещения как добавление дополнительной функции постоянного значения = 1.

посмотрите этот PDF-файл, если у вас есть время, он очень хорошо объяснен: https://cs.stanford.edu/~quocle/tutorial1.pdf

person J.Zagdoun    schedule 26.07.2017