?? 寫(xiě)在前面
????? 博主介紹:大家好,這里是hyk寫(xiě)算法了嗎,一枚致力于學(xué)習(xí)算法和人工智能領(lǐng)域的小菜鳥(niǎo)。
??個(gè)人主頁(yè):主頁(yè)鏈接(歡迎各位大佬光臨指導(dǎo))
??近期專(zhuān)欄:機(jī)器學(xué)習(xí)與深度學(xué)習(xí)
???????????????????????LeetCode算法實(shí)例
總覽
本節(jié)內(nèi)容主要向大家介紹如何使用TensorFlow快速搭建自己的卷積神經(jīng)網(wǎng)絡(luò),并通過(guò)cifar數(shù)據(jù)集訓(xùn)練驗(yàn)證。文章最后會(huì)有相關(guān)內(nèi)容知識(shí)點(diǎn)的補(bǔ)給。
數(shù)據(jù)集簡(jiǎn)介
Cifar-10 是由 Hinton 的學(xué)生 Alex Krizhevsky、Ilya Sutskever 收集的一個(gè)用于普適物體識(shí)別的計(jì)算機(jī)視覺(jué)數(shù)據(jù)集,它包含 60000 張 32 X 32 的 RGB 彩色圖片,總共 10 個(gè)分類(lèi)。其中,包括 50000 張用于訓(xùn)練集,10000 張用于測(cè)試集。
第三方庫(kù)準(zhǔn)備
import tensorflow as tf
import numpy as np
from matplotlib import pyplot as plt
該項(xiàng)目使用上述第三方庫(kù),大家提前下載需要提前下載好。
加載數(shù)據(jù)
cifar10 = tf.keras.datasets.cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
首次使用需要聯(lián)網(wǎng)下載一段時(shí)間數(shù)據(jù)集,大家耐心等待下。
搭建cnn模型類(lèi)以及相關(guān)方法
# 繼承自tf.keras.Model
class Baseline(tf.keras.Model):
def __init__(self):
super(Baseline, self).__init__()
# 第一層卷積
self.c1 = tf.keras.layers.Conv2D(filters=6, kernel_size=(5, 5), padding='same')
# 第一層BN
self.b1 = tf.keras.layers.BatchNormalization()
# 激活函數(shù)層
self.a1 = tf.keras.layers.Activation('relu')
# 池化層
self.p1 = tf.keras.layers.MaxPool2D(pool_size=(2, 2), strides=2, padding='same')
# Dropout層
self.d1 = tf.keras.layers.Dropout(0.2)
# 將卷積獲得的網(wǎng)絡(luò)拉平以便后序全連接層使用
self.flatten = tf.keras.layers.Flatten()
# 一層全連接
self.f1 = tf.keras.layers.Dense(128, activation='relu')
# 又一層dropout
self.d2 = tf.keras.layers.Dropout(0.2)
# 第二層全連接
self.f2 = tf.keras.layers.Dense(10, activation='softmax')
# 讀入inputs數(shù)據(jù),并進(jìn)行操作返回
def call(self, inputs):
x = self.c1(inputs)
x = self.b1(x)
x = self.a1(x)
x = self.p1(x)
x = self.d1(x)
x = self.flatten(x)
x = self.f1(x)
x = self.d2(x)
y = self.f2(x)
return y
訓(xùn)練模型
# 創(chuàng)建模型對(duì)象
model = Baseline()
# 指明優(yōu)化器、損失函數(shù)、準(zhǔn)確率計(jì)算函數(shù)
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=[tf.keras.metrics.sparse_categorical_accuracy])
# 開(kāi)始訓(xùn)練
history = model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)
# 展示訓(xùn)練的過(guò)程
model.summary()
畫(huà)圖展示結(jié)果
# show
acc = history.history['sparse_categorical_accuracy']
val_acc = history.history['val_sparse_categorical_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
print(acc)
print(val_loss)
plt.figure(figsize=(8, 8))
plt.subplot(1, 2, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.title('Training and Validation Accuracy')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(loss, label='Training loss')
plt.plot(val_loss, label='Validation loss')
plt.title('Training and Validation loss')
plt.legend()
plt.show()
分別展示了訓(xùn)練集和測(cè)試集上精確度、損失值的對(duì)比
項(xiàng)目整體代碼
import tensorflow as tf
import numpy as np
from matplotlib import pyplot as plt
np.set_printoptions(threshold=np.inf)
cifar10 = tf.keras.datasets.cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
class Baseline(tf.keras.Model):
def __init__(self):
super(Baseline, self).__init__()
self.c1 = tf.keras.layers.Conv2D(filters=6, kernel_size=(5, 5), padding='same')
self.b1 = tf.keras.layers.BatchNormalization()
self.a1 = tf.keras.layers.Activation('relu')
self.p1 = tf.keras.layers.MaxPool2D(pool_size=(2, 2), strides=2, padding='same')
self.d1 = tf.keras.layers.Dropout(0.2)
self.flatten = tf.keras.layers.Flatten()
self.f1 = tf.keras.layers.Dense(128, activation='relu')
self.d2 = tf.keras.layers.Dropout(0.2)
self.f2 = tf.keras.layers.Dense(10, activation='softmax')
def call(self, inputs):
x = self.c1(inputs)
x = self.b1(x)
x = self.a1(x)
x = self.p1(x)
x = self.d1(x)
x = self.flatten(x)
x = self.f1(x)
x = self.d2(x)
y = self.f2(x)
return y
model = Baseline()
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=[tf.keras.metrics.sparse_categorical_accuracy])
history = model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)
model.summary()
# show
acc = history.history['sparse_categorical_accuracy']
val_acc = history.history['val_sparse_categorical_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
print(acc)
print(val_loss)
plt.figure(figsize=(8, 8))
plt.subplot(1, 2, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.title('Training and Validation Accuracy')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(loss, label='Training loss')
plt.plot(val_loss, label='Validation loss')
plt.title('Training and Validation loss')
plt.legend()
plt.show()
運(yùn)行結(jié)果
部分知識(shí)點(diǎn)整理
模型建立
-
tf.keras.models.Sequential([網(wǎng)絡(luò)結(jié)構(gòu)]) # 描述各層網(wǎng)洛Sequentail()
可以認(rèn)為是個(gè)容器,這個(gè)容器里封裝了一個(gè)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。在Sequential中要描述從輸入層到輸出層每一層的網(wǎng)絡(luò)結(jié)構(gòu)。
每一層的網(wǎng)絡(luò)結(jié)構(gòu)可以是 - 拉直層: tf.keras.layers.Flatten() ,這一層不含計(jì)算,只是形狀轉(zhuǎn)換,把輸入特征拉直,變成一維數(shù)組
- 全連接層:
tf.keras.layers.Dense(神經(jīng)元個(gè)數(shù),activation=“激活函數(shù)”,kernel_regularizer=哪種正則化),這一層告知神經(jīng)元個(gè)數(shù)、使用什么激活函數(shù)、采用什么正則化方法 激活函數(shù)可以選擇relu, softmax, sigmoid, tanh等 - 正則化可以選擇 tf.keras.regularizers.l1(), tf.keras.relularizers.l2()
- 卷積神經(jīng)網(wǎng)絡(luò)層:tf.keras.layers.Conv2D(filters=卷積核個(gè)數(shù),kernel_size=卷積核尺寸,strides=卷積步長(zhǎng), padding=“valid” or “same”)
- 循環(huán)神經(jīng)網(wǎng)絡(luò)層:tf.keras.layers.LSTM()
model.compile
model.compile(optimizer=優(yōu)化器,loss=損失函數(shù),metrics=["準(zhǔn)確率"])
在這里告知訓(xùn)練時(shí)選擇的優(yōu)化器、損失函數(shù)、和評(píng)測(cè)指標(biāo)。 這些參數(shù)都可以使用字符串形式或函數(shù)形式
-
optimizer: 引導(dǎo)神經(jīng)網(wǎng)絡(luò)更新參數(shù)
- sgd or tf.keras.optimizer.SGD(lr=學(xué)習(xí)率,momentum=動(dòng)量參數(shù))
- adagrad or tf.keras.optimizer.Adagrad(lr=學(xué)習(xí)率)
- adadelta or tf.keras.optimizer.Adadelta(lr=學(xué)習(xí)率)
- adam or tf.keras.optimizer.Adam(lr=學(xué)習(xí)率, beta_1=0.9, beta_2=0.999)
-
loss: 損失函數(shù)
-
mes or tf.keras.losses.MeanSquaredError()
-
sparse_categorical_crossentropy or
tf.keras.SparseCategoricalCrossentropy(from_logits=False)(是原始輸出還是經(jīng)過(guò)概率分布)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-421149.html
-
-
metrics:評(píng)測(cè)指標(biāo)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-421149.html
- accuracy:y_ 和 y 都是數(shù)值,如y_=[1] y=[1]
- categorical_accuracy: y_和y都是獨(dú)熱碼(概率分布),如y_=[0, 1, 0], y=[0.256, 0.695,
0.048] - sparse_categorical_accuracy: y_是數(shù)值,y是獨(dú)熱碼(概率分布),如y_=[1], y=[0.256,
0.695, 0.048]
訓(xùn)練模型
model.fit(訓(xùn)練集的輸入特征,訓(xùn)練集的標(biāo)簽,batch_size= 每次喂入神經(jīng)網(wǎng)絡(luò)的樣本數(shù), epochs=迭代多少次數(shù)據(jù)集, validation_data=(測(cè)試集的輸入特征,測(cè)試集的標(biāo)簽,), validation_split=從訓(xùn)練集劃分多少比例給測(cè)試集,validation_freq=多少次epoch測(cè)試一次)
打印網(wǎng)絡(luò)結(jié)構(gòu)和參數(shù)統(tǒng)計(jì)
model.summary()
到了這里,關(guān)于從零使用TensorFlow搭建CNN(卷積)神經(jīng)網(wǎng)絡(luò)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!