深度学习入门——神经网络的学习

前言

这里所说的“学习”是指从训练数据中自动获取最优权重参数的过程。

为了使神经网络能进行学习,将导入损失函数这一指标

为了找出尽可能小的损失函数的值,本章我们将介绍利用了函数斜率的梯度法

从数据中学习

本章将介绍神经网络的学习,即利用数据决定参数值的方法,并用Python 实现对MNIST手写数字数据集的学习。

数据驱动

数据是机器学习的核心

机器学习的方法中,由机器从收集到的数据中找出规律性。与从零开始想出算法相比,这种方法可以更高效地解决问题,也能减轻人的负担

将图像转换为向量时使用的特征量仍是由人设计的

对于不同的问题,必须使用合适的特征量(必须设计专门的特征量),才能得到好的结果

image-20240714200307968

神经网络直接学习图像本身,连图像中包含的重要特征量也都是由机器来学习的。

[!IMPORTANT]

深度学习有时也称为端到端机器学习(end-to-end machine learning)。这里所说的端到端是指从一端到另一端的意思,也就是从原始数据(输入)中获得目标结果(输出)的意思

神经网络的优点是对所有的问题都可以用同样的流程来解决:都是通过不断地学习所提供的数据,尝试发现待求解的问题的模式

与待处理的问题无关,神经网络可以将数据直接作为原始数据,进行“端对端”的学习。

训练数据和测试数据

机器学习中,一般将数据分为训练数据和测试数据两部分来进行学习和实验等。首先,使用训练数据进行学习,寻找最优的参数;然后,使用测试数据评价训练得到的模型的实际能力

泛化能力是指处理未被观察过的数据(不包含在训练数据中的数据)的能力

只对某个数据集过度拟合的状态称为过拟合(over fitting)。避免过拟合也是机器学习的一个重要课题

损失函数

神经网络以某个指标为线索寻找最优权重参数。神经网络的学习中所用的指标称为损失函数(loss function)。这个损失函数可以使用任意函数,但一般用均方误差交叉熵误差等。

均方误差 mean squared error

image-20240714202539921

def mean_squared_error(y, t):return 0.5 * np.sum((y-t)**2)

交叉熵误差 cross entropy error

image-20240714203122566

式(4.2)实际上只计算对应正确解标签的输出的自然对数

def cross_entropy_error(y, t):delta = 1e-7 #方式概率为0时 log输出负无穷大 -infreturn -np.sum(t * np.log(y + delta))

mini-batch学习

计算损失函数时必须将所有的训练数据作为对象

image-20240714204010002

如果以全部数据为对象求损失函数的和,则计算过程需要花费较长的时间。

神经网络的学习是从训练数据中选出一批数据(称为mini-batch, 小批量),然后对每个mini-batch 进行学习。比如,从60000 个训练数据中随机选择100 笔,再用这100 笔数据进行学习。这种学习方式称为mini-batch 学习。

随机选择指定个数数据的代码

import sys, os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist
(x_train, t_train), (x_test, t_test) = \load_mnist(normalize=True, one_hot_label=True)
print(x_train.shape) # (60000, 784)
print(t_train.shape) # (60000, 10)train_size = x_train.shape[0]
batch_size = 10
batch_mask = np.random.choice(train_size, batch_size)
x_batch = x_train[batch_mask]
t_batch = t_train[batch_mask]

使用np.random.choice()可以从指定的数字中随机选择想要的数字

mini-batch 的损失函数是利用一部分样本数据来近似地计算整体,用随机选择的小批量数据(mini-batch)作为全体训练数据的近似值。

mini-batch版交叉熵误差的实现

同时处理单个数据和批量数据(数据作为batch 集中输入)两种情况的函数:

def cross_entropy_error(y, t):if y.ndim == 1:t = t.reshape(1, t.size)y = y.reshape(1, y.size)batch_size = y.shape[0]return -np.sum(t * np.log(y + 1e-7)) / batch_size

当监督数据是标签形式(非one-hot表示)

def cross_entropy_error(y, t):if y.ndim == 1:t = t.reshape(1, t.size)y = y.reshape(1, y.size)batch_size = y.shape[0]return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size

疑难点

np.log(y[np.arange(batch_size),t])有些不好理解

如果可以获得神经网络在正确解标签处的输出,就可以计算交叉熵误差

