TensorFlow 2建立神經(jīng)網(wǎng)絡(luò)分類模型—以iris數(shù)據(jù)為例
原文鏈接:http://tecdat.cn/?p=15791?
?
本文將利用機器學(xué)習(xí)的手段來對鳶尾花按照物種進行分類。本教程將利用 TensorFlow 來進行以下操作:
構(gòu)建一個模型,
用樣例數(shù)據(jù)集對模型進行訓(xùn)練,以及
利用該模型對未知數(shù)據(jù)進行預(yù)測。
TensorFlow 編程
本指南采用了以下高級 TensorFlow 概念:
使用 TensorFlow 默認的?eager execution?開發(fā)環(huán)境,
使用?Datasets API?導(dǎo)入數(shù)據(jù),
使用 TensorFlow 的?Keras API?來構(gòu)建各層以及整個模型。
本教程的結(jié)構(gòu)同很多 TensorFlow 程序相似:
數(shù)據(jù)集的導(dǎo)入
選擇模型類型
對模型進行訓(xùn)練
評估模型效果
使用訓(xùn)練過的模型進行預(yù)測
環(huán)境的搭建
配置導(dǎo)入
導(dǎo)入 TensorFlow 以及其他需要的 Python 庫。 默認情況下,TensorFlow 用?eager execution?來實時評估操作。?
from __future__ import absolute_import, division, print_function, unicode_literals
import os
import matplotlib.pyplot as plt
?
import tensorflow as tf
?
print("TensorFlow version: {}".format(tf.__version__))
print("Eager execution: {}".format(tf.executing_eagerly()))
?
TensorFlow version: 2.0.0
Eager execution: True
?
鳶尾花分類問題
想象一下,您是一名植物學(xué)家,正在尋找一種能夠?qū)λl(fā)現(xiàn)的每株鳶尾花進行自動歸類的方法。機器學(xué)習(xí)可提供多種從統(tǒng)計學(xué)上分類花卉的算法。例如,一個復(fù)雜的機器學(xué)習(xí)程序可以根據(jù)照片對花卉進行分類。我們將根據(jù)鳶尾花花萼和花瓣的長度和寬度對其進行分類。
鳶尾屬約有 300 個品種,但我們的程序?qū)H對下列三個品種進行分類:
山鳶尾
維吉尼亞鳶尾
變色鳶尾

