У меня simpleRNN
стильная модель
n_hidden = 512
model = Sequential()
model.add(SimpleRNN(n_hidden, input_shape=(12, 4), return_sequences=False))
model.add(Dense(n_hidden, activation = "linear"))
model.add(Dense(4, activation = "linear"))
opt = Adam(lr=0.001)
model.compile(loss='mse', optimizer=opt)
model.summary()
Хорошо, это работает для глубокого изучения текста.
Сейчас даю первые слова и составляю предложение.
Однако, если я даю то же самое слово. модель всегда возвращает одно и то же предложение.
Например, выучите эти предложения
Указание I
в качестве первого предложения всегда возвращает I have ..
Тем не менее, я хочу получить I punch ..
иногда.
Я думаю, я думаю, что я должен ввести некоторую случайность.
Это правильно? и как мне это сделать??
Пока мой прогноз.
Каждый элемент представляет собой массив, состоящий из 12 чисел.
Я использую 4 элемента для прогнозирования следующего массива.
Текущий мой исходный код.
in_ = basicdata[0].x[:1]
# in_.shape = (1,4,12)
predicted = []
NUM_DATA = 100
cnt = 0
for i in range(NUM_DATA):
out_ = model.predict(in_) # somehow get multiple output here??
#it returns only 1 answer.
#out_.shape = (1, 12)
in_ = np.concatenate((in_.reshape(12, 4)[1:], out_), axis=0).reshape(1, 12,4)
if cnt == 0:
predicted = out_
else:
predicted = np.concatenate([predicted,out_],axis=0)
cnt = cnt + 1
Я ставлю (1,4,12) в модель и получаю (1,12)
Я думаю, я должен получить не (1,12)
, а (2 or more,12)
, а затем использовать tf.random
Однако Где я должен изменить??
Вы должны выбирать из выходных вероятностей, а не брать самую высокую вероятность (argmax). Об этом рассказывается в учебнике Tensorflow .
Примечание. Важно взять образец из этого распределения, так как использование argmax распределения может легко привести к зацикливанию модели.
Чтобы получить фактические прогнозы от модели, вам нужно выполнить выборку из выходного распределения, чтобы получить фактические индексы символов. Это распределение определяется логитами по словарю символов.
Примерно так можно сделать:
predictions = model(X_test)
sampled = tf.random.categorical(predictions[0], num_samples=1)
sampled = tf.squeeze(sampled, axis=-1).numpy()
array([41])
Вызов модели, то есть model(X)
, выведет тензор с размером возможных категорий. Таким образом, он не выведет только один ответ.
model(X)
возвращает (1,12), так что это не один массив, как вы сказали. но я хочу получить несколько массивов, например (10,12), где я могу установить выходной номер ??
Вам нужно установить return_sequences=True
для возврата последовательностей. Но это не имеет прямого отношения к вашему вопросу. Однако будьте осторожны, если вы возвращаете последовательности, ваш вывод также должен быть последовательностью! Мое решение будет (более или менее случайным образом) выбирать из ваших 12 категорий (например, удар, есть и т. д.).
Большое спасибо @Nicolas. Я все еще борюсь с return_sequences=True
и, возможно, неправильно понимаю, но ваш ответ дает мне прогресс. Ибо не принято в качестве ответа.
Большое спасибо, вы даете мне четкую схему. Однако у меня все еще есть вопрос, мой
model()
илиmodel.predict()
возвращает только 1 ответ. Мне нужно перестроить модель и где я должен изменить?? Думаю, мне стоит сменить модель сargmax
на другую...