范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

使用TensorFlow进行文本分类

  1 前言
  在自然语言处理中,文本分类是非常普遍的应用,本文将介绍使用TensorFlow开发基于嵌入(Embedding)的文本分类模型,由于TensorFlow的API变化迅速且兼容性感人,因此本文均使用的截至2022年4月16日最新版的TensorFlow(tf)及相关库,主要包括: TensorFlow(v2.8.0) ,TensorFlow Datasets(tfds v4.0.1) 和TensorFlow Text(tf_text v2.8.1) ,如遇bug,请首先检查TensorFlow相关库的版本。此工作流主要使用的API有:tf.strings tfds tf_text tf.data.Dataset tf.keras (Sequential & Functional API) 2 获取数据
  TensorFlow Datasets(tfds)里含有非常多的 示例数据 [1] 用于研究试验,本文使用经典的电影评论数据,进行情感二分类任务的研究。首先使用tfds的API直接加载数据,结果将存在一个tf.data.Dataset [2] 对象中。import collections import pathlib  import tensorflow as tf from tensorflow.keras import layers from tensorflow.keras import losses from tensorflow.keras import utils from tensorflow.keras.layers import TextVectorization  import tensorflow_datasets as tfds import tensorflow_text as tf_text  import plotly.express as px import matplotlib.pyplot as plt  BATCH_SIZE = 32  # Training set. train_ds = tfds.load(     "imdb_reviews",     split="train[:80%]",     shuffle_files=True,     as_supervised=True)  # Validation set - a tf.data.Dataset object val_ds = tfds.load(     "imdb_reviews",     split="train[80%:]",     shuffle_files=True,     as_supervised=True)   # Check the count of records print(train_ds.cardinality().numpy()) print(val_ds.cardinality().numpy())
  返回值为: 20000 5000
  使用如下方法查看一条示例数据: for data, label in  train_ds.take(1):   print(type(data))   print("Text:", data.numpy())   print("Label:", label.numpy())
  返回值为:  Text: b"This was an absolutely terrible movie. Don"t be lured in by Christopher Walken or Michael Ironside. Both are great actors, but this must simply be their worst role in history. Even their great acting could not redeem this movie"s ridiculous storyline. This movie is an early nineties US propaganda piece. The most pathetic scenes were those when the Columbian rebels were making their cases for revolutions. Maria Conchita Alonso appeared phony, and her pseudo-love affair with Walken was nothing but a pathetic emotional plug in a movie that was devoid of any real meaning. I am disappointed that there are movies like this, ruining actor"s like Christopher Walken"s good name. I could barely sit through it." Label: 0 3 文本预处理
  该小节使用tf_text和tf.stings的处理文本的API对数据进行处理,tf.data.Dataset能够很方便地将对应的函数映射到数据中,推荐学习和使用。 3.1 转换文字大小写
  分类任务中字符大小写对模型预测没有贡献,因此对dataset使用 map 操作把所有字符转为小写,务必注意tf.data.Dataset里的数据格式。train_ds = train_ds.map(lambda text, label: (tf_text.case_fold_utf8(text), label)) val_ds = val_ds.map(lambda text, label: (tf_text.case_fold_utf8(text), label)) 3.2 文本格式化
  该步骤对文本使用正则表达式进行格式化处理,如标点前后加上空格,利于后续步骤使用空格分词。 str_regex_pattern = [("[^A-Za-z0-9(),!?"`]", " "),(""s", " "s",) ,(""ve", " "ve"),("n"t", " n"t"),(""re", " "re"),(""d", " "d") ,(""ll", " "ll"),(",", " , "),("!", " ! "),("(", " ( "),(")", " ) "),("?", " ? "),("s{2,}", " ")]  for pattern, rewrite in str_regex_pattern:   train_ds = train_ds.map(lambda text, label: (tf.strings.regex_replace(text, pattern=pattern, rewrite=rewrite), label))   val_ds = val_ds.map(lambda text, label: (tf.strings.regex_replace(text, pattern=pattern, rewrite=rewrite), label))  3.3 构建词表
  使用训练集构造词表(注意不要使用验证集或者测试集,会导致信息泄露),该步骤将字符映射到相应的索引,利于将数据转化为模型能够进行训练和预测的格式。 # Do not use validation set as that will lead to data leak train_text = train_ds.map(lambda text, label: text)  tokenizer = tf_text.WhitespaceTokenizer()  unique_tokens = collections.defaultdict(lambda: 0) sentence_length =  [] for text in train_text.as_numpy_iterator():   tokens = tokenizer.tokenize(text).numpy()   sentence_length.append(len(tokens))   for token in tokens:     unique_tokens[token] += 1  # check out the average sentence length -> ~250 tokens print(sum(sentence_length)/len(sentence_length))  # print 10 most used tokens - token, frequency d_view = [ (v,k) for k,v in unique_tokens.items()] d_view.sort(reverse=True)   for v,k in d_view[:10]:     print("%s: %d" % (k,v))
  返回值显示,高频使用的词都是英语中常见的字符: b"the": 269406 b",": 221098 b"and": 131502 b"a": 130309 b"of": 116695 b"to": 108605 b"is": 88351 b"br": 81558 b"it": 77094 b"in": 75177
  也可以使用图表直观地展示每个词的使用频率,这一步有利于帮助选择词表的大小。 fig = px.scatter(x=range(len(d_view)), y=[cnt for cnt, word in d_view]) fig.show()
  字符的使用频率分布
  由图可见,在七万多个字符中,许多字符出现的频率极低,因此选择词表大小为两万。 3.4 构建词表映射
  使用TensorFlow的 tf.lookup.StaticVocabularyTable 对字符进行映射,其能将字符映射到对应的索引上,并使用一个简单的样本进行测试。keys = [token for cnt, token in d_view][:vocab_size] values = range(2, len(keys) + 2)  # Reserve `0` for padding, `1` for OOV tokens.  num_oov_buckets =1  # Note: must assign the key_dtype and value_dtype when the keys and values are Python arrays init = tf.lookup.KeyValueTensorInitializer(     keys= keys,     values= values,     key_dtype=tf.string, value_dtype=tf.int64)  table = tf.lookup.StaticVocabularyTable(    init,    num_oov_buckets=num_oov_buckets)  # Test the look up table with sample input input_tensor = tf.constant(["emerson", "lake", "palmer", "king"]) print(table[input_tensor].numpy())
  输出为: array([20000,  2065, 14207,   618])
  接下来就可以将文本映射到索引上了,构造一个函数用于转化,并将它作用到数据集上: def text_index_lookup(text, label):   tokenized = tokenizer.tokenize(text)   vectorized = table.lookup(tokenized)   return vectorized, label  train_ds = train_ds.map(text_index_lookup) val_ds = val_ds.map(text_index_lookup) 3.5 配置数据集
  借助tf.data.Dataset的 cache 和prefetch API,能够有效提高性能,cache 方法将数据加载在内存中用于快速读写,而prefetch 则能够在模型预测时同步处理数据,提高时间利用率。AUTOTUNE = tf.data.AUTOTUNE  def configure_dataset(dataset):   return dataset.cache().prefetch(buffer_size=AUTOTUNE)  train_ds = configure_dataset(train_ds) val_ds = configure_dataset(val_ds)
  文本长短不一,但神经网络需要输入数据具有固定的维度,因此对数据进行padding确保长度一致,并分批次。 BATCH_SIZE = 32 train_ds = train_ds.padded_batch(BATCH_SIZE  ) val_ds = val_ds.padded_batch(BATCH_SIZE  ) 3.6 处理测试集
  用于验证模型性能的测试集也可以使用同样的方式处理,确保模型可以正常预测: # Test set. test_ds = tfds.load(     "imdb_reviews",     split="test",     # batch_size=BATCH_SIZE,     shuffle_files=True,     as_supervised=True)  test_ds = test_ds.map(lambda text, label: (tf_text.case_fold_utf8(text), label))  for pattern, rewrite in str_regex_pattern:   test_ds = test_ds.map(lambda text, label: (tf.strings.regex_replace(text, pattern=pattern, rewrite=rewrite), label))  test_ds = test_ds.map(text_index_lookup) test_ds = configure_dataset(test_ds) test_ds = test_ds.padded_batch(BATCH_SIZE  ) 4 建立模型4.1 使用Sequential API构建卷积神经网络vocab_size += 2 # 0 for padding and 1 for oov token  def create_model(vocab_size, num_labels, dropout_rate):   model = tf.keras.Sequential([       tf.keras.layers.Embedding(vocab_size, 128, mask_zero=True),        tf.keras.layers.Conv1D(32, 3, padding="valid", activation="relu", strides=1),       tf.keras.layers.MaxPooling1D(pool_size=2),        tf.keras.layers.Conv1D(64, 4, padding="valid", activation="relu", strides=1),       tf.keras.layers.MaxPooling1D(pool_size=2),        tf.keras.layers.Conv1D(128, 5, padding="valid", activation="relu", strides=1),       tf.keras.layers.GlobalMaxPooling1D( ),        tf.keras.layers.Dropout(dropout_rate),        tf.keras.layers.Dense(num_labels)   ])   return model  tf.keras.backend.clear_session() model = create_model(vocab_size=vocab_size, num_labels=2, dropout_rate=0.5)  # 在SGD中使用momentum将显著提高收敛速度 loss = losses.SparseCategoricalCrossentropy(from_logits=True) optimizer = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.9)  model.compile(loss=loss, optimizer=optimizer, metrics="accuracy")  print(model.summary())
  输出为: Model: "sequential" _________________________________________________________________  Layer (type)                Output Shape              Param #    =================================================================  embedding (Embedding)       (None, None, 128)         2560256      conv1d (Conv1D)             (None, None, 32)          12320        max_pooling1d (MaxPooling1D  (None, None, 32)         0           )                                                                  conv1d_1 (Conv1D)           (None, None, 64)          8256         max_pooling1d_1 (MaxPooling  (None, None, 64)         0           1D)                                                                conv1d_2 (Conv1D)           (None, None, 128)         41088        global_max_pooling1d (Globa  (None, 128)              0           lMaxPooling1D)                                                     dropout (Dropout)           (None, 128)               0            dense (Dense)               (None, 2)                 258         ================================================================= Total params: 2,622,178 Trainable params: 2,622,178 Non-trainable params: 0 _________________________________________________________________
  接下来即可训练、评估模型: # early stopping reduces the risk of overfitting early_stopping = tf.keras.callbacks.EarlyStopping(patience=10) epochs = 100 history = model.fit(x=train_ds, validation_data=val_ds,epochs=epochs, callbacks=[early_stopping])  loss, accuracy = model.evaluate(test_ds)  print("Loss: ", loss) print("Accuracy: {:2.2%}".format(accuracy))
  考虑到模型结构简单,效果还可以接受: 782/782 [==============================] - 57s 72ms/step - loss: 0.4583 - accuracy: 0.8678 Loss:  0.45827823877334595 Accuracy: 86.78% 4.2 使用Functional API构建双向LSTM
  步骤与使用Sequential API类似,但Functional API更为灵活。 input = tf.keras.layers.Input([None] ) x = tf.keras.layers.Embedding(         input_dim=vocab_size,         output_dim=128,         # Use masking to handle the variable sequence lengths         mask_zero=True)(input)  x = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64))(x) x = tf.keras.layers.Dense(64, activation="relu")(x) x = tf.keras.layers.Dropout(dropout_rate)(x) output = tf.keras.layers.Dense(num_labels)(x)  lstm_model = tf.keras.Model(inputs=input, outputs=output, name="text_lstm_model")  loss = losses.SparseCategoricalCrossentropy(from_logits=True) optimizer = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.9)  lstm_model.compile(loss=loss, optimizer=optimizer, metrics="accuracy")  lstm_model.summary()
  输出为: Model: "text_lstm_model" _________________________________________________________________  Layer (type)                Output Shape              Param #    =================================================================  input_5 (InputLayer)        [(None, None)]            0            embedding_5 (Embedding)     (None, None, 128)         2560256      bidirectional_4 (Bidirectio  (None, 128)              98816       nal)                                                               dense_4 (Dense)             (None, 64)                8256         dropout_2 (Dropout)         (None, 64)                0            dense_5 (Dense)             (None, 2)                 130         ================================================================= Total params: 2,667,458 Trainable params: 2,667,458 Non-trainable params: 0 _________________________________________________________________
  同样地,对模型进行训练与预测: history_2 = lstm_model.fit(x=train_ds, validation_data=val_ds, epochs=epochs, callbacks=[early_stopping])  loss, accuracy = lstm_model.evaluate(test_ds)  print("Loss: ", loss) print("Accuracy: {:2.2%}".format(accuracy))
  考虑到模型结构简单,效果还可以接受: 782/782 [==============================] - 84s 106ms/step - loss: 0.4105 - accuracy: 0.8160 Loss:  0.4105057716369629 Accuracy: 81.60% 5 总结
  关于文本分类,还有许多新的技术可以尝试,上述工作流中也还有许多决策可以做试验(炼丹),本文旨在使用最新的TensorFlow API过一遍文本分类任务中的重要知识点和常用API,实际工作中仍有许多地方可以优化。希望这次的分享对你有帮助,欢迎在评论区留言讨论! 参考资料
  [1] TensorFlow Datasets数据集:  https://www.tensorflow.org/datasets
  [2] tf.data.Dataset:  https://www.tensorflow.org/api_docs/python/tf/data/Dataset

高通骁龙888折叠屏1亿像素,小米MixFold降价3000元,价格真香最近骁龙8Gen1发布后,很多手机都在下调价格,有的手机价格下降了几百元,有的下降了1300元,比如小米Mix4,不过这些价格并不是下降最多的,今天就与大家分享一款价格下降3000为什么感觉技术能力很强的人,很难被领导重用?我发小曾经在一家公司做了五年的技术支持,公司有任何技术问题,只要他到场立马就能解决,老板也经常跟他说,好好干,不会亏待他,然而五年过去了,他连个技术总监都没混上,工资涨幅也低得离谱猪价跌跌涨涨,华为中兴的5G养猪场有多厉害!小猪场没优势了?干一行爱一行,也关注一行!咱养猪,除了平常看看猪病猪只护理,再有就是关注猪价行情,以及行业技术发展了,大家伙说是吧?最近的猪价跌跌涨涨,其实,最紧张的不是那些智能化大猪场,而是一些小红书回应审核漏放部分内容已被回查处理近日,媒体报道称,小红书涉嫌泄露未成年隐私及内容审核不严问题。对此,小红书对报道提及审核漏放情况致歉,并透露平台将于近期启动新一轮未成年治理专项。小红书回应称,报道中提及的部分内容华为的逆熵思维任正非给华为人讲的100个故事(9)拆2019年7月,华为大学出版了一本书熵减华为的活力之源,书中系统阐述了任正非管理思想中对熵减的理解。熵原本是热力学第二定律的概念能量是有效能量华为P20PROHinova9Pro参数报价对比华为P20PRO手机机型华为P20PROHinova9Pro最新价格3788元4199元屏幕尺寸6。1英寸6。72英寸屏幕类型OLEDOLED屏幕色彩1670万分辨率2240108从2799元跌至1799元,LCD屏大电池256G,骁龙870不香了吗?在手机市场当中,一款产品卖得好不好,不仅是要自己实力,口碑也是很重要的因素,像是小米那样,性价比方面很在行,但用户对它的高端旗舰却不感冒,除此之外,很多老牌厂商也面临着困境,比如联华为手机王者归来将成为可能,阿里正式宣布,存算一体芯片问世一导读众所周知,从2019年开始,西方针对华为展开了四次芯片限制,一次比一次彻底,直到现在,5G中高端芯片制造5G射频解决方案等先进技术设备产品等,依然处于被彻底限制出货的状态,近韩版三星note10开始测试OneUI4。0Beta更新三星GalaxyNote10是最后有机会测试OneUI4。0Beta的智能手机,三星现在正在向位于韩国的用户推出该更新。该公司目前正面向其折叠屏手机GalaxyS20和Note20王炸!小米MIX4直降1300,小米不赚钱了?当我们见到了骁龙8Gen1庐山真面目时,这也意味着未来旗舰手机市场将迎来新的变化,我们也很明显地发现,最近的手机圈氛围逐渐开始焦灼起来,前有小米和摩托罗拉为抢骁龙8Gen1的首发权芒格表示中国禁止加密货币做得对伯克希尔哈撒韦公司副主席查理芒格在一场行业会议上表示,目前的投资环境比自己过去几十年投资履历中所见的景象还要极端,许多股票的估值都与基本面脱节,高水平的股价让投资者更难跑赢市场。芒
旅行者1号为何被降速?太阳系边缘是否存在神秘力量?减速是合理的,不减速才是有情况。为什么这样说呢?这是因为旅行者1号一直在与太阳引力相抗衡,它于1977年发射后在太空中飞行了40多年了,每时每刻都在与太阳引力对抗,因为他是太阳系里有人说白洞比黑洞更可怕,为什么?因为白洞的喷流对着谁就成灰,这个距离应该是600光年?白洞是一种理论上存在的物体,它的特性与黑洞完全相反,简单来说物质遇到黑洞就是有进无出,而物质遇到白洞,连进都进不去,也就是有出无进。但实际上,人类目前也只有发现了黑洞的存在,而白洞助听器要去哪里配呀?医院可以吗?听力下降的人需要佩戴助听器,这个必须去医院检查听力级别,才能准确的佩戴助听器。目前各地县级以上城市基本都有助听器专卖店,专卖店就可以检验听力。谢邀。医院和专业的听力中心都可以配的,三星离开中国依然是世界第一,说明中国市场没想象的那么重要吗?你要是这么看问题的,只能说你太片面了。因为现在的中国已经没有可能再用市场去交换任何技术了。中国的经济发展到现在这个水平,人民的生活水平只能向上不能向下,所以在任何领域中国都必须争得荣耀magic3已渐渐接替mate的重任今天荣耀magic3更新了系统,支持了微信的3D人脸识别,再来几波更新,就越来越完整了,之前去店里摸magic3的时候,销售就一直推销说它是mate40pro一样的,什么更低的价格华为再提速,鸿蒙OS用户突破9000万,共90款华为荣耀机型可升级自6月2日起,华为正式发布鸿蒙OS2。0之后,引起了很大的反响,刚推出仅一周用户量就突破了1000万,一个月用户量突破3000万,两个月时间突破5000万。到8月底,鸿蒙OS2。0不足400元可以买到什么好耳机?万魔舒适豆升级版使用分享1MORE舒适豆是一款用户呼声很高的产品,这种半入耳式耳机相比入耳式耳机的优势就是在佩戴上更加舒服,减少了压迫感。对于不习惯戴耳机的用户还有耳道比较小的用户来说是一个不错的选择而对宽频显示技术落地,TCL华星突破手机屏幕瓶颈随着国内手机市场的竞争趋向激烈,多家厂商都不得不对旗下的产品进行全方位升级,其中也包括了对手机屏幕的优化。这也在一定程度上倒推着面板厂商加速自身的技术研发水平,从而突破瓶颈,真正推极米NEWZ8X怎么样?值得买吗?随着近几年家用投影行业的快速发展,投影的技术更新的也越来越快,体积小,屏幕大,操作简单此外,投影通过漫反射的成像原理使得人眼看到的光线更加柔和,相比液晶屏看久了不会感觉眼睛特别的疲智能家电与传统家电的区别,智能家电发展的必经之路是什么?随着科技的不断发展,人们生活水平的提高,智能化产品受到广泛的关注和欢迎,智能家电也走进了消费者的视野,智能家电是在传统家电基础上打造而成,不少小伙伴好奇智能家电与传统家电的区别。智骨感耳机品牌排名,性价比最高的骨传导耳机就在最近两三年的时间里,市面上出现了不少骨传导耳机,其中有很多老牌音频厂商开拓新的方向,也有不少新锐品牌跃跃欲试,而就目前形势而言,依旧是以南卡韶音等骨传导耳机首批开拓者为首。对于