3
votes

Le modèle Tensorflow fonctionne bien moins bien que le modèle Keras

J'avais un problème avec mon modèle Tensorflow et j'ai décidé d'essayer Keras. Il me semble au moins que je crée le même modèle avec les mêmes paramètres, mais le modèle Tensorflow sort juste la valeur moyenne de train_y alors que le modèle Keras varie en fait en fonction de l'entrée. Est-ce que je manque quelque chose dans ma session tf? J'utilise habituellement Tensorflow et je n'ai jamais eu de problème comme celui-ci. Code Tensorflow:

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)

Cela a une erreur absolue moyenne de 0,682 et une erreur quadratique moyenne de 0,891.

Le code Keras:

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)


2 commentaires

Est-ce que ce score provient de la prédiction avec test?


Oui, désolé si je n'étais pas clair à ce sujet.


3 Réponses :


0
votes

Il n'y a pas de différence évidente dans les modèles, mais les différents résultats pourraient éventuellement être expliqués en raison de variations aléatoires dans l'entraînement. D'autant plus que vous ne vous entraînez que pendant 10 époques, les résultats pourraient être assez sensibles aux poids initiaux choisis au hasard pour les modèles.


0 commentaires

1
votes

Je vais essayer de souligner les différences entre les deux codes.

La documentation Keras ici montre que les poids sont initialisés par 'glorot_uniform' alors que vos poids sont initialisés par défaut, très probablement au hasard car la documentation ne spécifie pas clairement de quoi il s'agit initiation tensorflow . Donc l'initialisation est très probablement différente et c'est définitivement compte.

La deuxième différence est très probablement due à la différence dans le type de données d'entrée, l'un étant numpy.float32 et l'autre étant le type d'entrée par défaut de keras, qui encore une fois n'a pas été spécifié par la documentation


3 commentaires

Le type de données d'entrée par défaut de Keras est float32.


Êtes-vous sûr? J'imagine qu'il est déduit du type d'entrée qu'il reçoit.


Veuillez vous reporter à github.com/keras-team / keras / blob / master / keras / engine /…



1
votes

@Priyank Pathak et @lehiester ont donné des points valables. Compte tenu de leurs suggestions, je peux vous suggérer de modifier les éléments suivants et de vérifier à nouveau:

  1. Utilisez les mêmes kernel_initializer et data_type
  2. Utilisez plus d'époques pour une meilleure généralisation
  3. Amorcez vos fonctions random , numpy et tensorflow

0 commentaires