神經網絡搭建八股
使用tf.keras
六步法搭建模型
1.import
2.train, test 指定輸入特征/標簽
3.model = tf.keras.model.Sequential
在Squential,搭建神經網絡
4.model.compile
配置訓練方法,選擇哪種優化器、損失函數、評測指標
5.model.fit 執行訓練過程,告知訓練集輸入特征,batch,epoch
6.model.summary打印網絡結構和參數統計
model = tf.keras.model.Sequential
Sequential是個容器,封裝了網絡結構
網絡結構例子:
拉直層:tf.keras.layers.Flatten()
全連接層:tf.keras.layers.Dense(神經元個數,activetion="激活函數",kernel_regularizer=那種正則化)
卷積層:
tf.keras.layers.Conv2D(filters= 卷積核個數,kernel_size=卷積核尺寸,strides=卷積步長,padding="valid"or"same"
LSTM層:
tf.keras.layers.LSTM()
model.compile
model.compile(optimizer=優化器,loss=損失函數,metrics=["準確率"]
后期可通過tensorflow官網查詢函數的具體用法,調節超參數
有些網絡輸出經過softmax概率分布輸出,有些不經過概率分布輸出?
當網絡評測指標和蒙的概率一樣,例如十分類概率為.1/10.可能概率分布錯了
獨熱碼y_和y是[010]網絡輸出則為[0.xx, 0.xx, 0.xx]
?第三種方法 y_= [1] y =[0.2xx,0xx,0xx]
model.fit
model.fit(訓練集的輸入特征,訓練集的標簽,batch_size, epochs=,?
validation_data=(測試集的輸入特征,標簽),
validation_split=從訓練集劃分多少比例給測試集,
validation_freq=多少次epoch測試一次)
model.summary
重構Iris分類
import tensorflow as tf
from sklearn import datasets
import numpy as npx_train = datasets.load_iris().data
y_train = datasets.load_iris().targetnp.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(lr=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()
自定義搭建模型
swquential可以搭建上層輸出就是下層輸入的網絡結構,但是無法搭建帶有跳連特征的非順序網絡結構
class MyModel(Model)
? ? ? ? def __init__(self):
? ? ? ? ? ? ? ? super(MyModel, self) __init()
? ? ? ? ????????定義網絡結構塊
? ? ? ? def call(self, x): #寫出前向傳播
? ? ? ? ? ? ? ?調用網絡結構塊,實現前向傳播
? ? ? ? return y? ? ?
model = MyModel
__init__定義出積木
call調用積木,實現前向傳播
import tensorflow as tf
from tensorflow.keras.layers import Dense
from tensorflow.keras import Model
from sklearn import datasets
import numpy as npx_train = datasets.load_iris().data
y_train = datasets.load_iris().targetnp.random.seed(116)
np.random.shuffle(x_train)
np.random.seed(116)
np.random.shuffle(y_train)
tf.random.set_seed(116)class IrisModel(Model):def __init__(self):super(IrisModel, self).__init__()self.d1 = Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())def call(self, x):y = self.d1(x)return ymodel = IrisModel()model.compile(optimizer=tf.keras.optimizers.SGD(lr=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()
每循環一次train,計算一次test的測試指標
MNIST數據集
1.導入MNIST數據集
mnist=tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) =? mnist.load_data(
2.作為輸入特征,輸入神經網絡時,將數據拉伸成一維數組:
tf.keras.layers.Flatten()
把784個像素點的灰度值作為輸入特征放入神經網絡
plt.imshow(x_train[0], cmap='gray')#繪制灰度圖
plt.show()
0表示純黑色255表示純白色
需要對測試集和數據集進行歸一化處理,把數值變小,更適合神經網絡吸收,使用sequental訓練模型,由于輸入特征為數組,輸出為概率分布,所以我們選擇sparse_categorical_accuracy
import tensorflow as tfmnist = 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.0model = 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()
準確率是測試集的準確率
自定義Model實現 __init__中定義cell函數中用到的層
import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras import Modelmnist = 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.0class 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 ymodel = 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()
FASHION數據集
import tensorflow as tffashion = 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.0model = 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()