文中程序以Tensorflow-2.6.0為例
部分概念包含筆者個(gè)人理解,如有遺漏或錯(cuò)誤,歡迎評(píng)論或私信指正。
截圖和程序部分引用自北京大學(xué)機(jī)器學(xué)習(xí)公開課
認(rèn)識(shí)網(wǎng)絡(luò)的構(gòu)建結(jié)構(gòu)
在神經(jīng)網(wǎng)絡(luò)的構(gòu)建過程中,都避不開以下幾個(gè)步驟:
- 導(dǎo)入網(wǎng)絡(luò)和依賴模塊
- 原始數(shù)據(jù)處理和清洗
- 加載訓(xùn)練和測(cè)試數(shù)據(jù)
- 構(gòu)建網(wǎng)絡(luò)結(jié)構(gòu),確定網(wǎng)絡(luò)優(yōu)化方法
- 將數(shù)據(jù)送入網(wǎng)絡(luò)進(jìn)行訓(xùn)練,同時(shí)判斷預(yù)測(cè)效果
- 保存模型
- 部署算法,使用新的數(shù)據(jù)進(jìn)行預(yù)測(cè)推理
使用Keras快速構(gòu)建網(wǎng)絡(luò)的必要API
在tensorflow2版本中將很多基礎(chǔ)函數(shù)進(jìn)行了二次封裝,進(jìn)一步急速了算法初期的構(gòu)建實(shí)現(xiàn)。通過keras提供的很多高級(jí)API可以在較短的代碼體量上實(shí)現(xiàn)網(wǎng)絡(luò)功能。同時(shí)通過搭配tf中的基礎(chǔ)功能函數(shù)可以實(shí)現(xiàn)各種不同類型的卷積和組合操作。正是這中高級(jí)API和底層元素及的操作大幅度的提升了tensorflow的自由程度和易用性。
常用網(wǎng)絡(luò)
全連接層
tf.keras.layers.Dense(units=3, activation=tf.keras.activations.softmax, kernel_regularizer=tf.keras.regularizers.L2())
units:維數(shù)(神經(jīng)元個(gè)數(shù))
activation:激活函數(shù),可選:relu softmax sigmoid tanh,這里記不住的話可以用tf.keras.activations.
逐個(gè)查看
kernel_regularizer:正則化函數(shù),同樣的可以使用tf.keras.regularizers.
逐個(gè)查看
全連接層是標(biāo)準(zhǔn)的神經(jīng)元組成,更多被用在網(wǎng)絡(luò)的后端或解碼端(Decoder)用來輸出預(yù)測(cè)數(shù)據(jù)。
拉伸層(維度展平)
tf.keras.layers.Flatten()
這個(gè)函數(shù)默認(rèn)不需要輸入?yún)?shù),直接使用,它會(huì)將多維的數(shù)據(jù)按照每一行依次排開首尾連接變成一個(gè)一維的張量。通常在數(shù)據(jù)輸入到全連接層之前使用。
卷積層
tf.keras.layers.Conv2D(filters=3, kernel_size=3, strides=1, padding='valid')
filters:卷積核個(gè)數(shù)
kernel_size:卷積核尺寸
strides:卷積核步長(zhǎng),卷積核是在原始數(shù)據(jù)上滑動(dòng)遍歷完成數(shù)據(jù)計(jì)算。
padding:可填 ‘valid’ ‘same’,是否使用全零填充,影響最后卷積結(jié)果的大小。
卷積一般被用來提取數(shù)據(jù)的數(shù)據(jù)特征。卷積最關(guān)鍵的就是卷積核個(gè)數(shù)和卷積核尺寸。假設(shè)輸入一個(gè)1nn大小的張量,經(jīng)過x個(gè)卷積核+步長(zhǎng)為2+尺寸可以整除n的卷積層之后會(huì)輸出一個(gè)x*(n/2)*(n/2)大小的張量。可以理解為卷積步長(zhǎng)和卷積核大小影響輸出張量的長(zhǎng)寬,卷積核的大小影響輸出張量的深度。
構(gòu)建網(wǎng)絡(luò)
使用Sequential構(gòu)建簡(jiǎn)單網(wǎng)絡(luò),或者構(gòu)建網(wǎng)絡(luò)模塊。列表中順序包含網(wǎng)絡(luò)的各個(gè)層。
tf.keras.models.Sequential([ ])
使用獨(dú)立的class構(gòu)建,這里定義一個(gè)類繼承自 tensorflow.keras.Model
后面基本是標(biāo)準(zhǔn)結(jié)構(gòu)>初始化相關(guān)參數(shù)>定義網(wǎng)絡(luò)層>重寫call函數(shù)定義前向傳播層的連接順序。后續(xù)隨著使用的深入可以進(jìn)一步的添加更多函數(shù)來實(shí)現(xiàn)不同類型的網(wǎng)絡(luò)。
class mynnModel(Model): # 繼承from tensorflow.keras import Model 作為父類
def __init__(self):
super(IrisModel, self).__init__() # 初始化父類的參數(shù)
self.d1 = layers.Dense(units=3, activation=tf.keras.activations.softmax, kernel_regularizer=tf.keras.regularizers.L2())
def call(self, input): # 重寫前向傳播函數(shù)
y = self.d1(input)
return y
model = IrisModel()
訓(xùn)練及其參數(shù)設(shè)置
設(shè)置訓(xùn)練參數(shù)
tensorflow.keras.Model.compile(optimizer=參數(shù)更新優(yōu)化器,
loss=損失函數(shù)
metrics=準(zhǔn)確率計(jì)算方式,即輸出數(shù)據(jù)類型和標(biāo)簽數(shù)據(jù)類型如何對(duì)應(yīng))
具體參數(shù)可以看下面的內(nèi)容:
optimizer:參數(shù)優(yōu)化器
SGD: tf.keras.optimizers.SGD(learning_rate=0.1,momentum=動(dòng)量參數(shù)) learning_rate學(xué)習(xí)率,momentum動(dòng)量參數(shù)
AdaGrad: tf.keras.optimizers.Adagrad(learning_rate=學(xué)習(xí)率)
Adam: tf.keras.optimizers.Adam(learning_rate=學(xué)習(xí)率 , beta_1=0.9, beta_2=0.999)
loss:損失函數(shù)
MSE: tf.keras.losses.MeanSquaredError()
交叉熵?fù)p失: tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False) from_logits=true時(shí)輸出值經(jīng)過一次softmax概率歸一化
metrics:準(zhǔn)確率計(jì)算方式,就是輸出數(shù)據(jù)類型和標(biāo)簽數(shù)據(jù)類型如何對(duì)應(yīng)
數(shù)值型(兩個(gè)都是序列值): 'accuracy'
都是獨(dú)熱碼: 'categorical_accuracy'
標(biāo)簽是數(shù)值,輸出是獨(dú)熱碼: 'sparse_categorical_accuracy'
訓(xùn)練
tensorflow.keras.Model.model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20)
網(wǎng)絡(luò)傳入?yún)?shù)含義如下:
輸入的數(shù)據(jù)依次為:輸入訓(xùn)練特征數(shù)據(jù),標(biāo)簽數(shù)據(jù),單次輸入數(shù)據(jù)量,迭代次數(shù)
validation_split=從訓(xùn)練集劃分多少比例數(shù)據(jù)用來測(cè)試 / validation_data=(測(cè)試特征數(shù)據(jù),測(cè)試標(biāo)簽數(shù)據(jù)) 這兩個(gè)參數(shù)智能二選一
validation_freq=多少次epoch測(cè)試一次
輸出網(wǎng)絡(luò)信息
tensorflow.keras.Model.model.summary()
上面這個(gè)函數(shù)可以在訓(xùn)練結(jié)束或者訓(xùn)練開始之前輸出一次網(wǎng)絡(luò)的結(jié)構(gòu)信息用于確認(rèn)。
實(shí)際應(yīng)用展示
環(huán)境
軟件環(huán)境的配置可以查看環(huán)境配置流程說明
cuda = 11.8 # CUDA也可以使用11.2版本
python=3.7
numpy==1.19.5
matplotlib== 3.5.3
notebook==6.4.12
scikit-learn==1.2.0
tensorflow==2.6.0
keras==2.6.0
使用iris數(shù)據(jù)集構(gòu)建基礎(chǔ)的分類網(wǎng)絡(luò)
import tensorflow as tf
from sklearn import datasets
import numpy as np
x_train = datasets.load_iris().data
y_train = datasets.load_iris().target
np.random.seed(116)
np.random.shuffle(x_train)
np.random.seed(116)
np.random.shuffle(y_train)
tf.random.set_seed(116)
model = tf.keras.models.Sequential([ tf.keras.layers.Dense(3, activation='softmax',
kernel_regularizer=tf.keras.regularizers.l2())])
model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.1),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20)
model.summary( )
通過上面這樣幾行簡(jiǎn)單的代碼,我們實(shí)現(xiàn)了對(duì)iris數(shù)據(jù)的分類訓(xùn)練。在上面的代碼中使用了Sequential函數(shù)來構(gòu)建網(wǎng)絡(luò)。
使用MNIST數(shù)據(jù)集設(shè)計(jì)分類網(wǎng)絡(luò)
在開始下面的代碼之前,要先下載對(duì)應(yīng)的數(shù)據(jù) https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz 復(fù)制這段網(wǎng)址在瀏覽器打開會(huì)直接下載數(shù)據(jù),然后將下載好的mnist.npz復(fù)制到一個(gè)新的路徑下,然后在tf.keras.datasets.mnist.load_data(path=‘you file path ’)代碼中的這行里修改為你的路徑,注意要使用絕對(duì)路徑。文章來源:http://www.zghlxwxcb.cn/news/detail-799606.html
import tensorflow as tf
from tensorflow.keras import Model
from tensorflow.keras import layers
from sklearn import datasets
import numpy as np
import matplotlib.pyplot as plt
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data(path='E:\Tensorflow\data\mnist.npz') # 注意替換自己的使用絕對(duì)路徑
x_train, x_test = x_train/255.0, x_test/255.0 # 圖像數(shù)據(jù)歸一化
print('訓(xùn)練集樣本的大小:', x_train.shape)
print('訓(xùn)練集標(biāo)簽的大小:', y_train.shape)
print('測(cè)試集樣本的大小:', x_test.shape)
print('測(cè)試集標(biāo)簽的大小:', y_test.shape)
#可視化樣本,下面是輸出了訓(xùn)練集中前20個(gè)樣本
fig, ax = plt.subplots(nrows=4,ncols=5,sharex='all',sharey='all')
ax = ax.flatten()
for i in range(20):
img = x_train[i].reshape(28, 28)
ax[i].imshow(img,cmap='Greys')
ax[0].set_xticks([])
ax[0].set_yticks([])
plt.tight_layout()
plt.show()
# 定義網(wǎng)絡(luò)結(jié)構(gòu)
class mnisModel(Model):
def __init__(self, *args, **kwargs):
super(mnisModel, self).__init__(*args, **kwargs)
self.flatten1=layers.Flatten()
self.d1=layers.Dense(128, activation=tf.keras.activations.relu)
self.d2=layers.Dense(10, activation=tf.keras.activations.softmax)
def call(self, input):
x = self.flatten1(input)
x = self.d1(x)
x = self.d2(x)
return(x)
model = mnisModel()
#設(shè)置訓(xùn)練參數(shù)
model.compile(optimizer='adam', # 'adam' tf.keras.optimizers.Adam(learning_rate=0.4 , beta_1=0.9, beta_2=0.999)
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
# 訓(xùn)練
model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data = (x_test, y_test), validation_freq=1)
model.summary()
運(yùn)行后會(huì)先顯示數(shù)據(jù)集中的前二十個(gè)數(shù)字
關(guān)閉數(shù)字展示窗口后開始訓(xùn)練,并看到訓(xùn)練的過程文章來源地址http://www.zghlxwxcb.cn/news/detail-799606.html
到了這里,關(guān)于深度學(xué)習(xí)筆記(七)——基于Iris/MNIST數(shù)據(jù)集構(gòu)建基礎(chǔ)的分類網(wǎng)絡(luò)算法實(shí)戰(zhàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!