@Ekaterina0710

Не могу понять почему не выполняется trainable = False?

После создания модели, хочу заморозить свёрточные слои, прописала frozen_layer_conv = Conv2D(15,(3,3), trainable = False), но это почему то не работает.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score
from keras.callbacks import EarlyStopping
from keras.callbacks import ModelCheckpoint
#from dataset import DatasetGenerator
from keras.models import Model
from keras.layers import Input, Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D, BatchNormalization

#DIR = 'speech_commands_v0.01' #Папка с речевой базой 
DIR = 'для дообучения'
INPUT_SHAPE = (166,65,1) #Размер входной матрицы. Зависит от параметров спектрограммы в 93 строке dataset.py
BATCH = 30 #Размер пачки
EPOCHS = 50 #Кол-во эпох
LABELS = 'go up forward'.split() #Команды для распознавания. Можно выбирать любые команды из базы, любое кол-во
NUM_CLASSES = len(LABELS)


dsGen = DatasetGenerator(label_set=LABELS) #Инициализация датасет генератора
df = dsGen.load_data(DIR) #Создание датафрейма с выбранными командами
dsGen.apply_train_test_split(test_size=0.2, random_state=2000) #Задаём размер test 
dsGen.apply_train_val_split(val_size=0.2, random_state=2000) #Задаём размер validation

def deep_cnn(features_shape, num_classes, act='tanh'): #Создаём модель сети

    x = Input(name='inputs', shape=features_shape, dtype='float32')
    o = x
    
    o = Conv2D(15, (3, 3), activation=act, padding='same', strides=1, name='block1_conv', input_shape=features_shape)(o)
    o = MaxPooling2D((2, 2), strides=(2,2), padding='same', name='block1_pool')(o)
    o = BatchNormalization(name='block1_norm')(o)
     
    o = Conv2D(15, (3, 3), activation=act, padding='same', strides=1, name='block2_conv')(o)
    o = MaxPooling2D((2, 2), strides=(2,2), padding='same', name='block2_pool')(o)
    o = BatchNormalization(name='block2_norm')(o)

    o = Conv2D(15, (3, 3), activation=act, padding='same', strides=1, name='block3_conv')(o)
    o = MaxPooling2D((2, 2), strides=(2,2), padding='same', name='block3_pool')(o)
    o = BatchNormalization(name='block3_norm')(o)
    
    o = Conv2D(15, (3, 3), activation=act, padding='same', strides=1, name='block4_conv')(o)
    o = MaxPooling2D((2, 2), strides=(2,2), padding='same', name='block4_pool')(o)
    o = BatchNormalization(name='block4_norm')(o)
    
    o = Flatten(name='flatten')(o)

    o = Dense(100, activation=act, name='dense')(o)
    o = BatchNormalization(name='dense_norm')(o)
    
    o = Dense(num_classes, activation='softmax', name='pred')(o)

    #frozen_layer_conv = Conv2D(15,(3,3), trainable = False)

    
    Model(inputs=x, outputs=o).summary()
    
    frozen_layer_conv = Conv2D(15,(3,3), trainable = False)
    
    return Model(inputs=x, outputs=o)

#deep_cnn.trainable = True
#set_trainable = False

#for  in deep_cnn.o:
#if name == 'block_conv1':
        #set_trainable = False
  #  layer.trainable = False
    
#elif name == 'block_conv2':
        #set_trainable = False 
 #   layer.trainable = False
    
#elif name == 'block_conv3':
        #set_trainable = False
 #   layer.trainable = False
    
#elif name == 'block_conv4':
        #set_trainable = False
#    layer.trainable = False
    
   # if set_trainable = False:
        #layer.trainable = False
    
#else: 
 #   layer.trainable = True
           
model = deep_cnn(INPUT_SHAPE, NUM_CLASSES) #Загружаем созданную модель
model.compile(optimizer='Adam', loss='categorical_crossentropy', metrics=['acc']) #Выбор алгоритма оптимизации и функции ошибки

callbacks = [EarlyStopping(monitor='val_acc', patience=6, verbose=1, mode='max', restore_best_weights=True)] #Рання остановка

callbacks = [ModelCheckpoint('saved_models/dense-{epoch:02d}-{val_loss:.4f}.hdf5')] #сохранение модели после каждой эпохи

history = model.fit_generator(generator=dsGen.generator(BATCH, mode='train'),
                              steps_per_epoch=int(np.ceil(len(dsGen.df_train)/BATCH)),
                              epochs=EPOCHS,
                              verbose=1,
                              callbacks=callbacks,
                              validation_data=dsGen.generator(BATCH, mode='val'),
                              validation_steps=int(np.ceil(len(dsGen.df_val)/BATCH))) #Обучение модели с помощью генератора


y_pred_proba = model.predict_generator(dsGen.generator(BATCH, mode='test'), 
                                     int(np.ceil(len(dsGen.df_test)/BATCH)), 
                                     verbose=1) #Прогонка тестовой части
y_pred = np.argmax(y_pred_proba, axis=1) #Преобразование выходного массива сети в вектор для сравнения

y_true = dsGen.df_test['label_id'].values #Создание идеального вектора с индексами названий команд в том порядке, в котором они поступали в сеть

acc_score = accuracy_score(y_true, y_pred) # Сравнение векторов и подсчёт точности

#model.save_weights('commands2_weights.h5')

#состав словаря history
print('состав словаря history: ')
print(history.history.keys())
#значения точности на обучающем наборе данных
print('Значения точности на обучающем наборе данных: ')
print(history.history['acc'])
#значения на проверочном наборе данных
print('значения на проверочном наборе данных: ')
print(history.history['val_acc'])

#визуализация обучения сети
plt.plot(history.history['acc'], label = 'Точность на обучающем наборе')
plt.plot(history.history['val_acc'], label = 'Точность на проверочном наборе')
plt.xlabel('Эпоха обучения')
plt.ylabel('Точность')
plt.legend()
plt.show
  • Вопрос задан
  • 196 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы