TensorFlow2.1入門學習筆記(10)——使用keras搭建神經網絡(Mnist,Fashion)


前面已經使用TensorFlow2的原生代碼搭建神經網絡,接下來將使用keras搭建神經網絡,並改寫鳶尾花分類問題的代碼,將原本100多行的代碼用不到20行代碼實現。

用TensorFlow API:tf.keras搭建網絡

使用Sequential

六步法:

  1. import,相關模塊
  2. train, test,指定訓練集的輸入特征,和訓練集的標簽
  3. model = tf.keras.models.Sequential,搭建網絡結構,(順序神經網絡)
  4. model.compile,配置訓練方法
  5. model.fit,執行訓練
  6. 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類

六步法:

  1. import,相關模塊
  2. train, test,指定訓練集的輸入特征,和訓練集的標簽
  3. class MyModel(Model) model=MyModel,(Sequential無法寫出帶有跳連的非順序神經網絡)
  4. model.compile,配置訓練方法
  5. model.fit,執行訓練
  6. 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數據集:

介紹

  • Yann LeCun

  • 提供 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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM