Пакетная нормализация не работает после добавления новой оси в тензор с использованием слоя Reshape - PullRequest
0 голосов
/ 11 февраля 2020

Системная информация

Нет пользовательского кода

Платформа и распространение ОС: Linux Ubuntu 18.04

TensorFlow backend

Версия TensorFlow: 1.13.1

Версия Keras: 2.2.4

Python версия: 3.7.4

Версия CUDA: 10.0.130

cuDNN версия: 7.4

Модель и память графического процессора: TITAN Xp, 12 ГБ

Ситуация

Вот моя цель. Я хочу сгенерировать сигнал с 26 каналами длиной 250 (скажем) из 1D-сигнала, используя Conv1D, а затем добавить ось (т. Е. Expand_dims). Таким образом, после слоя Conv1D выход будет иметь форму (Batch_size, 250, 26), а после слоя Reshape из keras я создам его (Batch_size, 250, 26, 1), который можно рассматривать как серое изображение размера ( 26) с 1 каналом. Но после прохождения через слой Reshape слой Batch_normalization выдает мне сообщение об ошибке. Вот ошибка, которую он показывает

ValueError: У операции нет градиента. Пожалуйста, убедитесь, что все ваши операции имеют определенный градиент (то есть являются дифференцируемыми). Обычные операции без градиента: K.argmax, K.round, K.eval.

Если я не использую слой batch_normalization, модель работает нормально. Но, как мы знаем, тренировать глубокую сеть без пакетной нормы сложно. Но если я не использую слой Reshape и использую выход (Batch_size, 250,26), а позже использую слои Conv1D со слоем Batch_normalization, это работает нормально. Также, если я использую слой Reshape без добавления новой оси, он работает нормально. Выдает ошибку только при добавлении новой оси в тензор.

Код для воспроизведения проблемы

def Network(eps = 0.000001, bn_momentum = 0.99,l2_reg=0.001):
input = Input(shape=(2500, 1))
t = Conv1D(26, kernel_size = 5,padding='same',kernel_regularizer=l2(l2_reg))
t = BatchNormalization(epsilon=eps, momentum=bn_momentum, axis=-1)(t)
t = Reshape(target_shape=(-1,26,1))(t)
t = Conv2D(26, kernel_size=5,
          kernel_initializer=initializers.he_normal(seed=1),
          padding='valid',
          use_bias=True,
          kernel_constraint=max_norm(10000),
          trainable=trainable,
          kernel_regularizer=l2(l2_reg))(t)
t = BatchNormalization(epsilon=eps, axis=-1)(t)
t = Activation(activation_function)(t)
t = Dropout(rate=dropout_rate, seed=random_seed)(t)
t = Flatten()(t)
t = Dense(20)
t = Dense(2)
opt = Adam(lr=.001,decay=.001,epsilon=eps)
model = Model(inputs=input, outputs=t)
model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
return model

Traceback (последний вызов был последним) :

Файл "train_layer_mf cc .py", строка 674, в initial_epoch = initial_epoch,

Файл "/ home / mhealthra2 / anaconda3 / envs / тензор / lib / python3 .7 / site-packages / keras / legacy / interfaces.py ", строка 91, в оболочке возвращает удовольствие c (* args, ** kwargs)

File" / home / mhealthra2 / anaconda3 /envs/tensor/lib/python3.7/site-packages/keras/engine/training.py ", строка 1418, в fit_generator initial_epoch = initial_epoch)

Файл" / home / mhealthra2 / anaconda3 / envs / tenor / lib / python3 .7 / site-packages / keras / engine / training_generator.py ", строка 94, в файле fit_generator callbacks.set_model (callback_model)

File" / home / mhealthra2 / anaconda3 /envs/tensor/lib/python3.7/site-packages/keras/callbacks.py ", строка 54, в set_model callback.set_model (model)

File" / media / mhealthra2 / Data / heart_sound / Состязательность-Н eart-Sound-Classification / codes / CustomTensorBoard.py ", строка 159, в весе set_model)

Файл" /home/mhealthra2/anaconda3/envs/tensor/lib/python3.7/site-packages /keras/optimizers.py ", строка 91, в get_gradients

повышение ValueError ('У операции нет градиента. 'ValueError: у операции есть None для градиента. Пожалуйста, убедитесь, что все ваши операции имеют определенный градиент (то есть являются дифференцируемыми). Обычные операции без градиента: K.argmax, K.round, K.eval.

...