Keras - функция fit_generator не изучается - PullRequest
1 голос
/ 23 сентября 2019

Я работаю над моделью NMT (Neural Machine Translation).Сначала я использовал функцию подгонки керас для обучения модели.Он выучил довольно хорошо с точностью выше 0,85.Но когда я пытаюсь использовать функцию fit_generator, модель, кажется, не учится, и точность застряла на 0,14 - 0,15.Я делаю какую-то ошибку в функции генератора, выбираю batch_size или использую steps_per_epoch?

РАЗМЕР БАТАРИИ:

batch = 32

ГЕНЕРАТОР ДАННЫХ:

def data_generator():
  while True:

    idx = np.random.randint(len(eng),size=batch).tolist()

    for i in idx:

      X1 , X2 , Y = create_sequences([i] , batch)

      X1 = pad_sequences(X1 , maxlen = Xlen , padding="post")
      X2 = pad_sequences(X2 , maxlen = Ylen , padding="post")
      Y = to_categorical(Y , Yvocab)

      X1, X2, Y = sklearn.utils.shuffle(X1,X2, Y, random_state=0)

      yield [[X1,X2] , Y]

СОЗДАТЬ ПОСЛЕДОВАТЕЛЬНОСТИ:

def create_sequences(inp ,batch):

  X1 = []
  X2 = []
  Y = []

  X1_tmp = []
  X2_tmp = []
  Y_tmp = []

  for i in inp:

    tmp = []

    for j in ger[i]:
      tmp.append(j)

    for k in range(len(tmp) - 1):    
      X1_tmp.append(eng[i])
      X2_tmp.append(tmp[:k+1])
      Y_tmp.append(tmp[k+1])

  x = randint(0,len(X1_tmp)-1)
  X1.append(X1_tmp[x])
  X2.append(X2_tmp[x])
  Y.append(Y_tmp[x])

  return np.array(X1) , np.array(X2)  , np.array(Y)

МОДЕЛЬ:

inp1 = keras.layers.Input(shape=(Xlen , ))
f1 = keras.layers.Embedding(Xvocab , 64 , input_length=Xlen)(inp1)
f2 = keras.layers.Dropout(0.3)(f1)
f3 = keras.layers.LSTM(256)(f2)
f4 = keras.layers.Dropout(0.3)(f3)
f5 = keras.layers.Dense(256 , activation='relu')(f4)

inp2 = keras.layers.Input(shape=(Ylen, ))
s1 = keras.layers.Embedding(Yvocab , 64 , input_length=Ylen)(inp2)
s2 = keras.layers.Dropout(0.3)(s1)
s3 = keras.layers.LSTM(256)(s2)

decoder1 = keras.layers.add([f5,s3])
decoder2 = keras.layers.Dense(256 , activation='relu')(decoder1)
out = keras.layers.Dense(Yvocab , activation='softmax')(decoder2)

model = keras.models.Model(inputs = [inp1,inp2] , outputs = out)

model.compile(optimizer = 'adam' , loss = 'categorical_crossentropy' , metrics = ['accuracy'])

FIT_GENERATOR:

epochs = 10

for i in range(epochs):

  generator = data_generator()

  model.fit_generator(generator , epochs = 1 , steps_per_epoch=len(eng)//batch)

  model.save("drive/My Drive/Colab Notebooks/nmtnew" + str(i) + ".h5")

РЕЗУЛЬТАТЫ:

Epoch 1/1
3013/3013 [==============================] - 1041s 346ms/step - loss: 7.0601 - acc: 0.1437
Epoch 1/1
3013/3013 [==============================] - 1037s 344ms/step - loss: 6.4778 - acc: 0.1543
Epoch 1/1
3013/3013 [==============================] - 1042s 346ms/step - loss: 6.4813 - acc: 0.1580
Epoch 1/1
3013/3013 [==============================] - 1039s 345ms/step - loss: 6.6110 - acc: 0.1577
Epoch 1/1
3013/3013 [==============================] - 1036s 344ms/step - loss: 6.7250 - acc: 0.1500
Epoch 1/1
3013/3013 [==============================] - 1038s 345ms/step - loss: 6.7857 - acc: 0.1507
Epoch 1/1
3013/3013 [==============================] - 1038s 345ms/step - loss: 6.7567 - acc: 0.1487
Epoch 1/1
3013/3013 [==============================] - 1039s 345ms/step - loss: 7.0087 - acc: 0.1424
Epoch 1/1
3013/3013 [==============================] - 1029s 342ms/step - loss: 6.8201 - acc: 0.1484
Epoch 1/1
3013/3013 [==============================] - 1023s 340ms/step - loss: 6.8712 - acc: 0.1540

Я также использовал разные размеры партии, например 256, 512, 10 и т. Д. Модель, кажется, всегда предсказывает 2, которое является 'endseq'

...