y还是一个二维数组,表示神经网络的输出,并不是一个单纯的标签,[0.1,0.05,...,0.01]

所以y[np.arange(batch_size),t]可以直接按照y的顺序取出t所指的位置的概率


为何要设定损失函数

“为什么要导入损失函数呢?”
以数字识别任务为例,我们想获得的是能提高识别精度的参数,特意再导入一个损失函数不是有些重复劳动吗?

在进行神经网络的学习时,不能将识别精度作为指标。因为如果以识别精度为指标,则参数的导数在绝大多数地方都会变为0。

识别精度对微小的参数变化基本上没有什么反应,即便有反应,它的值也是不连续地、突然地变化。作为激活函数的阶跃函数也有同样的情况。出于相同的原因,如果使用阶跃函数作为激活函数,神经网络的学习将无法进行。

而sigmoid 函数,如图4-4 所示,不仅函数的输出(竖轴的值)是连续变化的,曲线的斜率(导数)也是连续变化的。sigmoid 函数的导数在任何地方都不为0。这对神经网络的学习非常重要。得益于这个斜率不会为0 的性质,神经网络的学习得以正确进行

image-20240714220423001

数值微分 numerical differentiation

导数

image-20240716105116022

# 不好的实现示例
def numerical_diff(f, x):h = 10e-50return (f(x+h) - f(x)) / h>>> np.float32(1e-50)
0.0

h使用了10e-50这个微小值,会产生舍入误差,因省略小数的精细部分的数值而造成的计算结果上的误差

def numerical_diff(f, x):h = 1e-4 # 0.0001return (f(x+h) - f(x-h)) / (2*h)

以x 为中心,计算它左右两边的差分,所以也称为中心差分(而(x + h) 和x之间的差分称为
前向差分)

[!IMPORTANT]

利用微小的差分求导数的过程称为数值微分(numerical differentiation)。

而基于数学式的推导求导数的过程,则用“解析性”(analytic)一词,称为“解析性求解”或者“解析性求导”。比如,y = x^2 的导数,可以通过dy/dx=2x解析性地求解出来。因此,当x = 2时,y的导数为4。解析性求导得到的导数是不含误差的“真的导数”

数值微分的例子

image-20240716112806657

def function_1(x):return 0.01*x**2 + 0.1*x>>> numerical_diff(function_1, 5)
0.1999999999990898
>>> numerical_diff(function_1, 10)
0.2999999999986347
# 与解析解相比,0.2,0.3,误差小到基本上可以认为是相等的

image-20240716113201278

偏导数

image-20240716113307274

def function_2(x):return x[0]**2 + x[1]**2# 或者return np.sum(x**2)	

把有多个变量的函数的导数称为偏导数
∂ f ∂ x 0 \frac{\partial f}{\partial x_0} x0f
偏导数和单变量的导数一样,都是求某个地方的斜率

偏导数需要将多个变量中的某一个变量定为目标变量,并将其他变量固定为某个值

梯度

( ∂ f ∂ x 0 , ∂ f ∂ x 1 ) (\frac{\partial f}{\partial x_0},\frac{\partial f}{\partial x_1}) (x0f,x1f)

由全部变量的偏导数汇总而成的向量称为梯度(gradient)

def numerical_gradient(f, x):h = 1e-4 # 0.0001grad = np.zeros_like(x) # 生成和x形状相同的数组for idx in range(x.size):tmp_val = x[idx]# f(x+h)的计算x[idx] = tmp_val + hfxh1 = f(x)# f(x-h)的计算x[idx] = tmp_val - hfxh2 = f(x)grad[idx] = (fxh1 - fxh2) / (2*h)x[idx] = tmp_val # 还原值return grad

image-20240716152300944

画是元素值为负梯度的向量

梯度呈现为有向向量(箭头)。观察图4-9,我们发现梯度指向函数f(x0,x1) 的“最低处”(最小值),就像指南针一样,所有的箭头都指向同一点。其次,我们发现离“最低处”越远,箭头越大。

虽然图4-9 中的梯度指向了最低处,但并非任何时候都这样。实际上,梯度会指向各点处的函数值降低的方向。更严格地讲,梯度指示的方向是各点处的函数值减小最多的方向A。这是一个非常重要的性质,请一定牢记!

梯度法

