文本分類

==剛剛看到這個(gè)課題的時(shí)候,剛覺很難,但是實(shí)際上有一個(gè)通用的輪子之后就很好處理了,這個(gè)輪子就是預(yù)處理模型==

一、預(yù)處理模型

實(shí)際上就是將現(xiàn)實(shí)生活中的東西進(jìn)行量化處理。

包括這次要處理的文本分類,實(shí)際上也是建立在文本預(yù)處理模型的基礎(chǔ)上,提供了一層將文本量化的操作,有如下的優(yōu)點(diǎn):

  • 不必關(guān)注文本處理
  • 從遷移學(xué)習(xí)中受益
  • 輸出具有固定長(zhǎng)度,容易數(shù)據(jù)處理

1.模型的加載和設(shè)置

embedding = "https://tfhub.dev/google/tf2-preview/gnews-swivel-20dim/1"
hub_layer = hub.KerasLayer(embedding, input_shape=[], dtype=tf.string, trainable=True)
  • default 指明模型的路徑,本地路徑或者網(wǎng)絡(luò)路徑都可以
  • input_shape 指明模型的輸入形狀
  • output_shape 指明輸出形狀, 默認(rèn)[20] ,輸出的就是[batch, 20] 和輸入的batch也有關(guān)系
  • dtype 指明模型的輸入數(shù)據(jù)類型
  • trainable 指明是否一起參與訓(xùn)練

二、數(shù)據(jù)集合

這是google提供的用于學(xué)習(xí)的數(shù)據(jù)集合,使的我們可以關(guān)注模型,而不是忙于采集數(shù)據(jù)

  • tensorflow_datasets
  • tensorflow.keras.database

1.數(shù)據(jù)加載

train_data, test_data = tensorflow_datasets.load(name="imdb_reviews")

其實(shí)重點(diǎn)就是指明數(shù)據(jù)集的名稱,返回的數(shù)據(jù)包含兩個(gè)部分,訓(xùn)練數(shù)據(jù)train_data , 測(cè)試數(shù)據(jù) test_data

2.數(shù)據(jù)分割

train_data_split = tesorflow_datasets.Split.TRAIN.subsplit([6,4])
(train_data, validation_data), test_data =S tensorflow_datasets.load(
                            name="imdb_reviews", split=(train_data_split, tensorflow_datasets.Split.TEST)
                            );

重點(diǎn)就是創(chuàng)建一個(gè)分割的 train_data_split變量,分割比例 6:4, 分成train_data(訓(xùn)練數(shù)據(jù)集)和validation_data(驗(yàn)證數(shù)據(jù)集),這個(gè)只是指定train_data 是如何分割,test_data 不用分割直接指定tensorflow_datasets.Split.TEST。

3.數(shù)據(jù)格式

train_validation_split = tfds.Split.TRAIN.subsplit([6, 4])
(train_data, validation_data), test_data = tfds.load(
    name="imdb_reviews",
    split=(train_validation_split, tfds.Split.TEST),
    as_supervised=True
)

關(guān)注一下, ==as_supervised==字段,指明輸出的格式是 ==輸入數(shù)據(jù) + 標(biāo)簽== 的格式。

比如: train_data中就包含(輸入數(shù)據(jù), 標(biāo)簽)的格式。

4.數(shù)據(jù)打亂

model.fit(train_data.shuffle(10000).batch(512), epochs=20, validation_data= validation_data.batch(512), verbose=1)

在使用數(shù)據(jù)中調(diào)用了 shuffle方法隨機(jī)打亂數(shù)據(jù),參數(shù)1000 指的是打亂前1000條數(shù)據(jù)

三、完整的案例

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Time : 2020/4/9 11:00 上午
# Author : Dale Chen
# Description: 
# File : imdb.py

import numpy as np
import tensorflow as tf
import tensorflow_hub as hub
import tensorflow_datasets as tfds

train_validation_split = tfds.Split.TRAIN.subsplit([6, 4])
(train_data, validation_data), test_data = tfds.load(
    name="imdb_reviews",
    split=(train_validation_split, tfds.Split.TEST),
    as_supervised=True
)

train_example_batch, train_labels_batch = next(iter(train_data.batch(10)))

embedding = "https://tfhub.dev/google/tf2-preview/gnews-swivel-20dim/1"
hub_layer = hub.KerasLayer(embedding, dtype=tf.string, trainable=True)

model = tf.keras.Sequential()
model.add(hub_layer)
model.add(tf.keras.layers.Dense(16, activation=tf.keras.activations.relu))
model.add(tf.keras.layers.Dense(1, activation=tf.keras.activations.sigmoid))

model.compile(optimizer=tf.keras.optimizers.Adam(), loss=tf.keras.losses.BinaryCrossentropy(), metrics=[tf.keras.metrics.Accuracy()])
model.fit(train_data.shuffle(10000).batch(512), epochs=20, validation_data= validation_data.batch(512), verbose=1)

results = model.evaluate(test_data.batch(512), verbose=2)
for name, value in zip(model.metrics_names, results):
    print("%s : %.3f" % (name, value))
  1. 激活函數(shù)的選擇
model.add(tf.keras.layers.Dense(16, activation='relu'))

中間層的選擇任然是常用的 relu 類型

model.add(tf.keras.layers.Dense(1, activation=tf.keras.activations.sigmoid))

輸出層選用的是一個(gè) sigmoid 激活函數(shù),這個(gè)函數(shù)的的效果就是將輸出值控制在 0 - 1 之間。

image

2.損失函數(shù)

這個(gè)是一個(gè)二元(Binary)或者二分類,采用的損失函數(shù)也是需要針對(duì)二分類的BinaryCrossentropy

model.compile(optimizer=tf.keras.optimizers.Adam(), loss=tf.keras.losses.BinaryCrossentropy(), metrics=[tf.keras.metrics.Accuracy()])
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容