def generate_text(session, model, config, starting_text='<eos>',
stop_length=100, stop_tokens=None, temp=1.0):
"""Generate text from the model.
Hint: Create a feed-dictionary and use sess.run() to execute the model. Note
that you will need to use model.initial_state as a key to feed_dict
Hint: Fetch model.final_state and model.predictions[-1]. (You set
model.final_state in add_model() and model.predictions is set in
__init__)
Hint: Store the outputs of running the model in local variables state and
y_pred (used in the pre-implemented parts of this function.)
Args:
session: tf.Session() object
model: Object of type RNNLM_Model
config: A Config() object
starting_text: Initial text passed to model.
Returns:
output: List of word idxs
"""
state = model.initial_state.eval()
# Imagine tokens as a batch size of one, length of len(tokens[0])
tokens = [model.vocab.encode(word) for word in starting_text.split()]
for i in xrange(stop_length):
### YOUR CODE HERE
raise NotImplementedError
### END YOUR CODE
next_word_idx = sample(y_pred[0], temperature=temp)
tokens.append(next_word_idx)
if stop_tokens and model.vocab.decode(tokens[-1]) in stop_tokens:
break
output = [model.vocab.decode(word_idx) for word_idx in tokens]
return output
python类sample()的实例源码
def generate_caption(self, session, img_feature,toSample=False):
dp = 1
img_template = np.zeros([self.config.batch_size, self.config.img_dim])
img_template[0,:] = img_feature
sent_pred = np.ones([self.config.batch_size, 1])*3591 # <SOS>
while sent_pred[0,-1] != 3339 and (sent_pred.shape[1] - 1) < 50:
feed = {self._sent_placeholder: sent_pred,
self._img_placeholder: img_template,
self._targets_placeholder: np.ones([self.config.batch_size,1]), # dummy variable
self._dropout_placeholder: dp}
idx_next_pred = np.arange(1, self.config.batch_size + 1)*(sent_pred.shape[1] + 1) - 1
if toSample:
logits = session.run(self.logits, feed_dict=feed)
next_logits = logits[idx_next_pred,:]
raw_predicted = []
for row_idx in range(next_logits.shape[0]):
idx = sample(next_logits[row_idx,:])
raw_predicted.append(idx)
raw_predicted = np.array(raw_predicted)
else:
raw_predicted = session.run(self._predictions, feed_dict=feed)
raw_predicted = raw_predicted[idx_next_pred]
next_pred = np.reshape(raw_predicted, (self.config.batch_size,1))
sent_pred = np.concatenate([sent_pred, next_pred], 1)
predicted_sentence = ' '.join(self.index2token[idx] for idx in sent_pred[0,1:-1])
return predicted_sentence
def generate_sentences(self, len_sentences=60, load=True):
"""
Generate sentences given a trained LSTM model
:param len_sentences: the length of the sentences to be generated
:param load: whether to load in a model, or to use the trained one, only works if you ran train_model before
:return:
"""
model = lstm_model.create_model(word_coding)
if load:
model.load_weights('lstm-weights')
else:
if not ModelTrainer.model_trained:
raise Exception("The model hasn't been trained. Either train it or load in the weights from a file")
model = self.model
seedSrc = i_D
outSentences = []
while len(outSentences) < len_sentences:
start_index = random.randint(0, len(seedSrc) - 1)
sentence = seedSrc[start_index: start_index + 1]
sentOutput = ''
for iteration in range(500):
vecsentence = []
for vcode in sentence[0]:
vecsentence.append(self.vmodel[coded_word[vcode]])
vecsentence = np.reshape(vecsentence, (1, len(vecsentence), 300))
preds = model.predict({'input': vecsentence}, verbose=0)['output1'][0]
next_index = sample(preds, 0.2)
if next_index in coded_word:
next_char = coded_word[next_index]
sentence = np.append(sentence[0][1:], [next_index]).reshape(np.asarray(sentence).shape)
sentOutput += next_char + ' '
print(sentOutput)
def compose_async(song_key):
model = get_model()
while True:
diversity = random.uniform(0.7, 1.0)
sentence = '#' * MEMORY_LENGTH + 'X:'
sentence = sentence[-MEMORY_LENGTH:]
generated = 'X:'
while True:
x = np.zeros((1, MEMORY_LENGTH, len(model.chars)))
for t, char in enumerate(sentence):
x[0, t, model.char_indices[char]] = 1.
preds = model.predict(x, verbose=0)[0]
next_index = utils.sample(preds, diversity)
next_char = model.indices_char[next_index]
sentence = sentence[-MEMORY_LENGTH + 1:] + next_char
generated += next_char
if generated.endswith('$$$'):
try:
song = Song.objects.get(key=song_key)
song.song = generated.rstrip('$')
song.save()
writer.write(song_key)
except WriterException:
break
else:
return
if len(generated) > MAX_SONG_LENGTH:
break
def generate_text(session, model, config, starting_text='<eos>',
stop_length=100, stop_tokens=None, temp=1.0):
"""
This function uses the model to generate a sentence
starting with the token(s) "starting_text".
The generated sentence has at most "stop_length" tokens.
If you use the list "stop_tokens", the sentence will end at any
word of that list.
:type session: tf Session
:type model: RNNLanguageModel
:type config: Config
:type starting_text: str
:type stop_lenght: int
:type stop_tokens: None or list of str
:type temp: float
:rtype : list of str
"""
state = session.run(model.initial_state)
tokens = [model.vocab.encode(word) for word in starting_text.split()]
for i in range(stop_length):
feed = {model.input_placeholder: [[tokens[-1]]],
model.initial_state: state,
model.dropout_placeholder: 1.0}
state, y_pred = session.run([model.final_state,
model.predictions[-1]],
feed_dict=feed)
next_word_idx = sample(y_pred[0], temperature=temp)
tokens.append(next_word_idx)
if stop_tokens and model.vocab.decode(tokens[-1]) in stop_tokens:
break
output = [model.vocab.decode(word_idx) for word_idx in tokens]
return output
def generate_text(session, model, config, starting_text='<eos>',
stop_length=100, stop_tokens=None, temp=1.0):
"""Generate text from the model.
Hint: Create a feed-dictionary and use sess.run() to execute the model. Note
that you will need to use model.initial_state as a key to feed_dict
Hint: Fetch model.final_state and model.predictions[-1]. (You set
model.final_state in add_model() and model.predictions is set in
__init__)
Hint: Store the outputs of running the model in local variables state and
y_pred (used in the pre-implemented parts of this function.)
Args:
session: tf.Session() object
model: Object of type RNNLM_Model
config: A Config() object
starting_text: Initial text passed to model. # ??text???List of word idxs??generate_text
Returns:
output: List of word idxs
"""
state = model.initial_state.eval()
# Imagine tokens as a batch size of one, length of len(tokens[0])
tokens = [model.vocab.encode(word) for word in starting_text.split()] # ???text???word?????one hot??
for i in xrange(stop_length):
### YOUR CODE HERE
feed = {model.input_placeholder: [tokens[-1:]],
model.initial_state: state,
model.dropout_placeholder: 1}
state, y_pred = session.run(
[model.final_state, model.predictions[-1]], feed_dict=feed) # ?model??????state, y_pred
### END YOUR CODE
next_word_idx = sample(y_pred[0], temperature=temp) # ????????????idx
tokens.append(next_word_idx)
if stop_tokens and model.vocab.decode(tokens[-1]) in stop_tokens:
break
output = [model.vocab.decode(word_idx) for word_idx in tokens] # ?tokens??one hot?????word
return output
def generate_text(session, model, config, starting_text='<eos>',
stop_length=100, stop_tokens=None, temp=1.0):
"""Generate text from the model.
Hint: Create a feed-dictionary and use sess.run() to execute the model. Note
that you will need to use model.initial_state as a key to feed_dict
Hint: Fetch model.final_state and model.predictions[-1]. (You set
model.final_state in add_model() and model.predictions is set in
__init__)
Hint: Store the outputs of running the model in local variables state and
y_pred (used in the pre-implemented parts of this function.)
Args:
session: tf.Session() object
model: Object of type RNNLM_Model
config: A Config() object
starting_text: Initial text passed to model.
Returns:
output: List of word idxs
"""
state = model.initial_state.eval()
# Imagine tokens as a batch size of one, length of len(tokens[0])
tokens = [model.vocab.encode(word) for word in starting_text.split()]
for i in xrange(stop_length):
### YOUR CODE HERE
feed_dict = {model.input_placeholder: tokens,
model.initial_state: state,
model.dropout_placeholder: 1.}
state, y_pred = session.run([model.final_state, model.predictions[-1]],
feed_dict=feed_dict)
### END YOUR CODE
next_word_idx = sample(y_pred[0], temperature=temp)
tokens.append(next_word_idx)
if stop_tokens and model.vocab.decode(tokens[-1]) in stop_tokens:
break
output = [model.vocab.decode(word_idx) for word_idx in tokens]
return output
def __generate_tweet_no_unk__(self,
session,
model,
config,
starting_text='<eos>',
stop_tokens=None,
temp=1.0,
CharSize=140):
"""
Private method to generate a sentence.
The sentence will have at maximun 140 characters (a tweet).
We use the list of all noums from
the vocav to eliminate all unk tokens that may occur.
:type session: tf Session
:type model: RNNLanguageModel
:type config: Config
:type starting_text: str
:type stop_tokens: None or list of str
:type temp: float
:rtype : list of str
"""
vocab = self.dataholder.vocab
state = session.run(model.initial_state)
tweet = starting_text.split()
tweet_as_str = starting_text
tokens = [vocab.encode(word) for word in starting_text.split()]
while True:
feed = {model.input_placeholder: [[tokens[-1]]],
model.initial_state: state,
model.dropout_placeholder: 1.0}
state, y_pred = session.run([model.final_state,
model.predictions[-1]],
feed_dict=feed)
next_word_idx = sample(y_pred[0], temperature=temp)
condit1 = vocab.decode(next_word_idx) == self.dataholder.unk_token
condit2 = vocab.decode(next_word_idx) in self.black_list
if condit1 or condit2:
choice = np.random.choice(len(self.dataholder.all_noums), 1)[0]
next_word = self.dataholder.all_noums[choice]
else:
next_word = vocab.decode(next_word_idx)
before_next_word = copy(tweet)
tokens.append(next_word_idx)
tweet.append(next_word)
tweet_as_str = " ".join(tweet)
if len(tweet_as_str) == CharSize:
break
if not TweetValid(tweet_as_str, CharNumber=CharSize):
tweet = copy(before_next_word)
break
if stop_tokens and vocab.decode(tokens[-1]) in stop_tokens:
break
return tweet