Попытка создать GAN: InvalidArgumentError: Matrix-несовместимый размер - PullRequest
1 голос
/ 16 июня 2019

Я довольно новичок в этой области, но я пытаюсь создать Генеративную Состязательную Сеть для создания Музыки.У меня есть модель, которая представляет собой комбинацию генератора и дискриминатора, но когда я тренирую ее, она выдает ошибку.Что-то в выводе не нравится.Я использую Керас последовательно.Любая помощь будет принята с благодарностью.

Насколько я понимаю, вход и выход должны иметь одинаковые размеры в любой модели Keras.Моя входная форма - (300, 30, 1).Форма выхода - (300,1).И когда я тренирую их отдельно, они не вызывают ошибку.Но когда я объединяю их в отдельную модель, они начинают выдавать ошибку - особенно в последней строке дискриминатора -> Dense(1, activation='sigmoid')

    def __generator(self):
        """ Declare generator """
        model = Sequential()
        model.add(LSTM(256, input_shape=(self.n_prev, 1), return_sequences=True))
        model.add(Dropout(0.6))
        model.add(LSTM(128, input_shape=(self.n_prev, 1), return_sequences=True))
        model.add(Dropout(0.6))
        model.add(LSTM(64, input_shape=(self.n_prev, 1), return_sequences=False))
        model.add(Dropout(0.6))
        model.add(Dense(1))

        print(model.summary())
        return model


    def __discriminator1b (self, width=300, height=30, channels=1):

        shape = (width, height, channels)
        model = Sequential()
        model.add(Flatten(input_shape=((30, 1))))
        model.add(Dense((height * channels), input_shape=(30, 1)))
        model.add(LeakyReLU(alpha=0.2))
        model.add(Dense(np.int64((height * channels)/2)))
        model.add(LeakyReLU(alpha=0.2))

        model.add(Dense(1, activation='sigmoid'))   

        print(model.summary())
        return model


    def __gen_disc (self):
        model = Sequential()
        model.add(self.G)
        model.add(self.D)

        return model
Training:
self.G.train_on_batch(np.array(gen_noiseX), np.array(genY))
self.D.train_on_batch(np.array(gen_noiseX), disc_label)
self.GD.train_on_batch(np.array(gen_noiseX), y_mislabled)

Model Summaries:
Generator:
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_28 (LSTM)               (None, 30, 256)           264192    
_________________________________________________________________
dropout_52 (Dropout)         (None, 30, 256)           0         
_________________________________________________________________
lstm_29 (LSTM)               (None, 30, 128)           197120    
_________________________________________________________________
dropout_53 (Dropout)         (None, 30, 128)           0         
_________________________________________________________________
lstm_30 (LSTM)               (None, 64)                49408     
_________________________________________________________________
dropout_54 (Dropout)         (None, 64)                0         
_________________________________________________________________
dense_36 (Dense)             (None, 1)                 65        
=================================================================
Total params: 510,785
Trainable params: 510,785
Non-trainable params: 0
_________________________________________________________________
None


Discriminator:

Layer (type)                 Output Shape              Param #   
=================================================================
flatten_8 (Flatten)          (None, 30)                0         
_________________________________________________________________
dense_37 (Dense)             (None, 30)                930       
_________________________________________________________________
leaky_re_lu_15 (LeakyReLU)   (None, 30)                0         
_________________________________________________________________
dense_38 (Dense)             (None, 15)                465       
_________________________________________________________________
leaky_re_lu_16 (LeakyReLU)   (None, 15)                0         
_________________________________________________________________
dense_39 (Dense)             (None, 1)                 16        
=================================================================
Total params: 1,411
Trainable params: 1,411
Non-trainable params: 0
_________________________________________________________________
None

Таким образом, сама ошибка равна

InvalidArgumentError: Matrix size-incompatible: In[0]: [300,1], In[1]: [30,30]   [[{{node sequential_22/dense_37/MatMul}}]]

Всякий раз, когда я удаляю плотный (1, сигмовидный) слой дискриминатора, он работает, но мне нужен этот слой для двоичной классификации.Может быть, мне нужно перестроить модель или просто сделать небольшое исправление, но в любом случае все предложения приветствуются.

1 Ответ

0 голосов
/ 16 июня 2019

Добро пожаловать в stackoverflow.Эта ошибка возникает из-за того, что your model needs (30,30) but you are feeding it (300,1).
Есть несколько изменений, которые были бы лучше здесь:

  1. В дискриминаторе model.add(Flatten(input_shape=((30, 1)))) находится не в том месте.Это должно быть ниже перед dense слоем.Или, когда вы строите RNN, я бы сказал, что вам не нужен слой Flatten.
  2. Использование bidirectional LSTMs.
  3. В генераторе batchnormalization.

Есть несколько других изменений, необходимых для всей сети, вы можете увидеть эту отличную статью для генерации музыки .Надеюсь, это поможет !!

...