Tensorflow 2.0 学习(chapter 7)

对列表生成式和dict生成式的使用
imdb = keras.datasets.imdb
word_index = imdb.get_word_index()
word_index = {k:(v+3) for k,v in word_index.items()}
reverse_word_index = {v:k for k,v in word_index.items()}
pad_sequences
train_data = keras.preprocessing.pad_sequences(
	train_data, # 待填充数据
    value=0, # 用0填充
    padding='post', # 在后面填充
    maxlen=max_length
)

train_data应该是list<list<number>>类型的数据,不等长数组组成的数组

Embedding层
keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length)

相当于对one-hot变量降维。输入层本来是batch_size×maxlen的数据,写成batch_size×maxlen×vocab_size的独热形式,再降维到batch_size×maxlen×embedding_dim。

GlobalAveragePooling
keras.layers.GlobalAveragePooling1D()

在最后一个维度上取平均。得到batch_size×embedding_dim

SimpleRNN
single_rnn_model = keras.models.Sequential([
    keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length),
    keras.layers.SimpleRNN(units=64, return_sequences=False),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dense(1, activation='sigmoid')
])

Emebedding返回的是batch_size×embedding_dim×maxlen大小的矩阵,SimpleRNN里面有64个节点,

embedding_dim这个维度和64个节点连接,就像全连接层中embedding_dim个节点和64个节点连接一样。maxlen这个维度的每个元素逐个输入进RNN中,并且只保留最后一次的结果,维度会变成1。所以最终维度变成batch_size×64×1。

双向RNN
model = keras.models.Sequential([
    keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length),
    keras.layers.Bidirectional(
        keras.layers.SimpleRNN(units=32, return_sequences=True)),
    keras.layers.Bidirectional(
        keras.layers.SimpleRNN(units=32, return_sequences=False)),
...
])

双向RNN。好像会创建两层RNN,两层RNN都向外输出。

return_sequences=True会把maxlen这个维度上的每次的结果都保存下来,

所以第一个Bidrectional的输出大小是batch_size×maxlen×64,第二个输出大小是batch_size×64

tf.random.categorical
# in
tf.random.categorical(tf.math.log([[0.1, 0.9], [0.2, 0.8], [0.3, 0.7]]), 20)

# out
<tf.Tensor: id=53, shape=(3, 20), dtype=int64, numpy=
array([[1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1],
       [0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0]],
      dtype=int64)>

参数 logits——对数概率分布,num_samples——抽样次数

扫描二维码关注公众号,回复: 9902045 查看本文章

从len(logits)个概率分布中随机抽样num_samples次。比如上面是从3个分布中抽样20次。

保存与载入模型
output_dir = './text_generation_checkpoints'
if not os.path.exists(output_dir): os.mkdir(output_dir)
checkpoint_prefix = os.path.join(output_dir, "ckpt_{epoch}")
checkpoint_callback = keras.callbacks.ModelCheckpoint(
    filepath=checkpoint_prefix,
    save_weights_only=True  # 只保存参数的值(不保存模型)
)
epochs = 100
history = model.fit(seq_dataset, epochs=epochs, callbacks=[checkpoint_callback])

保存checkpoint, 可以直接把{epoch}包含在字符串内,weights是参数的值。

model2 = keras.models.Sequential ...
model2.load_weights(tf.train.latest_checkpoint(output_dir)) # 载入参数值
model2.build(tf.TensorShape([1, None])) # None 是变长序列, 需要重新定义模型的输入

之前用的是tf.keras.models.Model.compile, 在load模型时需要用build载入tf.keras.layers.Layer.build(input_shape)。

expand_dims 和 squeeze
input_eval = tf.expand_dims(input_eval, axis=0)  # 为 tensor 添加一个维度1
predictions = tf.squeeze(input_eval, 0) # 去掉第dim=1的0个维度

把input_eval由n维变成1×n维,在变回n维

LSTM

用法跟SimpleRNN一样

model = keras.models.Sequential([
    keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length),
    keras.layers.Bidirectional(keras.layers.LSTM(units=32, return_sequences=True)),
    keras.layers.Bidirectional(keras.layers.LSTM(units=32, return_sequences=False)),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dense(1, activation='sigmoid')
])
发布了80 篇原创文章 · 获赞 22 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/u010099177/article/details/104870132