地方门户网站如何宣传,怎么在word添加wordpress,保险网,千库网原创设计师文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解#xff0c;如有遗漏或错误#xff0c;欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 认识网络的构建结构
在神经网络的构建过程中#xff0c;都避不开以下几个步骤#xff1a;
导入网络和依… 文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解如有遗漏或错误欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 认识网络的构建结构
在神经网络的构建过程中都避不开以下几个步骤
导入网络和依赖模块原始数据处理和清洗加载训练和测试数据构建网络结构确定网络优化方法将数据送入网络进行训练同时判断预测效果保存模型部署算法使用新的数据进行预测推理
使用Keras快速构建网络的必要API
在tensorflow2版本中将很多基础函数进行了二次封装进一步急速了算法初期的构建实现。通过keras提供的很多高级API可以在较短的代码体量上实现网络功能。同时通过搭配tf中的基础功能函数可以实现各种不同类型的卷积和组合操作。正是这中高级API和底层元素及的操作大幅度的提升了tensorflow的自由程度和易用性。
常用网络
全连接层
tf.keras.layers.Dense(units3, activationtf.keras.activations.softmax, kernel_regularizertf.keras.regularizers.L2())units维数神经元个数 activation激活函数可选relu softmax sigmoid tanh这里记不住的话可以用tf.keras.activations.逐个查看 kernel_regularizer正则化函数同样的可以使用tf.keras.regularizers.逐个查看 全连接层是标准的神经元组成更多被用在网络的后端或解码端Decoder用来输出预测数据。
拉伸层维度展平
tf.keras.layers.Flatten()这个函数默认不需要输入参数直接使用它会将多维的数据按照每一行依次排开首尾连接变成一个一维的张量。通常在数据输入到全连接层之前使用。
卷积层
tf.keras.layers.Conv2D(filters3, kernel_size3, strides1, paddingvalid)filters:卷积核个数 kernel_size卷积核尺寸 strides卷积核步长卷积核是在原始数据上滑动遍历完成数据计算。 padding可填 ‘valid’ ‘same’是否使用全零填充影响最后卷积结果的大小。 卷积一般被用来提取数据的数据特征。卷积最关键的就是卷积核个数和卷积核尺寸。假设输入一个1nn大小的张量经过x个卷积核步长为2尺寸可以整除n的卷积层之后会输出一个x*(n/2)*(n/2)大小的张量。可以理解为卷积步长和卷积核大小影响输出张量的长宽卷积核的大小影响输出张量的深度。
构建网络
使用Sequential构建简单网络或者构建网络模块。列表中顺序包含网络的各个层。
tf.keras.models.Sequential([ ])使用独立的class构建这里定义一个类继承自 tensorflow.keras.Model 后面基本是标准结构初始化相关参数定义网络层重写call函数定义前向传播层的连接顺序。后续随着使用的深入可以进一步的添加更多函数来实现不同类型的网络。
class mynnModel(Model): # 继承from tensorflow.keras import Model 作为父类def __init__(self):super(IrisModel, self).__init__() # 初始化父类的参数self.d1 layers.Dense(units3, activationtf.keras.activations.softmax, kernel_regularizertf.keras.regularizers.L2())def call(self, input): # 重写前向传播函数y self.d1(input)return ymodel IrisModel()训练及其参数设置
设置训练参数
tensorflow.keras.Model.compile(optimizer参数更新优化器,loss损失函数metrics准确率计算方式即输出数据类型和标签数据类型如何对应)具体参数可以看下面的内容
optimizer参数优化器 SGD: tf.keras.optimizers.SGD(learning_rate0.1,momentum动量参数) learning_rate学习率momentum动量参数AdaGrad: tf.keras.optimizers.Adagrad(learning_rate学习率)Adam: tf.keras.optimizers.Adam(learning_rate学习率 , beta_10.9, beta_20.999)
loss损失函数MSE: tf.keras.losses.MeanSquaredError()交叉熵损失 tf.keras.losses.SparseCategoricalCrossentropy(from_logitsFalse) from_logitstrue时输出值经过一次softmax概率归一化
metrics准确率计算方式就是输出数据类型和标签数据类型如何对应数值型两个都是序列值 accuracy都是独热码 categorical_accuracy标签是数值输出是独热码 sparse_categorical_accuracy训练
tensorflow.keras.Model.model.fit(x_train, y_train, batch_size32, epochs500, validation_split0.2, validation_freq20)网络传入参数含义如下
输入的数据依次为输入训练特征数据标签数据单次输入数据量迭代次数
validation_split从训练集划分多少比例数据用来测试 / validation_data(测试特征数据测试标签数据) 这两个参数智能二选一
validation_freq多少次epoch测试一次输出网络信息
tensorflow.keras.Model.model.summary()上面这个函数可以在训练结束或者训练开始之前输出一次网络的结构信息用于确认。
实际应用展示
环境
软件环境的配置可以查看环境配置流程说明
cuda 11.8 # CUDA也可以使用11.2版本
python3.7
numpy1.19.5
matplotlib 3.5.3
notebook6.4.12
scikit-learn1.2.0
tensorflow2.6.0
keras2.6.0使用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, activationsoftmax,kernel_regularizertf.keras.regularizers.l2())])
model.compile(optimizertf.keras.optimizers.SGD(learning_rate0.1),losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsFalse),metrics[sparse_categorical_accuracy])
model.fit(x_train, y_train, batch_size32, epochs500, validation_split0.2, validation_freq20)
model.summary( )通过上面这样几行简单的代码我们实现了对iris数据的分类训练。在上面的代码中使用了Sequential函数来构建网络。
使用MNIST数据集设计分类网络
在开始下面的代码之前要先下载对应的数据 https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz 复制这段网址在浏览器打开会直接下载数据然后将下载好的mnist.npz复制到一个新的路径下然后在tf.keras.datasets.mnist.load_data(path‘you file path ’代码中的这行里修改为你的路径注意要使用绝对路径。
import tensorflow as tf
from tensorflow.keras import Model
from tensorflow.keras import layers
from sklearn import datasets
import numpy as np
import matplotlib.pyplot as plt(x_train, y_train), (x_test, y_test) tf.keras.datasets.mnist.load_data(pathE:\Tensorflow\data\mnist.npz) # 注意替换自己的使用绝对路径
x_train, x_test x_train/255.0, x_test/255.0 # 图像数据归一化
print(训练集样本的大小:, x_train.shape)
print(训练集标签的大小:, y_train.shape)
print(测试集样本的大小:, x_test.shape)
print(测试集标签的大小:, y_test.shape)
#可视化样本下面是输出了训练集中前20个样本
fig, ax plt.subplots(nrows4,ncols5,sharexall,shareyall)
ax ax.flatten()
for i in range(20):img x_train[i].reshape(28, 28)ax[i].imshow(img,cmapGreys)
ax[0].set_xticks([])
ax[0].set_yticks([])
plt.tight_layout()
plt.show()
# 定义网络结构
class mnisModel(Model):def __init__(self, *args, **kwargs):super(mnisModel, self).__init__(*args, **kwargs)self.flatten1layers.Flatten()self.d1layers.Dense(128, activationtf.keras.activations.relu)self.d2layers.Dense(10, activationtf.keras.activations.softmax)def call(self, input):x self.flatten1(input)x self.d1(x)x self.d2(x)return(x)
model mnisModel()
#设置训练参数
model.compile(optimizeradam, # adam tf.keras.optimizers.Adam(learning_rate0.4 , beta_10.9, beta_20.999)losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsFalse),metrics[sparse_categorical_accuracy])
# 训练
model.fit(x_train, y_train, batch_size32, epochs5, validation_data (x_test, y_test), validation_freq1)
model.summary()运行后会先显示数据集中的前二十个数字 关闭数字展示窗口后开始训练并看到训练的过程