model.trainable = False и layer.trainable = False для каждого слоя, обеспечивающего очень разную производительность - PullRequest
0 голосов
/ 07 июня 2019

for layer in base_model_seq.layers: layer.trainable=False и base_model_seq.trainable=False дают очень разные результаты.Насколько я понимаю, оба способа достижения одинакового поведения

Конвейер данных: в обоих случаях это остается одинаковым.Предоставление кода для справки

import tensorflow as tf
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
img_height = 224
img_width = 224
from random_eraser import get_random_eraser
IMAGE_DIR = "./data/images"
traincsv = pd.read_csv('./data/train.csv')
testcsv = pd.read_csv('./data/test_ApKoW4T.csv')
traincsv['category'] = traincsv['category'].astype(str)
train_batch_size=32
val_batch_size = 32
test_batch_size = 32
seed = 43
traincsv = pd.read_csv('./data/train.csv')
testcsv = pd.read_csv('./data/test_ApKoW4T.csv')
traincsv['category'] = traincsv['category'].astype(str)
df_train,df_val = train_test_split(traincsv, stratify = traincsv.category, random_state=42, test_size=.1, shuffle=True)
train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rotation_range=10,width_shift_range=0.3, height_shift_range=0.3, 
                                                            rescale=1./255, shear_range=0.0,zoom_range=0.3, horizontal_flip=True, fill_mode='nearest',
                                                            preprocessing_function=get_random_eraser(pixel_level=True,s_h=0.4))

val_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_dataframe(df_train,directory = IMAGE_DIR,x_col='image',y_col='category',
           class_mode="categorical", target_size=(img_height, img_width), batch_size=train_batch_size,shuffle=True)

validation_generator = val_datagen.flow_from_dataframe(df_val,directory=IMAGE_DIR,x_col='image',y_col='category',
           class_mode="categorical", target_size=(img_height, img_width),batch_size=val_batch_size,shuffle=True)

steps_per_epoch = train_generator.n // 32
validation_steps =  validation_generator.n //32

Теперь часть, за которой следует ###### ... - единственная часть, которую я изменяю в ходе двух экспериментов, но я получаю совершенно разные результаты

import tensorflow as tf

from __future__ import absolute_import, division, print_function

import os

import tensorflow as tf
from tensorflow import keras
print("TensorFlow version is ", tf.__version__)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedKFold
from tensorflow.keras.applications import MobileNet, InceptionResNetV2
from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input
from tensorflow.python.keras.applications import densenet_rootexposed
import tensorflow as tf

IMAGE_DIR = "./data/images"
img_height =224
img_width = 224
IMG_SHAPE = (img_height,img_width, 3)
def step_decay(epoch, lr):
    print(lr)
    drop = 0.96
    return lr*drop
lrate = tf.keras.callbacks.LearningRateScheduler(step_decay)
callbacks = [lrate]
base_model_seq = keras.applications.densenet.DenseNet201(input_shape=IMG_SHAPE,
                                              include_top=False, 
                                                weights='imagenet')
#######################################This is the only part i change while training the models
base_model_seq.trainable=False
# for layer in base_model_seq.layers:
#     layer.trainable=False
#######################################
model_seq = tf.keras.Sequential([
  base_model_seq,
  keras.layers.Flatten(),
  keras.layers.Dropout(0.5),
  keras.layers.Dense(2048, activation='relu'),
  keras.layers.Dropout(0.5),
  keras.layers.BatchNormalization(),
  keras.layers.Dense(5, activation='softmax')
])


for layer in base_model_seq.layers:
    layer._name = layer._name + str("_1729")
print(len(model_seq.trainable_variables))


model_seq.compile(optimizer=tf.keras.optimizers.Adam(lr=0.001), 
              loss='categorical_crossentropy', 
              metrics=['accuracy'])

print('************************')
print(model_seq.summary())
epochs = 100

когда я запускаю его, замораживая модель с base_model_seq.trainable=False, модель начинается с точности .8 val и поднимается до 0,91 в первые 20 эпох, но когда я запускаю ее, замораживая модель с for layer in base_model_seq.layers: layer.trainable=False Точность проверкиначинается с 0,72 и достигает 0,82 в 20 эпох, а затем останавливается там.Я повторил эксперимент достаточно много раз, чтобы убедиться, что это не может быть связано с случайной инициализацией.Пожалуйста, укажите мне источник несоответствия в подходах, которые я описал

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