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 эпох, а затем останавливается там.Я повторил эксперимент достаточно много раз, чтобы убедиться, что это не может быть связано с случайной инициализацией.Пожалуйста, укажите мне источник несоответствия в подходах, которые я описал