Я пытаюсь понять, как работают сети LSTM: я сделал простую, основываясь примерно на https://machinelearningmastery.com/text-generation-lstm-recurrent-neural-networks-python-keras/, но обнаруживая положительное или отрицательное использование слова. Так что с bad.txt:
yuck
bad
no
bleh
never
hate
awful
и good.txt:
yum
good
yes
hooray
great
love
Теперь я могу получить довольно «точный» положительный / отрицательный детектор по крайней мере для этого небольшого подмножества (перегонка, Я знаю...). Когда я ввожу «отлично», он говорит «положительный», «ужасно» - «отрицательный».
Однако, когда я вхожу «повторный», он говорит, что это 99% отрицательный, а «ужасный» - 99% положительный. Как я понимаю, каждый нейрон "второй буквы" будет искать вторую букву чего-то обученного, и это может быть причиной. Кроме того, может ли это быть потому, что пробелы используются для дополнения любых более коротких слов, и есть ли более правильный способ сделать это? То есть есть ли более правильный способ обнаружения вещей различной длины, скажем, слов или фрагментов аудио? Я понимаю, что LSTM можно использовать с последовательными / потоковыми данными, такими как символы, поступающие из потокового файла текста, если бы они подавались в алгоритм, подобный этому, «ужасному» противодействовал бы фиктивный «ужасный» ... есть лихороший способ исправить это?
# Load LSTM network and generate text
import sys
import numpy
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import LSTM
from keras.callbacks import ModelCheckpoint
from keras.utils import np_utils
import time
# create mapping of unique chars to integers, and a reverse mapping
chars = " abcdefghijklmnopqrstuvwxyz"
char_to_int = dict((c, i) for i, c in enumerate(chars))
int_to_char = dict((i, c) for i, c in enumerate(chars))
## summarize the loaded data
#n_chars = len(raw_text)
n_vocab = len(chars)
#print ("Total Characters: "+ str(n_chars))
#print ("Total Vocab: "+ str(n_vocab))
## prepare the dataset of input to output pairs encoded as integers
#seq_length = 100
dataX = []
dataY = []
seq_length = 7
for i in range(1000):
with open('bad.txt') as bad:
for line in bad:
print(line+' mapping to [1,0]')
nums = [char_to_int[n] for n in line.lower() if n in chars]
while len(nums) < seq_length:
nums.append(0)# " "
dataX.append(nums)
dataY.append([1,0])
with open('good.txt') as bad:
for line in bad:
print(line+' mapping to [0,1]')
nums = [char_to_int[n] for n in line.lower() if n in chars]
while len(nums) < seq_length:
nums.append(0)# " "
dataX.append(nums)
dataY.append([0,1])
n_patterns = len(dataX)
print ("Total Patterns: "+ str(n_patterns))
X = numpy.reshape(dataX, (n_patterns, seq_length, 1))
# normalize
X = X / float(n_vocab)
print(X[0:10])
# one hot encode the output variable
y = numpy.array(dataY)#np_utils.to_categorical(dataY)
# define the LSTM model
model = Sequential()
model.add(LSTM(20, input_shape=(X.shape[1], X.shape[2])))
#model.add(Dropout(0.01))
model.add(Dense(y.shape[1], activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam')
#This was step1.
filepath="simpleweights-improvement-{epoch:02d}-{loss:.4f}.hdf5"
checkpoint = ModelCheckpoint(filepath, monitor='loss', verbose=1, save_best_only=True, mode='min')
callbacks_list = [checkpoint]
model.fit(X, y, epochs=20, batch_size=128, callbacks=callbacks_list)
# pick a random seed
start = numpy.random.randint(0, len(dataX)-1)
pattern = dataX[start]
print ("Seed:")
print ("\"", ''.join([int_to_char[value] for value in pattern]), "\"")
# generate characters
while True:
word = input('word: ')
numberize = []
for l in word:
if l in char_to_int:
numberize.append(char_to_int[l])
while len(numberize) < seq_length:
numberize.append(0) #this space, first
print(numberize)
numberize = numpy.reshape(numberize, (1, len(numberize), 1))
numberize = numberize / float(n_vocab) #normalize!
print(numberize)
result = (model.predict(numberize,verbose=0))
print(result)
#Just one. could do many at a time.
if result[0][1] > result[0][0]:
print('positive')
else:
print('negative')