一般而言,损失函数很复杂,参数空间庞大,我们不知道它在何处能取得最小值。而通过巧妙地使用梯度来寻找函数最小值(或者尽可能小的值)的方法就是梯度法

梯度表示的是各点处的函数值减小最多的方向,无法保证梯度所指的方向就是函数的最小值或者真正应该前进的方向。实际上,在复杂的函数中,梯度指示的方向基本上都不是函数值最小处

[!NOTE]

函数的极小值、最小值以及被称为鞍点(saddle point)的地方,梯度为0

虽然梯度法是要寻找梯度为0 的地方,但是那个地方不一定就是最小值(也有可能是极小值或者鞍点)

此外,当函数很复杂且呈扁平状时,学习可能会进入一个(几乎)平坦的地区,陷入被称为“学习高原”的无法前进的停滞期。

通过不断地沿梯度方向前进,逐渐减小函数值的过程就是梯度法(gradient method)。

梯度法是解决机器学习中最优化问题的常用方法,特别是在神经网络的学习中经常被使用

[!IMPORTANT]

根据目的是寻找最小值还是最大值,梯度法的叫法有所不同

寻找最小值的梯度法称为梯度下降法(gradient descent method),寻找最大值的梯度法称为梯度上升法(gradient ascent method)。

但是通过反转损失函数的符号,求最小值的问题和求最大值的问题会变成相同的问题,因此“下降”还是“上升”的差异本质上并不重要。

一般来说,神经网络(深度学习)中,梯度法主要是指梯度下降法。

image-20240716154350208

η表示更新量,在神经网络的学习中,称为学习率(learning rate)

学习率决定在一次学习中,应该学习多少,以及在多大程度上更新参数

每一步都按式(4.7)更新变量的值,通过反复执行此步骤,逐渐减小函数值。

学习率需要事先确定为某个值,比如0.01 或0.001。一般而言,这个值过大或过小,都无法抵达一个“好的位置”。在神经网络的学习中,一般会一边改变学习率的值,一边确认学习是否正确进行了。

def gradient_descent(f, init_x, lr=0.01, step_num=100):x = init_xfor i in range(step_num):grad = numerical_gradient(f, x)x -= lr * gradreturn x

参数f 是要进行最优化的函数,init_x 是初始值,lr 是学习率learningrate,step_num 是梯度法的重复次数。

image-20240716155031003

设定合适的学习率是一个很重要的问题

[!IMPORTANT]

像学习率这样的参数称为超参数

相对于神经网络的权重参数是通过训练数据和学习算法自动获得的,学习率这样的超参数则是人工设定的。

一般来说,超参数需要尝试多个值,以便找到一种可以使学习顺利进行的设定。

神经网络的梯度

这里所说的梯度是指损失函数关于权重参数的梯度

image-20240716161654747
∂ L ∂ w 11 \frac {\partial L}{\partial w_{11}} w11L
表示当w11稍微变化时,损失函数L关于发生多大变化,重点是,4.8两式形状相同

以一个简单的神经网络为例,来实现求梯度的代码

import sys, os
sys.path.append(os.pardir)
import numpy as np
from common.functions import softmax, cross_entropy_error
from common.gradient import numerical_gradient
class simpleNet:def __init__(self):self.W = np.random.randn(2,3) # 用高斯分布进行初始化def predict(self, x):return np.dot(x, self.W)def loss(self, x, t):z = self.predict(x)y = softmax(z)loss = cross_entropy_error(y, t)return loss
>>> net = simpleNet()
>>> print(net.W) # 权重参数
[[ 0.47355232 0.9977393 0.84668094],
[ 0.85557411 0.03563661 0.69422093]])
>>>
>>> x = np.array([0.6, 0.9])
>>> p = net.predict(x)
>>> print(p)
[ 1.05414809 0.63071653 1.1328074]
>>> np.argmax(p) # 最大值的索引
2
>>>
>>> t = np.array([0, 0, 1]) # 正确解标签
>>> net.loss(x, t)
0.92806853663411326#这里的参数W是一个伪参数,因为numerical_gradient(f,x)会在内部执行f(x), 为了与之兼容而定义了f(W)
>>> def f(W):
... return net.loss(x, t)
...
#lambda 写法 f = lambda w: net.loss(x, t)
>>> dW = numerical_gradient(f, net.W)
>>> print(dW)
[[ 0.21924763 0.14356247 -0.36281009]
[ 0.32887144 0.2153437 -0.54421514]]

