Я работаю над моделью 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'