前面已經使用TensorFlow2的原生代碼搭建神經網絡,接下來將使用keras搭建神經網絡,並改寫鳶尾花分類問題的代碼,將原本100多行的代碼用不到20行代碼實現。
用TensorFlow API:tf.keras搭建網絡
使用Sequential
六步法:
- import,相關模塊
- train, test,指定訓練集的輸入特征,和訓練集的標簽
- model = tf.keras.models.Sequential,搭建網絡結構,(順序神經網絡)
- model.compile,配置訓練方法
- model.fit,執行訓練
- model.summary,打印出網絡結構和參數統計
model = tf.keras.models.Sequent([網絡結構])
描述各層網絡:
-
拉直層:tf.keras.layers.Flatten(),將輸入特征拉直
-
全連接層:tf.keras.layers.Dense(神經元個數,activation=“激活函數”,kernel_regularizer=哪種正則化)
activation(字符串給出)可選: relu、 softmax、 sigmoid 、 tanh
kernel_regularizer可選: tf.keras.regularizers.l1()、tf.keras.regularizers.l2()
-
卷積層: tf.keras.layers.Conv2D(filters = 卷積核個數, kernel_size = 卷積核尺寸, strides = 卷積步長, padding = " valid" or "same")
-
LSTM層: tf.keras.layers.LSTM()
model.compile(optimizer = 優化器, loss = 損失函數, metrics = [“准確率”] )
- Optimizer可選:
‘sgd’ or tf.keras.optimizers.SGD (lr=學習率,momentum=動量參數)
‘adagrad’ or tf.keras.optimizers.Adagrad (lr=學習率)
‘adadelta’ or tf.keras.optimizers.Adadelta (lr=學習率)
‘adam’ or tf.keras.optimizers.Adam (lr=學習率, beta_1=0.9, beta_2=0.999) - loss可選:
‘mse’ or tf.keras.losses.MeanSquaredError()
‘sparse_categorical_crossentropy’ or tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False) - Metrics可選:
‘accuracy’ :y_和y都是數值,如y_=[1] y=[1]
‘categorical_accuracy’ :y_和y都是獨熱碼(概率分布),如y_=[0,1,0] y=[0.256,0.695,0.048]
‘sparse_categorical_accuracy’ :y_是數值,y是獨熱碼(概率分布),如y_=[1] y=[0.256,0.695,0.048]
model.fit ()執行訓練過程
model.fit (訓練集的輸入特征, 訓練集的標簽, batch_size= , epochs= , validation_data=(測試集的輸入特征,測試集的標簽), validation_split=從訓練集划分多少比例給測試集, validation_freq = 多少次epoch測試一次)
model.summary()
打印網絡的結構和參數統計
- 例如鳶尾花分類問題
鳶尾花問題使用六步法復現
# 1.import
import tensorflow as tf
from sklearn import datasets
import numpy as np
# train,test
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)
# 3.model.Sequential
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())
])
# 4.model.compile
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
# 5.model.fit
model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20)
# 6.model.summary
model.summary()
使用class類
六步法:
- import,相關模塊
- train, test,指定訓練集的輸入特征,和訓練集的標簽
- class MyModel(Model) model=MyModel,(Sequential無法寫出帶有跳連的非順序神經網絡)
- model.compile,配置訓練方法
- model.fit,執行訓練
- model.summary,打印出網絡結構和參數統計
使用class類封裝一個神經網絡結構
-
_init_( ) 定義所需網絡結構塊
-
call( ) 寫出前向傳播
###############################
class MyModel(Model):
def __init__(self):
super(MyModel, self).__init__()
定義網絡結構塊
def call(self, x):
調用網絡結構塊,實現前向傳播
return y
model = MyModel()
###############################
class IrisModel(Model):
def __init__(self):
super(IrisModel, self).__init__()
self.d1 = Dense(3)
def call(self, x):
y = self.d1(x)
return y
model = IrisModel()
- 鳶尾花問題使用六步法復現
# 1.import
import tensorflow as tf
from sklearn import datasets
######
from tensorflow.keras.layers import Dense
from tensorflow.keras import Model
######
import numpy as np
# train,test
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)
###### 3.class MyModel ######
class IrisModel(Model):
def __init__(self):
super(IrisModel, self).__init__()
self.d1 = Dense(3, activation='sigmoid', kernel_regularizer=tf.keras.regularizers.l2())
def call(self, x):
y = self.d1(x)
return y
model = IrisModel()
# 4.model.compile
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
# 5.model.fit
model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20)
# 6.model.summary
model.summary()
打印結果:
MNIST數據集:
介紹
-
提供 6萬張 28*28 像素點的0~9手寫數字圖片和標簽,用於訓練。
-
提供 1萬張 28*28 像素點的0~9手寫數字圖片和標簽,用於測試。
- 導入MNIST數據集:
mnist = tf.keras.datasets.mnist
(x_train, y_train) , (x_test, y_test) = mnist.load_data()
-
數據處理
作為輸入特征,輸入神經網絡時,將數據拉伸為一維數組:
tf.keras.layers.Flatten( )
[0 0 0 48 238 252 252 …… …… …… 253 186 12 0 0 0 0 0] -
查看數據集
plt.imshow(x_train[0], cmap='gray')#繪制灰度圖
plt.show()
print("x_train[0]:\n", x_train[0])
print("y_train[0]:", y_train[0])
# 打印出整個訓練集輸入特征形狀
print("x_train.shape:\n", x_train.shape)
# 打印出整個訓練集標簽的形狀
print("y_train.shape:\n", y_train.shape)
# 打印出整個測試集輸入特征的形狀
print("x_test.shape:\n", x_test.shape)
# 打印出整個測試集標簽的形狀
print("y_test.shape:\n", y_test.shape)
使用Sequential實現手寫字體識別
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)
model.summary()
使用class MyModel實現手寫字體識別
import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras import Model
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
class MnistModel(Model):
def __init__(self):
super(MnistModel, self).__init__()
self.flatten = Flatten()
self.d1 = Dense(128, activation='relu')
self.d2 = Dense(10, activation='softmax')
def call(self, x):
x = self.flatten(x)
x = self.d1(x)
y = self.d2(x)
return y
model = MnistModel()
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)
model.summary()
FASHINO數據集
- 提供 6萬張 28*28 像素點的衣褲等圖片和標簽,用於訓練。
- 提供 1萬張 28*28 像素點的衣褲等圖片和標簽,用於測試。
- 導入數據集
fashion = tf.keras.datasets.fashion_mnist
(x_train, y_train),(x_test, y_test) = fashion.load_data()
使用Sequential實現手寫字體識別
import tensorflow as tf
fashion = tf.keras.datasets.fashion_mnist
(x_train, y_train),(x_test, y_test) = fashion.load_data()
x_train, x_test = x_train/255.0, x_test/255.0
model=tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128,activation="relu"),
tf.keras.layers.Dense(10,activation="softmax")
])
model.compile(optimizer="adam",
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits = False),
metrics = ['sparse_categorical_accuracy'])
model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test,y_test), validation_freq=1)
model.summary()
使用class MyModel實現手寫字體識別
import tensorflow as tf
from tensorflow.keras.layers import Dense,Flatten
from tensorflow.keras import Model
fashion=tf.keras.datasets.fashion_mnist
(x_train,y_train),(x_test, y_test)=fashion.load_data()
x_train, x_test=x_train/255.0,x_test/255.0
class FashionModel(Model):
def __init__(self):
super(FashionModel, self).__init__()
self.flatten=Flatten()
self.d1=Dense(128,activation="relu")
self.d2=Dense(10,activation="softmax")
def call(self,x):
x=self.flatten(x)
x=self.d1(x)
y=self.d2(x)
return y
model = FashionModel()
model.compile(optimizer="adam",
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=["sparse_categorical_accuracy"])
model.fit(x_train,y_train,batch_size=32,epochs=5,validation_data=(x_test,y_test),validation_freq=1)
model.summary()