Modeli dondurun ve eğitin

Sep 17 2020

Colab'da Keras Tensorflow kullanıyorum. Bir model uydurup kaydediyorum. Sonra yüklerim ve performansını kontrol ederim ve tabii ki aynı olmalı. Sonra dondururum ve tekrar takarım. Sonrasında modelin de aynı performansa sahip olmasını beklerdim. Tabii ki, parti boyutu farklılıkları nedeniyle "eğitim" sırasında doğrulukta farklılıklar olabilir. Ancak daha sonra model.evaluate ile kontrol ederken, model donduğu için ağırlıklar değiştirilemediğinden hiçbir farklılık beklemem. Ancak, durumun böyle olmadığı ortaya çıktı.

Kodum:

import csv
import tensorflow as tf
import tensorflow_datasets as tfds
import numpy as np
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences

(train_x, train_labels), (test_x, test_labels) = tf.keras.datasets.imdb.load_data(num_words=10000)

x_train_padded = pad_sequences(train_x, maxlen=500)
x_test_padded = pad_sequences(test_x, maxlen=500)

model = tf.keras.Sequential([
    tf.keras.layers.Embedding(10000, 128, input_length=500),
    tf.keras.layers.Conv1D(128, 5, activation='relu'),
    tf.keras.layers.GlobalAveragePooling1D(),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(1)
])

model.compile(loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),optimizer='adam', metrics=[tf.metrics.BinaryAccuracy(threshold=0.0, name='accuracy')])

history = model.fit(x=x_train_padded,
                      y=train_labels,
                      validation_data=(x_test_padded , test_labels),
                      epochs=4, batch_size=128)

çıktıyı verir:

Modeli kaydederim:

model.save('test.h5')

ve geri yükleyin:

modelloaded=tf.keras.models.load_model('test.h5')

ve performansı kontrol edin:

modelloaded.evaluate(x_test_padded , test_labels)

tabii ki hala aynı:

Şimdi modeli eğitilemez olarak ayarladım:

modelloaded.trainable=False

ve gerçekten:

modelloaded.summary()

tüm parametrelerin eğitilemez olduğunu gösterir:

Şimdi onu tek bir çağ kullanarak tekrar uyduruyorum:

history = modelloaded.fit(x=x_train_padded,
                      y=train_labels,
                      validation_data=(x_test_padded , test_labels),
                      epochs=1, batch_size=128)

Ağırlıklar eğitilemez olmasına rağmen, parti boyutuna bağlı olduğundan doğruluğun değiştiğini anlıyorum.

Ancak daha sonra modeli kontrol ettiğimde:

modelloaded.evaluate(x_test_padded , test_labels)

Modelin değiştirildiğini görebiliyorum? Kayıp ve doğruluk farklıdır. Nedenini anlamıyorum, aynı rakamları bekliyordum. Model eğitilemediği için. Onu farklı parti boyutlarıyla çağırmam önemli değil:

modelloaded.evaluate(x_test_padded , test_labels, batch_size=16)

Numaralar her zaman aynıdır, ancak model uydurmadan öncekilerden farklıdır.

Düzenle:

Aşağıdakileri denedim:

modelloaded=tf.keras.models.load_model('test.h5')
modelloaded.trainable=False

for layer in modelloaded.layers:
  layer.trainable=False

history = modelloaded.fit(x=x_train_padded,
                          y=train_labels,
                          validation_data=(x_test_padded , test_labels),
                          epochs=1, batch_size=128)

modelloaded.evaluate(x_test_padded, test_labels)

Ancak yine de ağırlıklar ayarlandı (bunu print(modelloaded.trainable_variables)önce ve sonrasını karşılaştırarak kontrol ettim ) ve modelloaded.evaluate çıktısı biraz farklı sonuçlar veriyor, burada hiçbir değişiklik beklemiyordum. Model ağırlıklarının değişmemesi gerekirdi. Ama kontrol ederken gördüğüm gibi yaptılar print(modelloaded.trainable_variables).

Yanıtlar

YannickFunk Sep 17 2020 at 03:41

Bu, burada tartışılan daha büyük bir Sorun gibi görünüyor . Tüm katmanları açıkça eğitilemez olarak ayarlamak işe yaramalıdır:

for layer in modelloaded.layers:
        layer.trainable = False
BertHobe Sep 18 2020 at 15:23

Benim hatam, modeli eğitilemez olarak ayarladıktan sonra tekrar derlemememdi.

dtlam26 Sep 18 2020 at 15:32

Modeli tekrar takmadan önce derlemelisiniz, yoksa uygun işlev en son derleme yapılandırmanızı alacaktır ...