蛋糕店网站源码,网站备案号 有效期,网站目录爬行,小甲虫抖音代运营#x1f9e1;#x1f49b;#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 6、构建训练数据
所有的输入样本必须都是相同shape#xff08;文本长度#xff0c;…TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 6、构建训练数据
所有的输入样本必须都是相同shape文本长度词向量维度等tf.data.Dataset.from_tensor_slices(tensor)将tensor沿其第一个维度切片返回一个含有N个样本的数据集这样做的问题就是需要将整个数据集整体传入然后切片建立数据集类对象比较占内存。tf.data.Dataset.from_generator(data_generator,output_data_type,output_data_shape)从一个生成器中不断读取样本
def data_generator(f_path, params):with open(f_path,encodingutf-8) as f:print(Reading, f_path)for line in f:line line.rstrip()label, text line.split(\t)text text.split( )x [params[word2idx].get(w, len(word2idx)) for w in text]#得到当前词所对应的IDif len(x) params[max_len]:#截断操作x x[:params[max_len]]else:x [0] * (params[max_len] - len(x))#补齐操作y int(label)yield x, y定义一个生成器函数传进来读数据的路径、和一些有限制的参数params 在是一个字典它包含了最大序列长度max_len、词到索引的映射word2idx等关键信息打开文件打印文件路径遍历每行数据获取标签和文本文本按照空格分离出单词获取当前句子的所有词对应的索引for w in text取出这个句子的每一个单词[params[‘word2idx’]取出params中对应的word2idx字典.get(w, len(word2idx))从word2idx字典中取出该单词对应的索引如果有这个索引则返回这个索引如果没有则返回len(word2idx)作为索引这个索引表示unknow如果当前句子大于预设的最大句子长度进行截断操作如果小于补充0标签从str转换为int类型yield 关键字用于从一个函数返回一个生成器generator。与 return 不同yield 不会退出函数而是将函数暂时挂起保存当前的状态当生成器再次被调用时函数会从上次 yield 的地方继续执行使用 yield 的函数可以在处理大数据集时节省内存因为它允许逐个生成和处理数据而不是一次性加载整个数据集到内存中
也就是说yield 会从上一次取得地方再接着去取数据而return却不会
def dataset(is_training, params):_shapes ([params[max_len]], ())_types (tf.int32, tf.int32)if is_training:ds tf.data.Dataset.from_generator(lambda: data_generator(params[train_path], params),output_shapes _shapes,output_types _types,)ds ds.shuffle(params[num_samples])ds ds.batch(params[batch_size])ds ds.prefetch(tf.data.experimental.AUTOTUNE)else:ds tf.data.Dataset.from_generator(lambda: data_generator(params[test_path], params),output_shapes _shapes,output_types _types,)ds ds.batch(params[batch_size])ds ds.prefetch(tf.data.experimental.AUTOTUNE)return ds定义一个制作数据集的函数is_training表示是否是训练这个函数在验证和测试也会使用训练的时候设置为True验证和测试为False当前shape值1是否在训练如果是构建一个Dataset传进我们刚刚定义的生成器函数并且传进实际的路径和配置参数输出的shape值输出的类型指定shuffle指定 batch_size设置缓存序列根据可用的CPU动态设置并行调用的数量说白了就是加速如果不是在训练则验证和测试不同的就是路径不同以及没有shuffle操作其他都一样最后把做好的Datasets返回回去
7、自定义网络模型 一条文本变成一组向量/矩阵的基本流程
拿到一个英文句子通过查语料表将句子变成一组索引通过词嵌入表结合索引将每个单词都变成一组向量一条句子就变成了一个矩阵这就是特征了 BiLSTM即双向LSTM就是在原本的LSTM增加了一个从后往前走的模块这样前向和反向两个方向都各自生成了一组特征把两个特征拼接起来得到一组新的特征得到翻倍的特征。其他前面和后续的处理操作都是一样的。
class Model(tf.keras.Model):def __init__(self, params):super().__init__()self.embedding tf.Variable(np.load(./vocab/word.npy), dtypetf.float32, namepretrained_embedding, trainableFalse,)self.drop1 tf.keras.layers.Dropout(params[dropout_rate])self.drop2 tf.keras.layers.Dropout(params[dropout_rate])self.drop3 tf.keras.layers.Dropout(params[dropout_rate])self.rnn1 tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(params[rnn_units], return_sequencesTrue))self.rnn2 tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(params[rnn_units], return_sequencesTrue))self.rnn3 tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(params[rnn_units], return_sequencesFalse))self.drop_fc tf.keras.layers.Dropout(params[dropout_rate])self.fc tf.keras.layers.Dense(2*params[rnn_units], tf.nn.elu)self.out_linear tf.keras.layers.Dense(2) def call(self, inputs, trainingFalse):if inputs.dtype ! tf.int32:inputs tf.cast(inputs, tf.int32)batch_sz tf.shape(inputs)[0]rnn_units 2*params[rnn_units]x tf.nn.embedding_lookup(self.embedding, inputs) x self.drop1(x, trainingtraining)x self.rnn1(x)x self.drop2(x, trainingtraining)x self.rnn2(x)x self.drop3(x, trainingtraining)x self.rnn3(x)x self.drop_fc(x, trainingtraining)x self.fc(x)x self.out_linear(x)return x自定义一个模型继承tf.keras.Model模块初始化函数初始化词嵌入把之前保存好的词嵌入文件向量读进来定义一层dropout1定义一层dropout2定义一层dropout3定义一个rnn1rnn_units表示得到多少维的特征return_sequences表示是返回一个序列还是最后一个输出定义一个rnn2最后一层的rnn肯定只需要最后一个输出前后两个rnn的堆叠肯定需要返回一个序列定义一个rnn3 tf.keras.layers.LSTM()直接就可以定义一个LSTM在外面再封装一层APItf.keras.layers.Bidirectional就实现了双向LSTM定义全连接层的dropout定义一个全连接层因为是双向的这里就需要把参数乘以2定义最后输出的全连接层只需要得到是正例还是负例所以是2定义前向传播函数传进来一个batch的数据和是否是在训练如果输入数据不是tf.int32类型转换成tf.int32类型取出batch_size设置LSTM神经元个数双向乘以2使用 TensorFlow 的 embedding_lookup 函数将输入的整数索引转换为词向量数据通过第1个 Dropout 层数据通过第1个rnn数据通过第2个 Dropout 层数据通过第2个rnn数据通过第3个 Dropout 层数据通过第3个rnn经过全连接层对应的Dropout数据通过一个全连接层最后数据通过一个输出层返回最终的模型输出