Увеличьте случайность результатов глубокого обучения с помощью keras

У меня 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

Однако Где я должен изменить??

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны выбирать из выходных вероятностей, а не брать самую высокую вероятность (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() или model.predict() возвращает только 1 ответ. Мне нужно перестроить модель и где я должен изменить?? Думаю, мне стоит сменить модель с argmax на другую...

whitebear 20.12.2020 18:49

Вызов модели, то есть model(X), выведет тензор с размером возможных категорий. Таким образом, он не выведет только один ответ.

Nicolas Gervais 20.12.2020 20:42
model(X) возвращает (1,12), так что это не один массив, как вы сказали. но я хочу получить несколько массивов, например (10,12), где я могу установить выходной номер ??
whitebear 20.12.2020 20:48

Вам нужно установить return_sequences=True для возврата последовательностей. Но это не имеет прямого отношения к вашему вопросу. Однако будьте осторожны, если вы возвращаете последовательности, ваш вывод также должен быть последовательностью! Мое решение будет (более или менее случайным образом) выбирать из ваших 12 категорий (например, удар, есть и т. д.).

Nicolas Gervais 20.12.2020 21:30

Большое спасибо @Nicolas. Я все еще борюсь с return_sequences=True и, возможно, неправильно понимаю, но ваш ответ дает мне прогресс. Ибо не принято в качестве ответа.

whitebear 21.12.2020 05:27

Другие вопросы по теме