Bekukan model dan latih

Sep 17 2020

Saya menggunakan Keras Tensorflow di Colab. Saya menyesuaikan model dan menyimpannya. Kemudian saya memuatnya dan memeriksa kinerjanya dan tentu saja itu harus sama. Kemudian saya membekukannya dan memasangnya kembali. Saya berharap setelah itu modelnya memiliki kinerja yang sama. Tentu saja selama "pelatihan" karena perbedaan ukuran batch mungkin ada perbedaan dalam keakuratannya. Tetapi setelah itu ketika memeriksanya dengan model.evaluate saya tidak mengharapkan perbedaan, karena bobot tidak dapat diubah, saat model dibekukan. Namun, ternyata tidak demikian.

Kode saya:

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)

memberikan output:

Saya menyimpan model:

model.save('test.h5')

dan muat kembali:

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

dan periksa kinerjanya:

modelloaded.evaluate(x_test_padded , test_labels)

tentu saja masih sama:

Sekarang saya menyetel model ke non-trainable:

modelloaded.trainable=False

dan memang:

modelloaded.summary()

menunjukkan bahwa semua parameter tidak dapat dilatih:

Sekarang saya memasangnya lagi, hanya menggunakan satu periode:

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

Saya memahami bahwa meskipun bobot tidak dapat dilatih, keakuratannya berubah karena hal ini bergantung pada ukuran tumpukan.

Namun, ketika saya memeriksa model sesudahnya dengan:

modelloaded.evaluate(x_test_padded , test_labels)

Saya dapat melihat bahwa modelnya telah diubah? Kerugian dan akurasinya berbeda. Saya tidak mengerti mengapa, saya mengharapkan angka yang sama. Karena model tidak bisa dilatih. Tidak masalah jika saya menyebutnya dengan ukuran batch yang berbeda:

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

Jumlahnya selalu sama, namun berbeda dengan sebelum pemasangan model.

Edit:

Saya mencoba yang berikut ini:

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)

Namun, bobotnya masih disesuaikan (saya memeriksa ini dengan membandingkan print(modelloaded.trainable_variables)sebelum dan sesudahnya) dan keluaran modelloaded.evaluate memberikan hasil yang sedikit berbeda, di mana saya tidak mengharapkan perubahan. Sebagai bobot model seharusnya tidak berubah. Tapi mereka melakukannya, seperti yang saya lihat saat memeriksa print(modelloaded.trainable_variables).

Jawaban

YannickFunk Sep 17 2020 at 03:41

Ini tampaknya menjadi Masalah yang lebih besar yang dibahas di sini . Menyetel semua lapisan secara eksplisit tidak dapat dilatih harus berfungsi:

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

Kesalahan saya adalah saya tidak mengompilasi model lagi setelah menyetelnya ke non-trainable.

dtlam26 Sep 18 2020 at 15:32

Anda harus mengkompilasi model sebelum memasangnya kembali, atau fungsi yang sesuai akan mengambil konfigurasi kompilasi terbaru Anda ...