2017-02-17 55 views
1

Возможно, это дублирование предыдущих сообщений, но вот мой код. Мои входы X - это последовательности символов, каждая из которых имеет длину 10, закодированную как 1-26 чисел с добавленным случайным шумом. Выход - следующее слово в последовательности.Точность/потеря не изменяется

from keras.models import Sequential 
from keras.layers.core import Dense, Activation 
from keras.layers.recurrent import LSTM 
import keras.optimizers 

in_out_neurons = 1 
hidden_neurons = 20 

model = Sequential() 

# n_prev = 100, 2 values per x axis 
model.add(LSTM(hidden_neurons, input_shape=(10, 1))) 
model.add(Activation('relu')) 
model.add(Dense(in_out_neurons)) 
model.add(Activation("sigmoid")) 
model.add(Activation("softmax")) 
rms = keras.optimizers.RMSprop(lr=5, rho=0.9, epsilon=1e-08, decay=0.0) 
sgd = keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.001, nesterov=False) 
model.compile(loss="binary_crossentropy", 
    optimizer='adam', 
    metrics=['accuracy']) 

(X_train, y_train), (X_test, y_test) = train_test_split(data) 

model.fit(X_train, y_train, batch_size=100, nb_epoch=50, validation_data=(X_test, y_test), verbose=1) 
score = model.evaluate(X_test, y_test, verbose=0) 
print('Test score:', score[0]) 
print('Test accuracy:', score[1]) 

predicted = model.predict(X_test, batch_size=700) 

# and maybe plot it 
pd.DataFrame(predicted).to_csv("predicted.csv") 
pd.DataFrame(y_test).to_csv("test_data.csv") 

Пробовал изменять различные функции потерь и оптимизаторы. Не повезло.

ответ

1

Кодирование символов по номерам не является хорошим способом. Это будет интерпретироваться как числа, так что это говорит о том, что Y и Z близки друг другу, что не имеет смысла. Вот почему существуют слои Embedding(). Или вы можете рассмотреть однострунное кодирование. Символы являются тогда горячими векторами длины 26. Например, «a» станет [1 0 0 0 0 0 0 0 0 ... 0].

Это говорит о том, что причина не в том, что вы накладываете Softmax на слой, который имеет только одно значение ... Softmax на одном значении всегда будет давать выход 1, поэтому ваша сеть не может учиться, поскольку выход 1 что бы ни случилось раньше.

Softmax используется для создания плотности вероятности из тензора, если есть только одно возможное значение, оно получит вероятность 1. Если вы хотите, чтобы один нейрон был вероятностью (между 0 и 1), используйте только сигмовидный, а не мягкий макс.

Надеюсь, это поможет :)

+0

Большое вам спасибо. – Hima

+0

Решила ли ваша проблема? –