Модели тонкой настройки в тензорном потоке - PullRequest
0 голосов
/ 28 ноября 2018

Я тренирую модель в тензорном потоке с набором данных fer +.Fer + разделен на разделы обучения, проверки и тестирования.После обучения моей модели я хотел создать новый классификатор и снова обучить всю модель на другом наборе данных.Поэтому я построил модель следующим образом:

def model(inputs, return_top=True):
    #.... Here I have several conv layers

    if return_top:
        output = tf.layers.dense(output, units=8, name='outputs')

    return output

with tf.variable_scope('model'):
    output_train = model(inputs_train)
    mse_train = cal_loss(output_train, labels_train) # This is a function that calculates the loss
    train_step = optimize(mse_train)    # This is a function that implements the optimizer

with tf.variable_scope('model', reuse=True):
    output_validation = model(inputs_validation)
    mse_validation = cal_loss(output_validation, labels_validation)

with tf.variable_scope('model', reuse=True):
    output_test = model(inputs_test)
    mse_test = cal_loss(output_test, labels_test)

# Now I defined the rest of the model to be used later in fine tuning. 
with tf.variable_scope('model', reuse=True):
    output_sewa_train = model(sewa_inputs_train, return_top=False)

output_sewa_train = tf.layers.dense(output_sewa_train, units=2, name='output_sewa_train')
mse_sewa_train = cal_loss(output_sewa_train, sewa_labels_train)
sewa_train_step = optimizer_2(mse_sewa_train)

with tf.variable_scope('model', reuse=True):
    output_sewa_valid = model(sewa_inputs_valid, return_top=False)

output_sewa_valid = tf.layers.dense(output_sewa_valid, units=2, name='output_sewa_valid')

Теперь, чтобы обучить модель, у меня есть:

fine_tune_model = False

if not fine_tune_model:
    sess.run(train_step) # etc... To train the model
else:
    sess.run(sewa_train_step) # etc... to finetune the model...

Ниже приведены изображения для моей модели: enter image description here

Обратите внимание, что я сохранил данные в tfrecords и использовал tf.data.Dataset ...

Теперь возникает проблема:

Когда fine_tune_model = False модель успешно запущена.И когда fine_tune_model = True он ломается, я получаю эту ошибку:

FailedPreconditionError (see above for traceback): GetNext() failed because the iterator has not been initialized. Ensure that you have run the initializer operation for this iterator before getting the next element.
 [[Node: train_dataset/train_data = IteratorGetNext[output_shapes=[[?,64,64], [?,8]], output_types=[DT_FLOAT, DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](train_dataset/Iterator)]]
 [[Node: model_2/d_block_2/bottleneck_5/dropout_1/cond/dropout/Shape-0-0-VecPermuteNCHWToNHWC-LayoutOptimizer/_4621 = _HostRecv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device_incarnation=1, tensor_name="edge_17286...tOptimizer", tensor_type=DT_INT32, _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]]

Кроме того, при просмотре, какие части модели связаны друг с другом, я получаю следующее:

enter image description here

И:

enter image description here

Что позволяет мне быть уверенным, что выходные данные модели, связанной с sewa, не зависят отfer + набор данных.

Кроме того, мы видим, что у нас всего 5 моделей.Основным из них являются имена model, он принимает в качестве входных данных набор данных fer + training;вторая модель - model_1, которая ссылается на model и принимает в качестве входных данных fer + проверочный набор данных.В-третьих, у нас есть model_2, который также ссылается на model и берет тестовый набор данных модели fer +.Затем у нас есть model_3, который принимает набор данных sewa_train и, наконец, model_4, который принимает набор данных проверки sewa.

Кроме того, если я пытаюсь запустить output_sewa_train или mse_sewa_train, код запускается успешно, но когда я запускаю оптимизатор, я получаю ошибку.

Кроме того, обратите внимание, что у меня естьЯ использовал tf.data.Dataset для подачи данных в модель вместо заполнителя, и это усложняет ситуацию.

В заключение я не уверен, как решить ошибку, описанную выше.Любая помощь высоко ценится!!

...