==剛剛看到這個(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))
- 激活函數(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 之間。
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()])