当前位置: 首页 > news >正文

旅游网站开发设计广州h5网站

旅游网站开发设计,广州h5网站,俄文网站建设方案,皮具网站建设策划书文章目录 前言神经网络组件代码整体的项目结构Tensor张量Layers层NeuralNet神经网络Loss损失函数Optim优化器data数据处理train训练 神经网络解决实际问题实际问题训练和推理代码 总结 前言 自定义神经网络一之Tensor和神经网络 自定义神经网络二之模型训练推理 自定义神经网络… 文章目录 前言神经网络组件代码整体的项目结构Tensor张量Layers层NeuralNet神经网络Loss损失函数Optim优化器data数据处理train训练 神经网络解决实际问题实际问题训练和推理代码 总结 前言 自定义神经网络一之Tensor和神经网络 自定义神经网络二之模型训练推理 自定义神经网络三之梯度和损失函数激活函数 经过前几篇的铺垫终于到了自定义神经网络的部分。这也是博主一开始的目标不使用任何框架跟着大佬手撸一个神经网络然后run起来。目标如下 实践神经网络中的基础组件例如Tensor神经网络层优化器损失函数激活函数等手动实践模型的训练推理解决实际的问题保存模型到本地并且通过加载本地模型实现推理任务。 整篇文章的代码来源(需要科学上网) https://www.youtube.com/watch?vo64FV-ez6Gwhttps://github.com/joelgrus/joelnet 神经网络组件代码 整体的项目结构 joelnet就是大佬封装的神经网络的类。麻雀虽小五脏俱全。其他的神经网络框架比如pytorch等相对来说是丰富了主干但万变不离其宗。 大佬没有使用其他的第三方库纯python手撸的神经网络类值得学习。 Tensor张量 from numpy import ndarray as Tensor我们这里不需要使用GPU来进行并行加速因此使用python的ndarray就足够了表示多维数组。 Layers层 from typing import Dict, Callableimport numpy as npfrom joelnet.tensor import Tensorclass Layer:def __init__(self) - None:self.params: Dict[str, Tensor] {}self.grads: Dict[str, Tensor] {}def forward(self, inputs: Tensor) - Tensor:Produce the outputs corresponding to these inputsraise NotImplementedErrordef backward(self, grad: Tensor) - Tensor:Backpropagate this gradient thought the layerraise NotImplementedErrorclass Linear(Layer):computes output input w b这是一个线性层也叫全连接层在神经网络中非常常见。def __init__(self, input_size: int, output_size: int) - None:# inputs will be (bitch_size, input_size)# outputs will be (bitch_size, output_size)super().__init__()self.params[w] np.random.randn(input_size, output_size)self.params[b] np.random.randn(output_size)# 线性变换其中代表矩阵乘法W是权重矩阵b是偏差项或称为偏置def forward(self, inputs: Tensor) - Tensor:outputs inputs w bself.inputs inputsreturn inputs self.params[w] self.params[b]# 计算误差计算梯度后续就可以使用优化算法比如梯度下降来更新参数W和bdef backward(self, grad: Tensor) - Tensor:# 当前层输出的梯度对偏差b的梯度也就是误差项对偏差b的偏导数self.grads[b] np.sum(grad, axis0)# 当前层输出的梯度对权重w的梯度也就是误差项对权重w的偏导数self.grads[w] self.inputs.T grad# 计算损失对该层输入的梯度这个梯度会被反向传播到前一层。return grad self.params[w].T 定义了一个类型 F。 F 类型的对象是一个函数该函数接受一个 Tensor 类型的参数并且返回一个 Tensor 类型的结果。 任何接受一个 Tensor 类型参数并返回一个 Tensor 类型结果的函数都可以被认为是 F 类型的函数。F Callable[[Tensor], Tensor]class Activation(Layer):An activation layer just applies a functionelementwise to its inputs激活层构造函数的参数是函数f和函数f的导数f_primedef __init__(self, f: F, f_prime: F) - None:super().__init__()self.f fself.f_prime f_primedef forward(self, inputs: Tensor) - Tensor:self.inputs inputsreturn self.f(inputs)def backward(self, grad: Tensor) - Tensor:if y f(x) and x g(z)then dy/dz f(x) * g(z)return self.f_prime(self.inputs) * graddef tanh(x: Tensor) - Tensor:return np.tanh(x)def tanh_prime(x: Tensor) - Tensor:y tanh(x)return 1 - y ** 2 tanh 是一种常见的激活函数它的输出范围是 (-1, 1)。这样的输出范围通常 可能使得训练更加稳定因为它可以把输入的数据标准化到一个比较小的范围。 # Tanh 类是一个具体的激活层实现它使用了 tanh 函数以及其导函数 tanh_prime。 class Tanh(Activation):def __init__(self) - None:super().__init__(tanh, tanh_prime) 定义层代码包括每层的参数如权重偏置等。 定义线性层实现前向传播和反向传播的逻辑。 同时定义层的激活函数给神经元添加一些非线性因素使得神经网络可以逼近任何复杂函数提高神经网络模型的表达能力。 NeuralNet神经网络 from typing import Sequence, Iterator, Tuplefrom joelnet.tensor import Tensor from joelnet.layers import Layerclass NeuralNet:def __init__(self, layers: Sequence[Layer]) - None:self.layers layersdef forward(self, inputs: Tensor) - Tensor:for layer in self.layers:inputs layer.forward(inputs)return inputsdef backward(self, grad: Tensor) - Tensor:for layer in reversed(self.layers):grad layer.backward(grad)return graddef params_and_grads(self) - Iterator[Tuple[Tensor, Tensor]]:for layer in self.layers:for name, param in layer.params.items():grad layer.grads[name]yield param, grad 定义神经网络这里主要是构造神经网络结构把上面定义的层给加进去。 params_and_grads函数主要是输出每层的权重参数和梯度方便后续的优化器使用。 Loss损失函数 import numpy as npfrom joelnet.tensor import Tensorclass Loss:def loss(self, predicted: Tensor, actual: Tensor) - float:raise NotImplementedErrordef grad(self, predicted: Tensor, actual: Tensor) - Tensor:raise NotImplementedErrorclass MSE(Loss):MSE is mean squared error, although were justgoing to do total squared errordef loss(self, predicted: Tensor, actual: Tensor) - float:return np.sum((predicted - actual) ** 2)def grad(self, predicted: Tensor, actual: Tensor) - Tensor:return 2 * (predicted - actual) 定义**均方误差损失函数。 **计算方法为预测值与真实值之差的平方和的均值。MSE对于大的误差值具有很高的惩罚程度因为差值会被平方。 Optim优化器 We use an optimizer to adjust the parameters of our network based on the gradients computed during backprepagation 实现了一个名为SGD随机梯度下降的优化器这是一种用于神经网络训练的常见优化算法。 在每个训练步骤里它会调整神经网络的参数以达到减小损失函数的目的。 也就是一直说的梯度下降算法from joelnet.nn import NeuralNetclass Optimizer:def step(self, net: NeuralNet) - None:raise NotImplementedErrorclass SGD(Optimizer):def __init__(self, lr: float 0.01) - None:self.lr lrdef step(self, net: NeuralNet) - None:for param, grad in net.params_and_grads():param - self.lr * grad 这里的学习率可以调整学习率小的话训练时间会变长收敛的慢。学习率过大的话收敛慢甚至可能会导致不收敛。 data数据处理 from typing import Iterator, NamedTupleimport numpy as npfrom joelnet.tensor import TensorBatch NamedTuple(Batch, [(inputs, Tensor), (targets, Tensor)])class DataIterator:def __call__(self, inputs: Tensor, targets: Tensor) - Iterator[Batch]:raise NotImplementedErrorclass BatchIterator(DataIterator):def __init__(self, batch_size: int 32, shuffle: bool True) - None:self.batch_size batch_sizeself.shuffle shuffledef __call__(self, inputs: Tensor, targets: Tensor) - Iterator[Batch]:starts np.arange(0, len(inputs), self.batch_size)# 打乱数据if self.shuffle:np.random.shuffle(starts)# 根据batch_size对数据分批次for start in starts:end start self.batch_sizebatch_inputs inputs[start:end]batch_targets targets[start:end]yield Batch(batch_inputs, batch_targets) 这个文件的目的是在训练神经网络时按批次获取输入数据和目标数据以方便神经网络进行分批训练 train训练 from joelnet.tensor import Tensor from joelnet.nn import NeuralNet from joelnet.loss import Loss, MSE from joelnet.optim import Optimizer, SGD from joelnet.data import DataIterator, BatchIteratordef train(net: NeuralNet,inputs: Tensor,targets: Tensor,num_epochs: int 5000,iterator: DataIterator BatchIterator(),loss: Loss MSE(),optimizer: Optimizer SGD()) - None:for epoch in range(num_epochs):epoch_loss 0.0for batch in iterator(inputs, targets):predicted net.forward(batch.inputs)epoch_loss loss.loss(predicted, batch.targets)grad loss.grad(predicted, batch.targets)net.backward(grad)optimizer.step(net)print(epoch, epoch_loss) 参数分别是 输出和输出数据训练5000代数据迭代器损失函数和优化器 训练逻辑如下 迭代数据获取输入传入到神经网络根据预测值和期望结果计算神经网络的误差获取神经网络梯度进行反向传播更新参数优化器调整根据学习率调整梯度 神经网络解决实际问题 实际问题 输入1到100的数值期望 数值可以整除3输出fizz数值可以整除5输出buzz数值可以整除3和5输出fizzbuzz不符合条件的数值原样输出 训练和推理代码 from typing import Listimport numpy as np import picklefrom joelnet.train import train from joelnet.nn import NeuralNet from joelnet.layers import Linear, Tanh from joelnet.optim import SGDdef fizz_buzz_encode(x: int) - List[int]:if x % 15 0:return [0, 0, 0, 1]elif x % 5 0:return [0, 0, 1, 0]elif x % 3 0:return [0, 1, 0, 0]else:return [1, 0, 0, 0]# 整数转换成二进制编码可以减小输入数据规模 # 神经网络不能直接理解整数转换成二进制编码可以为 # 神经网络提供了一种更有效的信息表达方式使得网络能从中学习到更多有用的信息。 def binary_encode(x: int) - List[int]:10 digit binary encoding of xreturn [x i 1 for i in range(10)]# 训练数据是从101-1024之间的数字 inputs np.array([binary_encode(x)for x in range(101, 1024) ])# 列表生成式语法[表达式 for 元素 in 可迭代对象] targets np.array([fizz_buzz_encode(x)for x in range(101, 1024) ])# 两层线性变换神经网络 net NeuralNet([Linear(input_size10, output_size50),Tanh(),Linear(input_size50, output_size4) ])train(net,inputs,targets,num_epochs50000,optimizerSGD(lr0.001))print(save model) # 保存模型。模型的大小和神经元的个数层数等有关系 # 神经网络output_size50的时候模型大小是41k # 神经网络output_size60的时候模型大小是48k # 神经网络output_size50且设置为3层的时候模型大小51k with open(fizzbuzz.pkl, wb) as f:pickle.dump(net, f)# 读取模型进行推理 with open(fizzbuzz.pkl, rb) as f:loaded_net pickle.load(f)# 传入输入数据获取模型推理结果 for x in range(1, 101):predicted loaded_net.forward(binary_encode(x))predicted_idx np.argmax(predicted)actual_idx np.argmax(fizz_buzz_encode(x))labels [str(x), fizz, buzz, fizzbuzz]# 输出预测值和实际应该返回的值print(x, labels[predicted_idx], labels[actual_idx]) 注意这里的训练epoch和lr学习率都可以自己调整的博主这里分别调整到了训练5w次和学习率0.001.模型大小和神经网络的层数和参数量有关系具体可以看注释。以上代码不依赖特殊的库理论上来说可以直接运行的。 模型输出如下 90 fizzbuzz fizzbuzz 91 91 91 92 92 92 93 fizz fizz 94 94 94 95 buzz buzz 96 fizz fizz 97 97 97 98 98 98 99 fizz fizz 100 buzz buzz可以看到模型推理出来的预测值和实际的值是一致的说明训练有效果。 总结 本博客是在大佬代码的基础上实现了自定义神经网络的训练和推理。外网上的优秀文章和视频太多了可惜限于网络和语言能被我们看到的太少了。 这个大佬40多分钟就手撸了简单的神经网络类并且实现了训练和推理博主只能说牛逼。 本系列文章到这里就结束了。本来只是想分享一下大佬的视频和代码但直接输出难免会没有上下文因此只能把以前的一些笔记梳理下期望读者能先有一些基础概念然后再手撸代码实现一个自己的神经网络。 不得不感概现在的网络资料太多了。依稀记得18年尝试学习一下TensorFlow的痛苦上来就是各种公式和专业术语轰炸直接劝退。近几年随着大量的工程师涌入人工智能领域网上的教程也越来越通俗易懂了站在工程的角度去讲概念从实用性角度去学习可简单太多了。 end
http://www.zqtcl.cn/news/178948/