導(dǎo)入和解析訓(xùn)練數(shù)據(jù)集
下載數(shù)據(jù)集文件并將其轉(zhuǎn)換為可供此 Python 程序使用的結(jié)構(gòu)。
下載數(shù)據(jù)集
使用?tf.keras.utils.get_file?函數(shù)下載訓(xùn)練數(shù)據(jù)集文件。該函數(shù)會返回下載文件的文件路徑:
?
- 0s 0us/step
Local copy of the dataset file: /home/kbuilder/.keras/datasets/iris_training.csv
?
檢查數(shù)據(jù)
數(shù)據(jù)集?iris_training.csv
?是一個純文本文件,其中存儲了逗號分隔值 (CSV) 格式的表格式數(shù)據(jù).請使用?head -n5
?命令查看前 5 個條目:
!head -n5 {train_dataset_fp}
?
120,4,setosa,versicolor,virginica
6.4,2.8,5.6,2.2,2
5.0,2.3,3.3,1.0,1
4.9,2.5,4.5,1.7,2
4.9,3.1,1.5,0.1,0
?
我們可以從該數(shù)據(jù)集視圖中注意到以下信息:
第一行是表頭,其中包含數(shù)據(jù)集信息:
共有 120 個樣本。每個樣本都有四個特征和一個標(biāo)簽名稱,標(biāo)簽名稱有三種可能。
后面的行是數(shù)據(jù)記錄,每個樣本各占一行,其中:
前四個字段是特征: 這四個字段代表的是樣本的特點。在此數(shù)據(jù)集中,這些字段存儲的是代表花卉測量值的浮點數(shù)。
最后一列是標(biāo)簽:即我們想要預(yù)測的值。對于此數(shù)據(jù)集,該值為 0、1 或 2 中的某個整數(shù)值(每個值分別對應(yīng)一個花卉名稱)。
我們用代碼表示出來:
# CSV文件中列的順序
print("Features: {}".format(feature_names))
print("Label: {}".format(label_name))
?
Features: ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
Label: species
?
每個標(biāo)簽都分別與一個字符串名稱(例如 “setosa” )相關(guān)聯(lián),但機器學(xué)習(xí)通常依賴于數(shù)字值。標(biāo)簽編號會映射到一個指定的表示法,例如:
0
?: 山鳶尾1
?: 變色鳶尾2
?: 維吉尼亞鳶尾
?
?
創(chuàng)建一個?tf.data.Dataset
TensorFlow的?Dataset API?可處理在向模型加載數(shù)據(jù)時遇到的許多常見情況。這是一種高階 API ,用于讀取數(shù)據(jù)并將其轉(zhuǎn)換為可供訓(xùn)練使用的格式。
由于數(shù)據(jù)集是 CSV 格式的文本文件,請使用?make_csv_dataset?函數(shù)將數(shù)據(jù)解析為合適的格式。由于此函數(shù)為訓(xùn)練模型生成數(shù)據(jù),默認行為是對數(shù)據(jù)進行隨機處理 (shuffle=True, shuffle_buffer_size=10000
),并且無限期重復(fù)數(shù)據(jù)集(num_epochs=None
)。 我們還設(shè)置了?batch_size?參數(shù):
?
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_core/python/data/experimental/ops/readers.py:521: parallel_interleave (from tensorflow.python.data.experimental.ops.interleave_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use `tf.data.Dataset.interleave(map_func, cycle_length, block_length, num_parallel_calls=tf.data.experimental.AUTOTUNE)` instead. If sloppy execution is desired, use `tf.data.Options.experimental_determinstic`.
?
make_csv_dataset
?返回一個(features, label)
?對構(gòu)建的?tf.data.Dataset
?,其中?features
?是一個字典:?{'feature_name': value}
這些?Dataset
?對象是可迭代的。 我們來看看下面的一些特征:
?
OrderedDict([('sepal_length', <tf.Tensor: id=68, shape=(32,), dtype=float32, numpy=
array([6.7, 6.1, 6.6, 6.7, 5.4, 5.5, 5.1, 5.8, 5.2, 6.4, 7.3, 4.9, 6.1,
4.6, 4.6, 5.5, 6.7, 6. , 5.7, 6. , 7.7, 5. , 5.8, 5. , 4.5, 5.1,
5.3, 5.6, 5.2, 6.4, 6.6, 4.6], dtype=float32)>), ('sepal_width', <tf.Tensor: id=69, shape=(32,), dtype=float32, numpy=
array([3. , 2.6, 3. , 3. , 3.4, 2.6, 3.7, 2.7, 2.7, 3.2, 2.9, 2.4, 2.8,
3.4, 3.6, 2.4, 3.1, 2.9, 2.8, 2.2, 3.8, 3.3, 2.7, 3.2, 2.3, 2.5,
3.7, 2.5, 3.4, 2.8, 2.9, 3.2], dtype=float32)>), ('petal_length', <tf.Tensor: id=66, shape=(32,), dtype=float32, numpy=
array([5.2, 5.6, 4.4, 5. , 1.5, 4.4, 1.5, 4.1, 3.9, 5.3, 6.3, 3.3, 4. ,
1.4, 1. , 3.7, 5.6, 4.5, 4.5, 5. , 6.7, 1.4, 5.1, 1.2, 1.3, 3. ,
1.5, 3.9, 1.4, 5.6, 4.6, 1.4], dtype=float32)>), ('petal_width', <tf.Tensor: id=67, shape=(32,), dtype=float32, numpy=
array([2.3, 1.4, 1.4, 1.7, 0.4, 1.2, 0.4, 1. , 1.4, 2.3, 1.8, 1. , 1.3,
0.3, 0.2, 1. , 2.4, 1.5, 1.3, 1.5, 2.2, 0.2, 1.9, 0.2, 0.3, 1.1,
0.2, 1.1, 0.2, 2.2, 1.3, 0.2], dtype=float32)>)])
?
注意到具有相似特征的樣本會歸為一組,即分為一批。更改?batch_size
?可以設(shè)置存儲在這些特征數(shù)組中的樣本數(shù)。
繪制該批次中的幾個特征后,就會開始看到一些集群現(xiàn)象:
plt.scatter(features['petal_length'],
? ? ? ? ? ? features['sepal_length'],
? ? ? ? ? ? c=labels,
? ? ? ? ? ? cmap='viridis')
plt.xlabel("Petal length")
plt.ylabel("Sepal length")
plt.show()
?

要簡化模型構(gòu)建步驟,請創(chuàng)建一個函數(shù)以將特征字典重新打包為形狀為?(batch_size, num_features)
?的單個數(shù)組。
此函數(shù)使用?tf.stack?方法,該方法從張量列表中獲取值,并創(chuàng)建指定維度的組合張量:
def pack_features_vector(features, labels):
? """將特征打包到一個數(shù)組中"""
? features = tf.stack(list(features.values()), axis=1)
? return features, labels
?
然后使用?tf.data.Dataset.map?方法將每個?(features,label)
?對中的?features
?打包到訓(xùn)練數(shù)據(jù)集中:
train_dataset = train_dataset.map(pack_features_vector)
?
Dataset
?的特征元素被構(gòu)成了形如?(batch_size, num_features)
?的數(shù)組。
?
選擇模型類型
為何要使用模型?
模型是指特征與標(biāo)簽之間的關(guān)系。對于鳶尾花分類問題,模型定義了花萼和花瓣測量值與預(yù)測的鳶尾花品種之間的關(guān)系。一些簡單的模型可以用幾行代數(shù)進行描述,但復(fù)雜的機器學(xué)習(xí)模型擁有大量難以匯總的參數(shù)。
您能否在不使用機器學(xué)習(xí)的情況下確定四個特征與鳶尾花品種之間的關(guān)系?也就是說,您能否使用傳統(tǒng)編程技巧(例如大量條件語句)創(chuàng)建模型?也許能,前提是反復(fù)分析該數(shù)據(jù)集,并最終確定花瓣和花萼測量值與特定品種的關(guān)系。對于更復(fù)雜的數(shù)據(jù)集來說,這會變得非常困難,或許根本就做不到。一個好的機器學(xué)習(xí)方法可為您確定模型。如果您將足夠多的代表性樣本饋送到正確類型的機器學(xué)習(xí)模型中,該程序便會為您找出相應(yīng)的關(guān)系。
選擇模型
我們需要選擇要進行訓(xùn)練的模型類型。模型具有許多類型,挑選合適的類型需要一定的經(jīng)驗。本教程使用神經(jīng)網(wǎng)絡(luò)來解決鳶尾花分類問題。神經(jīng)網(wǎng)絡(luò)可以發(fā)現(xiàn)特征與標(biāo)簽之間的復(fù)雜關(guān)系。神經(jīng)網(wǎng)絡(luò)是一個高度結(jié)構(gòu)化的圖,其中包含一個或多個隱含層。每個隱含層都包含一個或多個神經(jīng)元。 神經(jīng)網(wǎng)絡(luò)有多種類別,該程序使用的是密集型神經(jīng)網(wǎng)絡(luò),也稱為全連接神經(jīng)網(wǎng)絡(luò)?: 一個層中的神經(jīng)元將從上一層中的每個神經(jīng)元獲取輸入連接。例如,圖 2 顯示了一個密集型神經(jīng)網(wǎng)絡(luò),其中包含 1 個輸入層、2 個隱藏層以及 1 個輸出層:

當(dāng)圖 2 中的模型經(jīng)過訓(xùn)練并獲得無標(biāo)簽樣本后,它會產(chǎn)生 3 個預(yù)測結(jié)果:相應(yīng)鳶尾花屬于指定品種的可能性。這種預(yù)測稱為推理。對于該示例,輸出預(yù)測結(jié)果的總和是 1.0。在圖 2 中,該預(yù)測結(jié)果分解如下:山鳶尾為 0.02,變色鳶尾為 0.95,維吉尼亞鳶尾為 0.03。這意味著該模型預(yù)測某個無標(biāo)簽鳶尾花樣本是變色鳶尾的概率為 95%。
使用 Keras 創(chuàng)建模型
TensorFlow?tf.keras?API 是創(chuàng)建模型和層的首選方式。通過該 API,您可以輕松地構(gòu)建模型并進行實驗,而將所有部分連接在一起的復(fù)雜工作則由 Keras 處理。
tf.keras.Sequential?模型是層的線性堆疊。該模型的構(gòu)造函數(shù)會采用一系列層實例;在本示例中,采用的是 2 個密集層(各自包含10個節(jié)點),以及 1 個輸出層(包含 3 個代表標(biāo)簽預(yù)測的節(jié)點。第一個層的?input_shape
?參數(shù)對應(yīng)該數(shù)據(jù)集中的特征數(shù)量,它是一項必需參數(shù):
model = tf.keras.Sequential([
? tf.keras.layers.Dense(10, activation=tf.nn.relu, input_shape=(4,)), ?# 需要給出輸入的形式
? tf.keras.layers.Dense(10, activation=tf.nn.relu),
? tf.keras.layers.Dense(3)
])
?
激活函數(shù)可決定層中每個節(jié)點的輸出形式。 這些非線性關(guān)系很重要,如果沒有它們,模型將等同于單個層。激活函數(shù)有很多種,但隱藏層通常使用?ReLU。
隱藏層和神經(jīng)元的理想數(shù)量取決于問題和數(shù)據(jù)集。與機器學(xué)習(xí)的多個方面一樣,選擇最佳的神經(jīng)網(wǎng)絡(luò)形狀需要一定的知識水平和實驗基礎(chǔ)。一般來說,增加隱藏層和神經(jīng)元的數(shù)量通常會產(chǎn)生更強大的模型,而這需要更多數(shù)據(jù)才能有效地進行訓(xùn)練。
使用模型
我們快速了解一下此模型如何處理一批特征:
?
<tf.Tensor: id=231, shape=(5, 3), dtype=float32, numpy=
array([[-0.40338838, ?0.01194552, -1.964499 ?],
[-0.5877474 , ?0.02103703, -2.9969394 ],
[-0.40222907, ?0.35343137, -0.7817157 ],
[-0.4376807 , ?0.40464264, -0.8379218 ],
[-0.39644662, ?0.31841943, -0.8436158 ]], dtype=float32)>
?
在此示例中,每個樣本針對每個類別返回一個?logit。
要將這些對數(shù)轉(zhuǎn)換為每個類別的概率:
?
<tf.Tensor: id=236, shape=(5, 3), dtype=float32, numpy=
array([[0.36700222, 0.55596304, 0.07703481],
[0.3415203 , 0.62778115, 0.03069854],
[0.2622449 , 0.55832386, 0.17943124],
[0.25050646, 0.58161455, 0.167879 ?],
[0.27149206, 0.5549062 , 0.17360175]], dtype=float32)>
?
對每個類別執(zhí)行?tf.argmax
?運算可得出預(yù)測的類別索引。不過,該模型尚未接受訓(xùn)練,因此這些預(yù)測并不理想。
print("Prediction: {}".format(tf.argmax(predictions, axis=1)))
print(" ? ?Labels: {}".format(labels))
?
Prediction: [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
Labels: [1 2 0 0 0 2 0 1 0 2 0 0 2 2 2 2 1 2 2 1 2 0 2 1 0 2 2 1 1 1 2 2]
?
訓(xùn)練模型
訓(xùn)練?是一個機器學(xué)習(xí)階段,在此階段中,模型會逐漸得到優(yōu)化,也就是說,模型會了解數(shù)據(jù)集。目標(biāo)是充分了解訓(xùn)練數(shù)據(jù)集的結(jié)構(gòu),以便對測試數(shù)據(jù)進行預(yù)測。如果您從訓(xùn)練數(shù)據(jù)集中獲得了過多的信息,預(yù)測便會僅適用于模型見過的數(shù)據(jù),但是無法泛化。此問題被稱之為過擬合—就好比將答案死記硬背下來,而不去理解問題的解決方式。
鳶尾花分類問題是監(jiān)督式機器學(xué)習(xí)的一個示例: 模型通過包含標(biāo)簽的樣本加以訓(xùn)練。 而在非監(jiān)督式機器學(xué)習(xí)中,樣本不包含標(biāo)簽。相反,模型通常會在特征中發(fā)現(xiàn)一些規(guī)律。
定義損失和梯度函數(shù)
在訓(xùn)練和評估階段,我們都需要計算模型的損失。 這樣可以衡量模型的預(yù)測結(jié)果與預(yù)期標(biāo)簽有多大偏差,也就是說,模型的效果有多差。我們希望盡可能減小或優(yōu)化這個值。
我們的模型會使用?tf.keras.losses.SparseCategoricalCrossentropy
?函數(shù)計算其損失,此函數(shù)會接受模型的類別概率預(yù)測結(jié)果和預(yù)期標(biāo)簽,然后返回樣本的平均損失。
?
Loss test: 2.1644210815429688
?
使用?tf.GradientTape?的前后關(guān)系來計算梯度以優(yōu)化你的模型。
?
創(chuàng)建優(yōu)化器
優(yōu)化器?會將計算出的梯度應(yīng)用于模型的變量,以使?loss
?函數(shù)最小化。您可以將損失函數(shù)想象為一個曲面,我們希望通過到處走動找到該曲面的最低點。梯度指向最高速上升的方向,因此我們將沿相反的方向向下移動。我們以迭代方式計算每個批次的損失和梯度,以在訓(xùn)練過程中調(diào)整模型。模型會逐漸找到權(quán)重和偏差的最佳組合,從而將損失降至最低。損失越低,模型的預(yù)測效果就越好。
TensorFlow有許多可用于訓(xùn)練的優(yōu)化算法。learning_rate
?被用于設(shè)置每次迭代(向下行走)的步長。 這是一個?超參數(shù)?,您通常需要調(diào)整此參數(shù)以獲得更好的結(jié)果。
我們來設(shè)置優(yōu)化器:
optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)
?
我們將使用它來計算單個優(yōu)化步驟:
?
Step: 0, Initial Loss: 2.1644210815429688
Step: 1, ? ? ? ? Loss: 1.8952136039733887
?
訓(xùn)練循環(huán)
一切準(zhǔn)備就緒后,就可以開始訓(xùn)練模型了!訓(xùn)練循環(huán)會將數(shù)據(jù)集樣本饋送到模型中,以幫助模型做出更好的預(yù)測。以下代碼塊可設(shè)置這些訓(xùn)練步驟:
迭代每個周期。通過一次數(shù)據(jù)集即為一個周期。
在一個周期中,遍歷訓(xùn)練?
Dataset
?中的每個樣本,并獲取樣本的特征(x
)和標(biāo)簽(y
)。根據(jù)樣本的特征進行預(yù)測,并比較預(yù)測結(jié)果和標(biāo)簽。衡量預(yù)測結(jié)果的不準(zhǔn)確性,并使用所得的值計算模型的損失和梯度。
使用?
optimizer
?更新模型的變量。跟蹤一些統(tǒng)計信息以進行可視化。
對每個周期重復(fù)執(zhí)行以上步驟。
num_epochs
?變量是遍歷數(shù)據(jù)集集合的次數(shù)。與直覺恰恰相反的是,訓(xùn)練模型的時間越長,并不能保證模型就越好。num_epochs
?是一個可以調(diào)整的超參數(shù)。選擇正確的次數(shù)通常需要一定的經(jīng)驗和實驗基礎(chǔ)。
## Note: 使用相同的模型變量重新運行此單元
# 保留結(jié)果用于繪制
train_loss_results = []
train_accuracy_results = []
num_epochs = 201
? for x, y in train_dataset:
? ? # 優(yōu)化模型
? ? loss_value, grads = grad(model, x, y)
? ? optimizer.apply_gradients(zip(grads, model.trainable_variables))
? ? # 追蹤進度
? ? epoch_loss_avg(loss_value) ?# 添加當(dāng)前的 batch loss
? ? # 比較預(yù)測標(biāo)簽與真實標(biāo)簽
? ? epoch_accuracy(y, model(x))
? # 循環(huán)結(jié)束
? train_loss_results.append(epoch_loss_avg.result())
? train_accuracy_results.append(epoch_accuracy.result())
?
Epoch 000: Loss: 1.435, Accuracy: 30.000%
Epoch 050: Loss: 0.091, Accuracy: 97.500%
Epoch 100: Loss: 0.062, Accuracy: 97.500%
Epoch 150: Loss: 0.052, Accuracy: 98.333%
Epoch 200: Loss: 0.055, Accuracy: 99.167%
?
可視化損失函數(shù)隨時間推移而變化的情況
雖然輸出模型的訓(xùn)練過程有幫助,但查看這一過程往往更有幫助。
看到損失下降且準(zhǔn)確率上升。
plt.show()
?

評估模型的效果
模型已經(jīng)過訓(xùn)練,現(xiàn)在我們可以獲取一些關(guān)于其效果的統(tǒng)計信息了。
評估?指的是確定模型做出預(yù)測的效果。要確定模型在鳶尾花分類方面的效果,請將一些花萼和花瓣測量值傳遞給模型,并要求模型預(yù)測它們所代表的鳶尾花品種。然后,將模型的預(yù)測結(jié)果與實際標(biāo)簽進行比較。例如,如果模型對一半輸入樣本的品種預(yù)測正確,則?準(zhǔn)確率?為?0.5
?。 圖 顯示的是一個效果更好一些的模型,該模型做出 5 次預(yù)測,其中有 4 次正確,準(zhǔn)確率為 80%:
樣本特征標(biāo)簽?zāi)P皖A(yù)測5.93.04.31.5116.93.15.42.1225.13.31.70.5006.03.44.51.6125.52.54.01.311圖 .?準(zhǔn)確率為 80% 的鳶尾花分類器
?
建立測試數(shù)據(jù)集
評估模型與訓(xùn)練模型相似。最大的區(qū)別在于,樣本來自一個單獨的測試集,而不是訓(xùn)練集。為了公正地評估模型的效果,用于評估模型的樣本務(wù)必與用于訓(xùn)練模型的樣本不同。
測試?Dataset
?的建立與訓(xùn)練?Dataset
?相似。下載 CSV 文本文件并解析相應(yīng)的值,然后對數(shù)據(jù)稍加隨機化處理:
Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/iris_test.csv
8192/573 [============================================================================================================================================================================================================================================================================================================================================================================================================================================] - 0s 0us/step
?
?
根據(jù)測試數(shù)據(jù)集評估模型
在以下代碼單元格中,我們會遍歷測試集中的每個樣本,然后將模型的預(yù)測結(jié)果與實際標(biāo)簽進行比較。這是為了衡量模型在整個測試集中的準(zhǔn)確率。
print("Test set accuracy: {:.3%}".format(test_accuracy.result()))
?
Test set accuracy: 96.667%
?
例如,我們可以看到對于最后一批數(shù)據(jù),該模型通常預(yù)測正確:
?
<tf.Tensor: id=115075, shape=(30, 2), dtype=int32, numpy=
array([[1, 1],
[2, 2],
[0, 0],
[1, 1],
[1, 1],
[1, 1],
[0, 0],
[2, 1],
[1, 1],
[2, 2],
[2, 2],
[0, 0],
[2, 2],
[1, 1],
[1, 1],
[0, 0],
[1, 1],
[0, 0],
[0, 0],
[2, 2],
[0, 0],
[1, 1],
[2, 2],
[1, 1],
[1, 1],
[1, 1],
[0, 0],
[1, 1],
[2, 2],
[1, 1]], dtype=int32)>
?
使用經(jīng)過訓(xùn)練的模型進行預(yù)測
我們已經(jīng)訓(xùn)練了一個模型并“證明”它是有效的,但在對鳶尾花品種進行分類方面,這還不夠?,F(xiàn)在,我們使用經(jīng)過訓(xùn)練的模型對?無標(biāo)簽樣本(即包含特征但不包含標(biāo)簽的樣本)進行一些預(yù)測。
在現(xiàn)實生活中,無標(biāo)簽樣本可能來自很多不同的來源,包括應(yīng)用、CSV 文件和數(shù)據(jù)。暫時我們將手動提供三個無標(biāo)簽樣本以預(yù)測其標(biāo)簽?;叵胍幌拢瑯?biāo)簽編號映射表示法:
0
: 山鳶尾1
: 變色鳶尾2
: 維吉尼亞鳶尾
for i, logits in enumerate(predictions):
? class_idx = tf.argmax(logits).numpy()
? p = tf.nn.softmax(logits)[class_idx]
? name = class_names[class_idx]
? print("Example {} prediction: {} ({:4.1f}%)".format(i, name, 100*p))
?
Example 0 prediction: Iris setosa (99.9%)
Example 1 prediction: Iris versicolor (100.0%)
Example 2 prediction: Iris virginica (96.2%)

參考文獻
1.r語言用神經(jīng)網(wǎng)絡(luò)改進nelson-siegel模型擬合收益率曲線分析
2.r語言實現(xiàn)擬合神經(jīng)網(wǎng)絡(luò)預(yù)測和結(jié)果可視化
3.python用遺傳算法-神經(jīng)網(wǎng)絡(luò)-模糊邏輯控制算法對樂透分析
4.用于nlp的python:使用keras的多標(biāo)簽文本lstm神經(jīng)網(wǎng)絡(luò)分類
5.用r語言實現(xiàn)神經(jīng)網(wǎng)絡(luò)預(yù)測股票實例
6.R語言基于Keras的小數(shù)據(jù)集深度學(xué)習(xí)圖像分類
7.用于NLP的seq2seq模型實例用Keras實現(xiàn)神經(jīng)機器翻譯
8.python中基于網(wǎng)格搜索算法優(yōu)化的深度學(xué)習(xí)模型分析糖
9.matlab使用貝葉斯優(yōu)化的深度學(xué)習(xí)請選中你要保存的內(nèi)容,粘貼到此文本框