Как я могу реализовать функциональность активации Keras с помощью tenorflow? - PullRequest
0 голосов
/ 30 января 2019

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

весь код керасы для модели:

    model = Sequential()
    model.add(Dense(30, input_dim=15, activation='relu'))
    model.add(Dense(30, activation='relu'))
    model.add(Dense(5, activation='linear'))
    model.summary()
    model.compile(loss='mse', optimizer=Adam(lr=self.learning_rate))

весь код тензорного потока для модели:

W1 = tf.Variable(tf.random_uniform([15, 30], -1., 1.))
W2 = tf.Variable(tf.random_uniform([30, 30], -1., 1.))
W3 = tf.Variable(tf.random_uniform([30, 5], -1., 1.))

b1 = tf.Variable(tf.zeros([30]))
b2 = tf.Variable(tf.zeros([30]))
b3 = tf.Variable(tf.zeros([5]))

L1 = tf.add(tf.matmul(X, W1), b1)
L1 = tf.nn.relu(L1)
L2 = tf.add(tf.matmul(L1, W2), b2)
L2 = tf.nn.relu(L2)
model = tf.add(tf.matmul(L2, W3),b3)

cost = tf.reduce_mean(tf.squared_difference(model,Y))
optimizer = tf.train.AdamOptimizer(learning_rate=0.01)
train_op = optimizer.minimize(cost)

Но яВыяснилось, что масштабы вывода моделей сильно отличаются между ними.Например, выход кода ниже keras составляет [0,4208471 -0,58310926 0,00578364 0,09069238 -1,1442541], а тензор потока равен [9,947895 39,215603 -23,376497 21,344461 -7,0058045].Дело в том, что производительность keras намного лучше, чем у кода tenorflow.

Мой вопрос заключается в том, что именно он делает в keras model.add с линейной активацией.Я предполагаю, что некоторая нормализация сделана.Я сделал rando_uniform для инициализации уйтов, но я не уверен, что random_normal лучше, чем он.Во всяком случае, я хочу точно знать и как преобразовать его в код тензорного потока.

[keras] 
model.add(Dense(5, activation='linear'))

[changed with tensorflow] 
W3 = tf.Variable(tf.random_uniform([30, 5], -1., 1.))
b3 = tf.Variable(tf.zeros([5]))
tf.add(tf.matmul(L2, W3),b3) 

Я пытался использовать tf.keras.activation.linear, но все равно кажется, что он немного другой.

Заранее спасибо.

1 Ответ

0 голосов
/ 30 января 2019

Тензорным эквивалентом Dense является tf.layers.dense: https://www.tensorflow.org/api_docs/python/tf/layers/dense.
В вашем случае это будет:

L1=tf.layers.dense(x,30,activation=tf.nn.relu)
L2=tf.layers.dense(x,30,activation=tf.nn.relu)
model=tf.layers.dense(x,5)

Вы, вероятно, замечаете разницу в разнице в производительности из-за проблем винициализация.Я думаю, что по умолчанию используется инициализация ксавье.Если вы не собираетесь добавлять пакетную нормализацию, инициализация может быть полезной.

...