После создания модели, хочу заморозить свёрточные слои, прописала 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