TensorFlow 2.0 学习笔记--第三章 使用八股搭建神经网络
第三章 使用八股搭建神经网络
本章目标:
- 神经网络搭建八股
- iris代码复现
- MNIST数据集
- 训练MNIST数据集
- Fashion数据集
3.1 搭建网络八股 Sequential
用 Tensorflow API: tf.keras 搭建网络八股
六步法
import
train, test
# 指定训练集特征和标签model = tf.keras.models.Sequential
# 逐层描述网络model.compile
# 使用哪种优化器、损失函数、评测指标等model.fit
# 训练过程,告知训练集输入特征标签,batch,迭代次数model.summray
# 打印出网络结构和参数统计
model = tf.keras.models.Sequential([网络结构]) # 描述各层网络
网络结构举例:
拉直层:tf.keras.layers.Flatten()
全连接层:tf.keras.layers.Dense(神经元个数, activation="激活函数", kernel_regularizer=哪种正则化)
activation(\'可选字符串\'): relu, softmax, sigmoid, tanh
kernel_regularizer可选: tf.keras.regularizers.l1(), tf.kers.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\'
ortf.keras.optimizers.SGD(lr=学习率, momentum=动量参数)
\'adagrad\'
ortf.keras.optimizers.Adagrad(lr=学习率)
\'adadelta\'
ortf.keras.optimizers.Adadelta(lr=学习率)
\'adam\'
ortf.keras.optimizers.Adam(lr=学习率, beta_1=0.9, beta_2=0.999)
loss可选:
\'mse\'
ortf,keras.losses.MeanSquaredError()
\'sparse_categorical_crossentropy\'
ortf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
# 在询问是否是原始输出,经过概率分布为False,没有经过概率分布直接输出为True
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= , epocher= , validation_data=(测试集的输入特征,测试集的标签), validation_split=从训练集划分多少比例给测试集, validation_freq=多少次epoch测试一次)
⭕
validation_data
,validation_split
二选其一model.summary() # 打印出网络的结构和参数统计
Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) (None, 3) 15 ================================================================= Total params: 15 Trainable params: 15 Non-trainable params: 0 _________________________________________________________________
上述为一个4输入层,3输出层的网络。 (4 * 3 + 3 = 15)
p8_iris_sequential
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(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() # 运行结果 # Epoch 498/500 # 4/4 [==============================] - 0s 1ms/step - loss: 0.3509 - sparse_categorical_accuracy: 0.9658 # Epoch 499/500 # 4/4 [==============================] - 0s 1ms/step - loss: 0.3691 - sparse_categorical_accuracy: 0.9306 # Epoch 500/500 # 4/4 [==============================] - 0s 14ms/step - loss: 0.3634 - sparse_categorical_accuracy: 0.9304 - val_loss: 0.3516 - val_sparse_categorical_accuracy: 0.8667 # Model: "sequential" # _________________________________________________________________ # Layer (type) Output Shape Param # # ================================================================= # dense (Dense) (None, 3) 15 # ================================================================= # Total params: 15 # Trainable params: 15 # Non-trainable params: 0 # _________________________________________________________________
3.2 搭建网络八股 class
用Tensorflow API: tf.keras 搭建网络八股
class MyModel(Model): # Model表示继承了TensorFlow的Model类 def __init__(self): super(MyModel, self).__init__() 定义网络结构块 def call(self, x): # x 为输入数据 调用网络结构块,实现前向传播 return y model = MyModel()
__init__()
定义所欲要网络结构块call()
写出前向传播iris_class 代码
# 与iris_sequential不同之处 from tensorflow.keras.layers import Dense from tensorflow.keras import Model 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 y model = IrisModel() # 运行结果 # 同iris_Sequential
3.3 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 0]
可视化各个数据以及完整代码
import tensorflow as tf from matplotlib import pyplot as plt mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() # 可视化训练集输入特征的第一个元素 plt.imshow(x_train[0], cmap=\'gray\') # 绘制灰度图 plt.show() # 打印出训练集输入特征的第一个元素 print("x_train[0]:\n", x_train[0]) # 打印出训练集标签的第一个元素 print("y_train[0]:\n", 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) # 运行结果 # x_train[0]: # \'一个二维数组\' # y_train[0]: # 5 # x_train.shape: # (60000, 28, 28) # y_train.shape: # (60000,) # x_test.shape: # (10000, 28, 28) # y_test.shape: # (10000,)
- 上一篇 »JQuery笔记
- 下一篇 »Javascript 第三章