E
E
Ekaterina07102020-06-09 15:59:30
Python
Ekaterina0710, 2020-06-09 15:59:30

I can not understand why trainable = False is not executed?

After creating the model, I want to freeze the convolutional layers, I wrote frozen_layer_conv = Conv2D(15,(3,3), trainable = False), but for some reason this does not work.

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

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question