求出神经网络的梯度后,接下来只需根据梯度法,更新权重参数即可。

[!IMPORTANT]

为了对应形状为多维数组的权重参数W,这里使用的numerical_gradient()和之前的实现稍有不同

学习算法的实现

这里我们来确认一下神经网络的学习步骤,顺便复习一下这些内容

  • 前提
    • 神经网络存在合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为“学习”。神经网络的学习分成下面4 个步骤。
  • 步骤1(mini-batch)
    • 从训练数据中随机选出一部分数据,这部分数据称为mini-batch。我们的目标是减小mini-batch 的损失函数的值。
  • 步骤2(计算梯度)
    • 为了减小mini-batch 的损失函数的值,需要求出各个权重参数的梯度。梯度表示损失函数的值减小最多的方向。
  • 步骤3(更新参数)
    • 将权重参数沿梯度方向进行微小更新。
  • 步骤4(重复)
    • 重复步骤1、步骤2、步骤3。

神经网络的学习按照上面4 个步骤进行,因为这里使用的数据是随机选择的mini batch 数据,所以又称为随机梯度下降法(stochastic gradient descent)。

“对随机选择的数据进行的梯度下降法”

深度学习的很多框架中,随机梯度下降法一般由一个名为SGD的函数来实现。

2层神经网络的类

import sys, os
sys.path.append(os.pardir)
from common.functions import *
from common.gradient import numerical_gradient
class TwoLayerNet:def __init__(self, input_size, hidden_size, output_size,weight_init_std=0.01):# 初始化权重self.params = {}self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)self.params['b1'] = np.zeros(hidden_size)self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)self.params['b2'] = np.zeros(output_size)def predict(self, x):W1, W2 = self.params['W1'], self.params['W2']b1, b2 = self.params['b1'], self.params['b2']a1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2y = softmax(a2)return y# x:输入数据, t:监督数据def loss(self, x, t):y = self.predict(x)return cross_entropy_error(y, t)def accuracy(self, x, t):y = self.predict(x)y = np.argmax(y, axis=1)t = np.argmax(t, axis=1)accuracy = np.sum(y == t) / float(x.shape[0])return accuracy# x:输入数据, t:监督数据def numerical_gradient(self, x, t):loss_W = lambda W: self.loss(x, t)grads = {}grads['W1'] = numerical_gradient(loss_W, self.params['W1'])grads['b1'] = numerical_gradient(loss_W, self.params['b1'])grads['W2'] = numerical_gradient(loss_W, self.params['W2'])grads['b2'] = numerical_gradient(loss_W, self.params['b2'])return grads

image-20240716170458363

如何设置权重参数的初始值这个问题是关系到神经网络能否成功学习的重要问题。后面我
们会详细讨论权重参数的初始化,这里只需要知道,权重使用符合高斯分布的随机数进行初始化,偏置使用0 进行初始化

[!IMPORTANT]

numerical_gradient(self, x, t)基于数值微分计算参数的梯度。下一章,我们会介绍一个高速计算梯度的方法,称为误差反向传播法

用误差反向传播法求到的梯度和数值微分的结果基本一致,但可以高速地进行处理

mini-batch的实现

import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet# 读入数据
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)
# 超参数
iters_num = 10000  # 适当设定循环的次数
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.1train_loss_list = []for i in range(iters_num):# 获取mini-batchbatch_mask = np.random.choice(train_size, batch_size)x_batch = x_train[batch_mask]t_batch = t_train[batch_mask]# 计算梯度grad = network.numerical_gradient(x_batch, t_batch)#grad = network.gradient(x_batch, t_batch) #高速版# 更新参数for key in ('W1', 'b1', 'W2', 'b2'):network.params[key] -= learning_rate * grad[key]loss = network.loss(x_batch, t_batch)train_loss_list.append(loss)

image-20240716202400330

基于测试数据的评价

根据图4-11 呈现的结果,我们确认了通过反复学习可以使损失函数的值逐渐减小这一事实

过拟合是指,虽然训练数据中的数字图像能被正确辨别,但是不在训练数据中的数字图像却无法被识别的现象。过拟合需要避免

[!IMPORTANT]

