做娱乐网站的意义目的,网络推广是干什么的,不花钱做推广的网站,网站注册系统怎么做说明
本文采用TensorFlow框架进行讲解#xff0c;虽然之前的文章都采用mxnet#xff0c;但是我发现tensorflow提供了免费的gpu可供使用#xff0c;所以果断开始改为tensorflow#xff0c;若要实现文章代码#xff0c;可以使用colaboratory进行运行#xff0c;当然#…说明
本文采用TensorFlow框架进行讲解虽然之前的文章都采用mxnet但是我发现tensorflow提供了免费的gpu可供使用所以果断开始改为tensorflow若要实现文章代码可以使用colaboratory进行运行当然如果您已经安装了tensorflow可以采用python直接运行。
贡献
学习时采取动手学深度学习第二版作为教材但由于本书通过引入d2l著者自写库进行深度学习我希望将d2l的影响去掉即不使用d2l使用tensorflow这一点通过查询GitHub中d2l库提供的相关函数尝试进行实现。
如果本系列文章具有良好表现将译为英文版上传至Github。
预备知识
学习本篇文章之前您最好具有以下基础知识
线性回归的基础知识python的基础知识
基本原理
使用一个仿射变换通过ywxb的模型来对数据进行预测w和x均为矩阵大小取决于输入规模反向传播采用随机梯度下降对参数进行更新参数包括w和b即权重和偏差。 实现过程
生成数据集
只需要引入tensorflow即可synthetic_data()函数将初始化X和Y即通过真实的权重和偏差值生成数据集。
import tensorflow as tfdef synthetic_data(w, b, num_examples):X tf.zeros((num_examples, w.shape[0]))X tf.random.normal(shapeX.shape)y tf.matmul(X, tf.reshape(w, (-1, 1))) by tf.random.normal(shapey.shape, stddev0.01)y tf.reshape(y, (-1, 1))return X, ytrue_w tf.constant([2, -3.4])
true_b 4.2
features, labels synthetic_data(true_w, true_b, 1000)读取数据集
加载刚刚生成的数据集is_train表示是否进行打乱默认对数据进行打乱处理使用load_array函数加载数据集。
def load_array(data_arrays, batch_size, is_trainTrue):dataset tf.data.Dataset.from_tensor_slices(data_arrays)if is_train:dataset dataset.shuffle(buffer_size1000)dataset dataset.batch(batch_size)return datasetbatch_size 10
data_iter load_array((features, labels), batch_size)
定义模型
模型使用keras API实现keras是tensorflow中机器学习相关的库。先使用Sequential类定义承载容器之后添加一个单神经元的全连接层。在TensorFlow中Sequential表示容器相关的类layer表示层相关的类。线性回归只需要通过keras中的单神经元的全连接层即可实现神经元的值即为输出结果。
net tf.keras.Sequential()
net.add(tf.keras.layers.Dense(1))
示例的线性回归仅有一个输入X实际在其他线性回归过程中很有可能有多个x及其对应的w但keras的代码均不会发生改变因为keras的Dense类可以自动判断输入的个数。 初始化模型参数
stddev表示标准差initializer生成一个标准差为1均值为0的正态分布。在构建全连接层时使用该正态分布进行初始化。
initializer tf.initializers.RandomNormal(stddev0.01)
net tf.keras.Sequential()
net.add(tf.keras.layers.Dense(1, kernel_initializerinitializer))
定义损失函数和优化算法
损失函数使用平方损失函数进行计算训练时使用小批量随机梯度下降SGD方法进行训练学习率为0.03。
loss tf.keras.losses.MeanSquaredError()
trainer tf.keras.optimizers.SGD(learning_rate0.03)
训练
运行以下代码可以观察训练结果。运行轮次为3轮每一轮对所有训练集数据进行学习。计算w和b的梯度值使用梯度下降更新权重w和偏差b。每一轮输出损失函数的值最终显示权重和偏差的估计误差。
num_epochs 3
for epoch in range(num_epochs):for X, y in data_iter:with tf.GradientTape() as tape:l loss(net(X, trainingTrue), y)grads tape.gradient(l, net.trainable_variables)trainer.apply_gradients(zip(grads, net.trainable_variables))l loss(net(features), labels)print(fepoch {epoch 1}, loss {l:f})
w net.get_weights()[0]
print(w的估计误差, true_w - tf.reshape(w, true_w.shape))
b net.get_weights()[1]
print(b的估计误差, true_b - b)
运行结果 epoch 1, loss 0.000194 epoch 2, loss 0.000091 epoch 3, loss 0.000091 w的估计误差 tf.Tensor([-0.00026917 0.00094557], shape(2,), dtypefloat32) b的估计误差 [4.7683716e-06] 改进尝试
更改SGD优化算法为Adam更改MeanSquaredError为其他损失函数
对于上述改进损失均有显著增加表明原有方法已为最好方法。