相关文章:

  • 天元建设集团网站苏州门户网站建设
  • 建设网站需要学习什么语言福州优化搜索引擎
  • 网站开发大致多少钱手机上怎么制作网站吗
  • 重庆网站seo营销模板wordpress学习 知乎
  • 桃子网站logowordpress post meta
  • 做网站一般需要什么青岛网络推广
  • 东莞网站建设 光龙wordpress4.6 nodejs
  • 宁海县建设局网站网站建设行业前景
  • 2003网站的建设谷歌seo新手快速入门
  • 网站建设服务开发网页制作下载链接怎么做
  • 网站更改域名河源建网站
  • 陕西培训网站建设校园网站建设目的
  • 做网站赚钱容易吗怎么创建自己网站平台
  • 肥料网站建设江门好的建站网站
  • 女朋友在互联网公司做网站规范网络直播平台的可行性建议
  • wordpress酷站微信推广平台自己可以做
  • 下载类网站如何做wordpress 文章分页 插件
  • 什么做书籍的网站好梅县区住房和城乡规划建设局网站
  • 网站开发的研究方法网站内容规划流程
  • 什么网站可以做数据调查深圳住房城乡建设局网站
  • 民治网站建设yihe kj程序外包公司
  • 男人与女人做视频网站wordpress无法上传图片
  • 二手手表回收网站海外推广渠道有哪些
  • 怎么把地图放到网站上如何做色流量网站
  • 常见的导航网站有哪些郑州核酸vip服务
  • 网站开发老板排名关键词优化师
  • 迈诺网站建设跨境电商平台网站建设
  • 做t恤的网站外贸仿牌网站建设
  • 网站建设的学习网站建站后维护需要做哪些
  • 为什么建设网站很多公司没有网站界面分析