Модель Tensorflow работает значительно хуже, чем модель Keras - PullRequest
2 голосов
/ 10 мая 2019

У меня была проблема с моей моделью Tensorflow, и я решил попробовать Keras.По крайней мере, мне кажется, что я создаю ту же модель с теми же параметрами, но модель Tensorflow просто выводит среднее значение train_y, в то время как модель Keras фактически меняется в зависимости от входных данных.Я что-то упустил в моей сессииЯ обычно использую Tensorflow и никогда не сталкивался с такой проблемой.Код Tensorflow:

score_inputs = tf.placeholder(np.float32, shape=(None, 100))
targets = tf.placeholder(np.float32, shape=(None), name="targets")

l2 = tf.contrib.layers.l2_regularizer(0.01)

first_layer = tf.layers.dense(score_inputs, 100, activation=tf.nn.relu, kernel_regularizer=l2)
outputs = tf.layers.dense(first_layer, 1, activation = None, kernel_regularizer=l2)

optimizer = tf.train.AdamOptimizer(0.001)
l2_loss = tf.losses.get_regularization_loss()
loss = tf.reduce_mean(tf.square(tf.subtract(targets, outputs)))
loss += l2_loss
rmse = tf.sqrt(tf.reduce_mean(tf.square(outputs - targets)))
mae = tf.reduce_mean(tf.sqrt(tf.square(outputs - targets)))
training_op = optimizer.minimize(loss)

batch_size = 32

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for epoch in range(10):
        avg_train_error = []
        for i in range(len(train_x) // batch_size):
            batch_x = train_x[i*batch_size: (i+1)*batch_size]
            batch_y = train_y[i*batch_size: (i+1)*batch_size]
            _, train_loss = sess.run([training_op, loss], {score_inputs: batch_x, targets: batch_y})

    feed = {score_inputs: test_x, targets: test_y}
    test_loss, test_mae, test_rmse, test_ouputs = sess.run([loss, mae, rmse, outputs], feed)

Это имеет среднюю абсолютную ошибку 0,682 и среднеквадратическую ошибку 0,891.

Код Keras:

inputs = Input(shape=(100,))
hidden = Dense(100, activation="relu", kernel_regularizer = regularizers.l2(0.01))(inputs)
outputs = Dense(1, activation=None, kernel_regularizer = regularizers.l2(0.01))(hidden)
model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer=keras.optimizers.Adam(lr=0.001), loss='mse', metrics=['mae'])
model.fit(train_x, train_y, batch_size=32, epochs=10, shuffle=False)
keras_pred = model.predict(test_x)

Это имеетсредняя абсолютная ошибка 0,601 и среднеквадратическая ошибка 0,753.

Мне кажется, что я определяю одну и ту же сеть в обоих случаях, но, как я уже говорил, модель Tensorflow выводит только среднее значение train_y, тогда какмодель Keras работает намного лучше.Есть предложения?

Ответы [ 3 ]

0 голосов
/ 10 мая 2019

Я попытаюсь указать на различия между двумя кодами.

Документация Keras здесь показывает, что веса инициализируются с помощью 'glorot_uniform', тогда как ваши веса инициализируются по умолчанию, скорее всего, случайным образом, поскольку в документации не ясно указано, что это за инициализация тензорного потока . Так что инициализация, скорее всего, отличается, и это определенно вопросы.

Второе отличие, скорее всего, связано с различием в типе данных ввода, одно из которых - numpy.float32, а другое - тип ввода по умолчанию keras, который опять-таки не указан в документации

0 голосов
/ 10 мая 2019

@ Приянк Патхак и @lehiester дали несколько правильных баллов. Принимая во внимание их предложения, я могу предложить вам изменить следующие вещи и проверить еще раз:

  1. Используйте те же kernel_initializer и data_type
  2. Используйте больше эпох для лучшего обобщения
  3. Заполните ваши random, numpy и tensorflow функции
0 голосов
/ 10 мая 2019

Нет очевидных различий в моделях, но разные результаты, возможно, могут быть объяснены из-за случайных изменений в обучении.Тем более, что вы тренируетесь только для 10 эпох, результаты могут быть довольно чувствительны к случайно выбранным начальным весам для моделей.

Попробуйте запустить с большим количеством эпох (например, 1000) и запускать каждую из них несколько раз (например,5) - средние результаты должны быть достаточно близки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...