epoch是一个单位

一个epoch表示学习中所有训练数据均被使用过一次时的更新次数

import numpy as np
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet(x_train, t_train), (x_test, t_test) = \ load_mnist(normalize=True, one_hot_label = True)
train_loss_list = []
train_acc_list = []
test_acc_list = []
# 平均每个epoch的重复次数
iter_per_epoch = max(train_size / batch_size, 1)# 超参数
iters_num = 10000
batch_size = 100
learning_rate = 0.1network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)for i in range(iters_num):# 获取mini-batchbatch_mask = np.random.choice(train_size, batch_size)x_batch = x_train[batch_mask]t_batch = t_train[batch_mask]# 计算梯度grad = network.numerical_gradient(x_batch, t_batch)# grad = network.gradient(x_batch, t_batch) # 高速版!# 更新参数for key in ('W1', 'b1', 'W2', 'b2'):network.params[key] -= learning_rate * grad[key]loss = network.loss(x_batch, t_batch)train_loss_list.append(loss)# 计算每个epoch的识别精度if i % iter_per_epoch == 0:train_acc = network.accuracy(x_train, t_train)test_acc = network.accuracy(x_test, t_test)train_acc_list.append(train_acc)test_acc_list.append(test_acc)print("train acc, test acc | " + str(train_acc) + ", " + str(test_acc))

image-20240716204206126

小结

• 机器学习中使用的数据集分为训练数据和测试数据。
• 神经网络用训练数据进行学习,并用测试数据评价学习到的模型的泛化能力
• 神经网络的学习以损失函数为指标,更新权重参数,以使损失函数的值减小。
• 利用某个给定的微小值的差分求导数的过程,称为数值微分。
• 利用数值微分,可以计算权重参数的梯度。
• 数值微分虽然费时间,但是实现起来很简单。下一章中要实现的稍微复杂一些的误差反向传播法可以高速地计算梯度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/47023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu上模拟串口通信

前言 有时候写了一些串口相关的程序,需要调试的时候,又没有硬件,或者需要等其他模块完成才能一起联调。这样搭建环境费时费力,很多问题等到最后联调才发现就已经很晚了。 本文提供一种在ubuntu环境下模拟串口,直接就可…

【Web服务与Web应用开发】【C#】VS2019 创建ASP.NET Web应用程序,以使用WCF服务

目录 0.简介 1.环境 2.知识点 3.详细过程 1)创建空项目 2)添加Web表单 3)使用Web表单的GUI设计 4)添加服务引用 5)在Web的button函数中调用服务,获取PI值 6)测试 0.简介 本文属于一个…

Mysql的JSON格式字段实用操作函数JSON_CONTAINS、JSON_SEARCH、JSON_EXTRACT

文章目录 前言一、示例数据二、使用1.JSON_CONTAINS2.JSON_SEARCH3.JSON_EXTRACT 总结 前言 在开发中难免会遇见在Mysql字段存储JSON格式数据的业务情况,记录几种常用函数的 用法。 一、示例数据 建一张表,字段memo存储JSON格式数据 CREATE TABLE use…

摄像头 RN6752v1 视频采集卡

摄像头 AHD倒车摄像头比较好,AHD英文全名Analog High Definition,即模拟高清,拥有比较好的分辨率与画面质感。 RN6752v1 GQW AKKY2 usb 采集卡 FHD(1080p)、HD(720p)和D1(480i&am…

MySQL第七次作业

Product表内容 字段名 字段描述 数据类型 主键 外键 非空 唯一 自增 Id 产品编号 Int(10) 是 否 是 是 否 Name 产品功能 Varchar(20) 否 否 是 否 否 Function 主要功能 Varchar(50) 否 否 否 否 否 Company 生产厂家 Varchar(20) 否 否 是 否 否 Address 家庭住址 Varchar(20…

支持大量边缘盒子集中管理调度的智慧物流开源了。

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上…

AR0132AT 1/3 英寸 CMOS 数字图像传感器(AR0132AT6R、AR0132AT6C)适用于监控和高清视频等多种应用

AR0132AT 1/3 英寸 CMOS 数字图像传感器,带 1280H x 960V 有效像素阵列。它能在线性或高动态模式下捕捉图像,且带有卷帘快门读取。它包含了多种复杂的摄像功能,如自动曝光控制、开窗,以及视频和单帧模式。它适用于低光度和高动态范…

大模型学习笔记十一:视觉大模型

一、判别式模型和生成式模型 1)判别式模型Discriminative ①给某一个样本,判断属于某个类别的概率,擅长分类任务,计算量少。(学习策略函数Y f(X)或者条件概率P(YIX)) ②不能反映训练数据本身的特性 ③学习…

SpringMVC 控制层框架-上

一、SpringMVC简介 1. 介绍 Spring Web MVC 是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework 中。在控制层框架经历Srust、WebWork、Strust2等诸多产品的历代更迭之后,目前业界普遍选择了SpringMVC 作为Java EE项目表述层开发的首…

解读|http和https的区别,谁更好用

在日常我们浏览网页时,有些网站会看到www前面是http,有些是https,这两种有什么区别呢?为什么单单多了“s”,会有人说这个网页会更安全些? HTTP(超文本传输协议)和HTTPS(…

[Labview] 表格单元格外边框 二维图片叠加绘图

最终效果如下所示 转行做Labview都没到三个月,主程居然让我做这么复杂的功能,真是看得起我/(ㄒoㄒ)/~~ 思路大致分为两步 1、确定每个框体的左上/右下单元格位置,转换为表格表格坐标并在二维图片上绘制生成; 2、为二维图片添加…

权威认可 | 海云安开发者安全助手系统通过信通院支撑产品功能认证并荣获信通院2024年数据安全体系建设优秀案例

近日,2024全球数字经济大会——数字安全生态建设专题论坛(以下简称“论坛”)在京成功举办。由全球数字经济大会组委会主办,中国信息通信研究院及公安部第三研究所共同承办,论坛邀请多位专家和企业共同参与。 会上颁发…

android预置apk

在framework开发中,有一些需求是需要预装应用的,有些是预置应用源码,有些是预置apk。今天我们就分享下怎样预置apk 一般系统有自定义的目录,比如我的项目中根目录下有一个文件夹vendor,这里没都是自定义的一些功能。预…

Unity动画系统(3)---融合树

6.1 动画系统基础2-6_哔哩哔哩_bilibili Animator类 using System.Collections; using System.Collections.Generic; using UnityEngine; public class EthanController : MonoBehaviour { private Animator ani; private void Awake() { ani GetComponen…

二百四十四、Hive——Hive中解析复杂JSON,既有对象还有数组,而且数组中包含数组

一、目的 由于协议修改,修改后的原始数据JSON更加复杂,导致Hive中解析的难度更大,搞了一天,还好同事发了篇知乎文章,终于得以解决,天哪,太不容易了 二、数据协议案例 { "deviceNo&qu…

使用 Python 爬虫实现自动获取天气信息并语音播报

简介 在本文中,我将介绍如何使用 Python 编写一个简单的爬虫程序,该程序可以自动获取某个城市的天气信息,并使用语音库将这些信息播报出来。我们将使用 pyttsx3 库进行语音播报,以及 requests 和 lxml 库来获取和解析网页数据。 …

在GPU上运行PyTorch

文章目录 1、查看GPU的CUDA版本2、下载CUDA版本3、安装cuDNN4、配置CUDA环境变量5、安装配置Anaconda6、使用Anaconda7、pycharm导入虚拟环境8、安装带GPU的PyTorch⭐9、总结 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主&#x…

抖音seo短视频矩阵源码系统开发搭建----开源+二次开发

抖音seo短视频矩阵源码系统开发搭建 是一项技术密集型工作,需要对大数据处理、人工智能等领域有深入了解。该系统开发过程中需要用到多种编程语言,如Java、Python等。同时,需要使用一些框架和技术,如Hadoop、Spark、PyTorch等&am…

verilog刷题笔记

1、选择器实现方式 (1)case语句,注意default (2)if-else语言,注意else,有优先级 (3)三元运算符 ? : 2、阻塞赋值/非阻塞赋值都是过程性赋值&a…

1千多看图猜成语游戏ACCESS\EXCEL数据库

今天闲来无事想写个代码自己搞定,我不写代码已经很久了,主要是年纪不小了对新技术的学习比较吃力,兴趣也被生活打磨的体无完肤。今天又捡起VB(暴露了年纪)搞了一下。 当然,很多事情都是这样,自己…