实战教程 | 使用Scratch中的NumPy构建卷积神经网络,开放源码

简介: 根据滤波器的数目和每个滤波器的大小来创建零数组。上述代码创建了2个3x3大小的滤波器,(2,3,3)中的元素数字分别表示2:滤波器的数目(num_filters)、3:表示滤波器的列数、3:表示滤波器的行数。由于输入图像是灰度图,读取后变成2维图像矩阵,因此滤波器的尺寸选择为2维阵列,舍去了深度。如果图像是彩色图(具有3个通道,分别为RGB),则滤波器的大小必须为(3,3,3),最后一个3表示深度,上述代码也要更改,变成(2,3,3,3)。

终于和大家见面了!见字如面,这中间遇到点始料未及的事情,但终究将该实践指导撰写完毕。


按照常规,我本以为这是一个类似于之前做过的专栏、课程,需要先写一个专栏概述,介绍本专栏/课程具体包含的内容,给出大致课程的安排,最后带领大家一起学习交流。最后发现,咱们这边chat不是这样的方式,是一篇文章,这跟我之前的预期不太一样,所以在接到这边平台的飘静的审稿通知后,不得不马不停蹄从3号重新规划文章内容,编写源程序。总之,这边的文章质量真的是对得起读者,审稿很仔细。


接下来,我大致将此文按照这样的逻辑进行撰写。分享机器学习、计算机视觉的基础知识(不会很难,从小白开始),接着我们以一个实际的项目,带领大家自己动手实践,这也是我这个chat最想做的。最后,结合本chat申请时向读者承诺的五点,分享更多学习资料、进阶项目实战,这部分属于我CSDN上的专栏,最后会按照顺序给出相应的链接,供大家选择学习。


理论篇:算法基础(可选择后看)


本专栏所涉及的项目所需机器学习/图像处理知识并不深入,但我之前也开设了《机器学习算法讲解与Python实现》和《计算机视觉前沿论文研读》两个专栏。一个更偏算法理论,一个则关注于计算机视觉顶会的前沿论文成果,解读新的方法和Idea。


《机器学习算法讲解与Python实现》


该专栏分类讲解机器学习算法原理,深度解析决策树、贝叶斯算法、逻辑回归、梯度下降、集成学习、k最近邻、支持向量机等,并给出Python实现源程序,同时分享以实战为导向的Kaggle进阶指南。


image.png

- 专栏链接 https://blog.csdn.net/charmve/category_9657673.html


《计算机视觉前沿论文研读》


研读计算机视觉顶会论文,CVPR、ECCV、ICCV等,也有部分项目开源到Github上,论文、源码、数据集。


链接:https://github.com/Charmve/Mirror-Glass-Detection



计算机视觉实战 | 练手项目,开放源码


知乎上收到了太多人给我的私信,想找可以具体操作的机器视觉项目,回复的时候总是零零散散,我经过大半年的收集整理,现完成此专栏。例如手写字识别、人脸识别、表情识别、图像分割、表面缺陷检测、车道线检测、车辆可通行区域检测等项目,提供完整指导文档和开源代码…


image.png


实战案例(本文核心)


为什么说上述两个关于机器学习基础的专栏可以跳过?我的考虑是,如果对于机器学习刚入门的同学,直接上手算法理论,公式推导很容易消耗我们的学习热情和积极性;另外,对于一些非研究人员,我们做项目的直接目的是能跑出实验结果,一开始就带着工程思维去学习,效率会很高,学习的积极性也容易保持。这也是当前很多模型都已在相应的深度学习框架下集成了模块和函数库。而对于剩余一部分,可能需要重新回顾上述两章内容,深入理解算法原理,对算法性能的提升、模型的压缩优化都是很有必要的。


在某些情况下,直接调用已经搭好的模型可能是非常方便且有效的,比如Caffe、TensorFlow工具箱,但这些工具箱需要的硬件资源比较多,不利于初学者实践和理解。因此,为了更好的理解并掌握相关知识,最好是能够自己编程实践下。本文将展示如何使用NumPy来构建卷积神经网络(Convolutional Neural Network , CNN)


本文将仅使用NumPy实现CNN网络,创建三个层模块,分别为卷积层(Conv)、ReLu激活函数和最大池化(max pooling)。


使用Scratch中的NumPy构建卷积神经网络


v2-694a3d83dd8af09cad3a5d2b240147a6_720w.jpg


涉及的主要步骤如下:


  1. 读取输入图像
  2. 准备过滤器
  3. 转换层:将每个滤镜与输入图像进行卷积
  4. ReLU层:在特征图上应用ReLU激活功能(conv层的输出)
  5. 最大池化层:在ReLU层的输出上应用池化操作
  6. 堆叠conv,ReLU和max池化层


(卷积神经网络的其他案例在我之前的专栏中也有写过,例如:手写字识别面部表情识别等)


0. 软件环境搭建


这里我们使用一个叫PyGAD的python库。PyGAD是在Python 3.7.3中开发的,它依赖于NumPy来创建和操作数组,而依赖Matplotlib来创建图形。 开发PyGAD时使用的确切NumPy版本是1.16.4。 对于Matplotlib的版本为3.1.0。


安装也较为方便,只需使用pip从PyPI(Python软件包索引)下载并安装该库。 该库位于此页面https://pypi.org/project/pygad上的PyPI。


对于Windows,发出以下命令:


pip install pygad


对于Linux和Mac,请使用pip3替换pip,因为该库仅支持Python 3。


pip install pygad


由于本身使用的只是一个库,所以这里知道如何安装、生命周期即可。



image.png

image.png


更多详细信息,大家也可以参考 https://pygad.readthedocs.io上的文档。


1.读取输入图像


以下代码将从skimage Python库中读取已经存在的图像,并将其转换为灰度图:


import skimage.data  
# Reading the image  
img = skimage.data.chelsea()  
# Converting the image into gray.  
img = skimage.color.rgb2gray(img)js


读取图像是第一步,下一步的操作取决于输入图像的大小。将图像转换为灰度图如下所示:


image.png

                                                          图1 输入图像


2.准备滤波器


以下代码为第一个卷积层Conv准备滤波器组(Layer 1,缩写为l1,下同):


l1_filter = numpy.zeros((2,3,3))


根据滤波器的数目和每个滤波器的大小来创建零数组。上述代码创建了2个3x3大小的滤波器,(2,3,3)中的元素数字分别表示2:滤波器的数目(num_filters)、3:表示滤波器的列数、3:表示滤波器的行数。由于输入图像是灰度图,读取后变成2维图像矩阵,因此滤波器的尺寸选择为2维阵列,舍去了深度。如果图像是彩色图(具有3个通道,分别为RGB),则滤波器的大小必须为(3,3,3),最后一个3表示深度,上述代码也要更改,变成(2,3,3,3)。


滤波器组的大小由自己指定,但没有给定滤波器中具体的数值,一般采用随机初始化。下列一组值可以用来检查垂直和水平边缘:


l1_filter[0, :, :] = numpy.array([[[-1, 0, 1],   
                                    [-1, 0, 1],   
                                    [-1, 0, 1]]])  
 l1_filter[1, :, :] = numpy.array([[[1,   1,  1],   
                                    [0,   0,  0],   
                                    [-1, -1, -1]]])


3.卷积层(Conv Layer)


构建好滤波器后,接下来就是与输入图像进行卷积操作。下面代码使用conv函数将输入图像与滤波器组进行卷积:


l1_feature_map = conv(img, l1_filter)


conv函数只接受两个参数,分别为输入图像、滤波器组:


def conv(img, conv_filter):  
    if len(img.shape) > 2 or len(conv_filter.shape) > 3: # Check if number of image channels matches the filter depth.  
        if img.shape[-1] != conv_filter.shape[-1]:  
            print("Error: Number of channels in both image and filter must match.")  
            sys.exit()  
    if conv_filter.shape[1] != conv_filter.shape[2]: # Check if filter dimensions are equal.  
        print('Error: Filter must be a square matrix. I.e. number of rows and columns must match.')  
        sys.exit()  
    if conv_filter.shape[1]%2==0: # Check if filter diemnsions are odd.  
        print('Error: Filter must have an odd size. I.e. number of rows and columns must be odd.')  
        sys.exit()  
    # An empty feature map to hold the output of convolving the filter(s) with the image.  
    feature_maps = numpy.zeros((img.shape[0]-conv_filter.shape[1]+1,   
                                img.shape[1]-conv_filter.shape[1]+1,   
                                conv_filter.shape[0]))  
    # Convolving the image by the filter(s).  
    for filter_num in range(conv_filter.shape[0]):  
        print("Filter ", filter_num + 1)  
        curr_filter = conv_filter[filter_num, :] # getting a filter from the bank.  
        """  
        Checking if there are mutliple channels for the single filter. 
        If so, then each channel will convolve the image. 
        The result of all convolutions are summed to return a single feature map. 
        """  
        if len(curr_filter.shape) > 2:  
            conv_map = conv_(img[:, :, 0], curr_filter[:, :, 0]) # Array holding the sum of all feature maps.  
            for ch_num in range(1, curr_filter.shape[-1]): # Convolving each channel with the image and summing the results.  
                conv_map = conv_map + conv_(img[:, :, ch_num],   
                                  curr_filter[:, :, ch_num])  
        else: # There is just a single channel in the filter.  
            conv_map = conv_(img, curr_filter)  
        feature_maps[:, :, filter_num] = conv_map # Holding feature map with the current filter.
     return feature_maps # Returning all feature maps.


该函数首先确保每个滤波器的深度等于图像通道的数目,代码如下。if语句首先检查图像与滤波器是否有一个深度通道,若存在,则检查其通道数是否相等,如果匹配不成功,则报错。


if len(img.shape) > 2 or len(conv_filter.shape) > 3: # Check if number of image channels matches the filter depth.  
        if img.shape[-1] != conv_filter.shape[-1]:  
            print("Error: Number of channels in both image and filter must match.")


此外,滤波器的大小应该是奇数,且每个滤波器的大小是相等的。这是根据下面两个if条件语块来检查的。如果条件不满足,则程序报错并退出。


if conv_filter.shape[1] != conv_filter.shape[2]: # Check if filter dimensions are equal.  
     print('Error: Filter must be a square matrix. I.e. number of rows and columns must match.')  
     sys.exit()  
  if conv_filter.shape[1]%2==0: # Check if filter diemnsions are odd.  
     print('Error: Filter must have an odd size. I.e. number of rows and columns must be odd.')  
     sys.exit()


上述条件都满足后,通过初始化一个数组来作为滤波器的值,通过下面代码来指定滤波器的值:


# An empty feature map to hold the output of convolving the filter(s) with the image.  
feature_maps = numpy.zeros((img.shape[0]-conv_filter.shape[1]+1,   
                            img.shape[1]-conv_filter.shape[1]+1,   
                            conv_filter.shape[0]))


由于没有设置步幅(stride)或填充(padding),默认为步幅设置为1,无填充。那么卷积操作后得到的特征图大小为(img_rows-filter_rows+1, image_columns-filter_columns+1, num_filters),即输入图像的尺寸减去滤波

器的尺寸后再加1。注意到,每个滤波器都会输出一个特征图。


Convolving the image by the filter(s).  
   for filter_num in range(conv_filter.shape[0]):  
       print("Filter ", filter_num + 1)  
       curr_filter = conv_filter[filter_num, :] # getting a filter from the bank.  
       """  
       Checking if there are mutliple channels for the single filter. 
       If so, then each channel will convolve the image. 
       The result of all convolutions are summed to return a single feature map. 
       """  
       if len(curr_filter.shape) > 2:  
           conv_map = conv_(img[:, :, 0], curr_filter[:, :, 0]) # Array holding the sum of all feature maps.  
           for ch_num in range(1, curr_filter.shape[-1]): # Convolving each channel with the image and summing the results.  
               conv_map = conv_map + conv_(img[:, :, ch_num],   
                                 curr_filter[:, :, ch_num])  
       else: # There is just a single channel in the filter.  
           conv_map = conv_(img, curr_filter)  
       feature_maps[:, :, filter_num] = conv_map # Holding feature map with the current filter.


循环遍历滤波器组中的每个滤波器后,通过下面代码更新滤波器的状态:


curr_filter = conv_filter[filter_num, :] # getting a filter from the bank.


如果输入图像不止一个通道,则滤波器必须具有同样的通道数目。只有这样,卷积过程才能正常进行。最后将每个滤波器的输出求和作为输出特征图。下面的代码检测输入图像的通道数,如果图像只有一个通道,那么一次卷积即可完成整个过程:


if len(curr_filter.shape) > 2:  
     conv_map = conv_(img[:, :, 0], curr_filter[:, :, 0]) # Array holding the sum of all feature map 
     for ch_num in range(1, curr_filter.shape[-1]): # Convolving each channel with the image and summing the results.  
        conv_map = conv_map + conv_(img[:, :, ch_num],   
                                  curr_filter[:, :, ch_num])  
else: # There is just a single channel in the filter.  
    conv_map = conv_(img, curr_filter)


上述代码中conv_函数与之前的conv函数不同,函数conv只接受输入图像和滤波器组这两个参数,本身并不进行卷积操作,它只是设置用于conv_函数执行卷积操作的每一组输入滤波器。下面是conv_函数的实现代码:


def conv_(img, conv_filter):  
    filter_size = conv_filter.shape[0]  
    result = numpy.zeros((img.shape))  
    Looping through the image to apply the convolution operation.  
    for r in numpy.uint16(numpy.arange(filter_size/2,   
                          img.shape[0]-filter_size/2-2)):  
        for c in numpy.uint16(numpy.arange(filter_size/2, img.shape[1]-filter_size/2-2)):  
            Getting the current region to get multiplied with the filter.  
            curr_region = img[r:r+filter_size, c:c+filter_size]  
            Element-wise multipliplication between the current region and the filter.  
            curr_result = curr_region * conv_filter  
            conv_sum = numpy.sum(curr_result) #Summing the result of multiplication.  
            result[r, c] = conv_sum #Saving the summation in the convolution layer feature map.  
    Clipping the outliers of the result matrix.  
    final_result = result[numpy.uint16(filter_size/2):result.shape[0]-numpy.uint16(filter_size/2),   
                          numpy.uint16(filter_size/2):result.shape[1]-numpy.uint16(filter_size/2)]  
    return final_result


每个滤波器在图像上迭代卷积的尺寸相同,通过以下代码实现:


curr_region = img[r:r+filter_size, c:c+filter_size]


之后,在图像区域矩阵和滤波器之间对位相乘,并将结果求和以得到单值输出:


Element-wise multipliplication between the current region and the filter.  
curr_result = curr_region * conv_filter  
conv_sum = numpy.sum(curr_result) #Summing the result of multiplication.  
result[r, c] = conv_sum #Saving the summation in the convolution layer feature map.


输入图像与每个滤波器卷积后,通过conv函数返回特征图。下图显示conv层返回的特征图(由于l1卷积层的滤波器参数为(2,3,3),即2个3x3大小的卷积核,最终输出2个特征图):


v2-9bc29146bc82411859e2e63bef7625d4_720w.jpg

                                                         图2 卷积后图像


卷积层的后面一般跟着激活函数层,本文采用ReLU激活函数。


4.ReLU激活函数层


ReLU层将ReLU激活函数应用于conv层输出的每个特征图上,根据以下代码行调用ReLU激活函数:


l1_feature_map_relu = relu(l1_feature_map)


ReLU激活函数(ReLU)的具体实现代码如下:


def relu(feature_map):  
    Preparing the output of the ReLU activation function.  
    relu_out = numpy.zeros(feature_map.shape)  
    for map_num in range(feature_map.shape[-1]):  
        for r in numpy.arange(0,feature_map.shape[0]):  
            for c in numpy.arange(0, feature_map.shape[1]):  
                relu_out[r, c, map_num] = numpy.max(feature_map[r, c, map_num], 0)


ReLU思想很简单,只是将特征图中的每个元素与0进行比较,若大于0,则保留原始值。否则将其设置为0。ReLU层的输出如下图所示:


v2-8405910bd4a1eeb61ba3275d3656527e_720w.jpg

                                                   图3 ReLU层输出图像


激活函数层后面一般紧跟池化层,本文采用最大池化(max pooling)。


5.最大池化层


ReLU层的输出作为最大池化层的输入,根据下面的代码行调用最大池化操作:


l1_feature_map_relu_pool = pooling(l1_feature_map_relu, 2, 2)


最大池化函数(max pooling)的具体实现代码如下:


def pooling(feature_map, size=2, stride=2):  
    Preparing the output of the pooling operation.  
    pool_out = numpy.zeros((numpy.uint16((feature_map.shape[0]-size+1)/stride),  
                            numpy.uint16((feature_map.shape[1]-size+1)/stride),  
                            feature_map.shape[-1]))  
    for map_num in range(feature_map.shape[-1]):  
        r2 = 0  
        for r in numpy.arange(0,feature_map.shape[0]-size-1, stride):  
            c2 = 0  
            for c in numpy.arange(0, feature_map.shape[1]-size-1, stride):  
                pool_out[r2, c2, map_num] = numpy.max(feature_map[r:r+size,  c:c+size])  
                c2 = c2 + 1  
            r2 = r2 +1


该函数接受3个参数,分别为ReLU层的输出,池化掩膜的大小和步幅。首先也是创建一个空数组,用来保存该函数的输出。数组大小根据输入特征图的尺寸、掩膜大小以及步幅来确定。


pool_out = numpy.zeros((numpy.uint16((feature_map.shape[0]-size+1)/stride),  
                        numpy.uint16((feature_map.shape[1]-size+1)/stride),  
                        feature_map.shape[-1]))


对每个输入特征图通道都进行最大池化操作,返回该区域中最大的值,代码如下:


pool_out[r2, c2, map_num] = numpy.max(feature_map[r:r+size, c:c+size])


池化层的输出如下图所示,这里为了显示让其图像大小看起来一样,其实池化操作后图像尺寸远远小于其输入图像。


v2-4e4e98c35a75866cbc4e60258bd0a2a2_720w.jpg

                                                       图4 池化层输出图像


6.层堆叠


以上内容已经实现CNN结构的基本层——conv、ReLU以及max pooling,现在将其进行堆叠使用,代码如下:


1.  Second conv layer  
2.  l2_filter = numpy.random.rand(3, 5, 5, l1_feature_map_relu_pool.shape[-1])  
3.  print("\n**Working with conv layer 2**")  
4.  l2_feature_map = conv(l1_feature_map_relu_pool, l2_filter)  
5.  print("\n**ReLU**")  
6.  l2_feature_map_relu = relu(l2_feature_map)  
7.  print("\n**Pooling**")  
8.  l2_feature_map_relu_pool = pooling(l2 _feature_map_relu, 2, 2)  
9.  print("**End of conv layer 2**\n")


从代码中可以看到,l2表示第二个卷积层,该卷积层使用的卷积核为(3,5,5),即3个5x5大小的卷积核(滤波器)与第一层的输出进行卷积操作,得到3个特征图。后续接着进行ReLU激活函数以及最大池化操作。将每个操作的结果可视化,如下图所示:


image.png

                                         图4 l2层处理过程可视化图像


# Third conv layer  
l3_filter = numpy.random.rand(1, 7, 7, l2_feature_map_relu_pool.shape[-1])  
print("\n**Working with conv layer 3**")  
l3_feature_map = conv(l2_feature_map_relu_pool, l3_filter)  
print("\n**ReLU**")  
l3_feature_map_relu = relu(l3_feature_map)  
print("\n**Pooling**")  
l3_feature_map_relu_pool = pooling(l3_feature_map_relu, 2, 2)  
print("**End of conv layer 3**\n")


从代码中可以看到,l3表示第三个卷积层,该卷积层使用的卷积核为(1,7,7),即1个7x7大小的卷积核(滤波器)与第二层的输出进行卷积操作,得到1个特征图。后续接着进行ReLU激活函数以及最大池化操作。将每个操作的结果可视化,如下图所示:


v2-d062be9bc6c5ddcb70ea2451679f7652_720w.jpg

                                                图5 l3层处理过程可视化图像


神经网络的基本结构是前一层的输出作为下一层的输入,比如l2层接收l1层的输出,l3层接收来l2层的输出,代码如下:


l2_feature_map = conv(l1_feature_map_relu_pool, l2_filter)  
l3_feature_map = conv(l2_feature_map_relu_pool, l3_filter)


7.完整代码


部代码已经上传至我的Github上,每层的可视化是使用Matplotlib库实现。


文章原标题《Building Convolutional Neural Network using NumPy from Scratch》,译者:海棠


更多精彩学习资料,承诺大家的,一个也不会少,我分类整理好并附上链接。


入门篇



进阶篇



实践指南


相关文章
|
3月前
|
运维 Kubernetes 前端开发
如何用 eBPF 实现 Kubernetes 网络可观测性?实战指南
本文深入探讨了Kubernetes网络观测的挑战与eBPF技术的应用。首先分析了传统工具在数据碎片化、上下文缺失和性能瓶颈上的局限性,接着阐述了eBPF通过零拷贝观测、全链路关联和动态过滤等特性带来的优势。文章进一步解析了eBPF观测架构的设计与实现,包括关键数据结构、内核探针部署及生产环境拓扑。实战部分展示了如何构建全栈观测系统,并结合NetworkPolicy验证、跨节点流量分析等高级场景,提供具体代码示例。最后,通过典型案例分析和性能数据对比,验证了eBPF方案的有效性,并展望了未来演进方向,如智能诊断系统与Wasm集成。
111 0
|
2月前
|
监控 安全 Go
使用Go语言构建网络IP层安全防护
在Go语言中构建网络IP层安全防护是一项需求明确的任务,考虑到高性能、并发和跨平台的优势,Go是构建此类安全系统的合适选择。通过紧密遵循上述步骤并结合最佳实践,可以构建一个强大的网络防护系统,以保障数字环境的安全完整。
75 12
|
3月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
3月前
|
机器学习/深度学习 移动开发 供应链
基于时间图神经网络多的产品需求预测:跨序列依赖性建模实战指南
本文展示了如何通过学习稀疏影响图、应用图卷积融合邻居节点信息,并结合时间卷积捕获演化模式的完整技术路径,深入分析每个步骤的机制原理和数学基础。
108 1
|
4月前
|
JSON 缓存 程序员
玩转HarmonyOS NEXT网络请求:从新手到高手的实战秘籍
本文以通俗易懂的方式讲解了HarmonyOS网络请求的核心知识,从基础概念到实战技巧,再到进阶优化,帮助开发者快速上手。通过“点外卖”的类比,形象解释了HTTP请求方法(如GET、POST)和JSON数据格式的作用。同时,提供了封装工具类的示例代码,简化重复操作,并分享了常见问题的解决方法(如权限配置、参数格式、内存泄漏等)。最后,还探讨了如何通过拦截器、缓存机制和重试机制提升请求功能。无论你是新手还是进阶开发者,都能从中受益,快动手实现一个新闻App试试吧!
231 5
|
5月前
|
人工智能 供应链 安全
2025 年网络法律论坛 | 应对安全风险,构建韧性举措
2025年查尔斯顿网络法律论坛汇聚法律、网络安全与保险行业专家,探讨全球威胁态势、人工智能应用及监管变化等议题。主旨演讲揭示非对称威胁与供应链漏洞,强调透明度和协作的重要性。小组讨论聚焦AI合理使用、监管热点及网络保险现状,提出主动防御与数据共享策略。论坛呼吁跨领域合作,应对快速演变的网络安全挑战,构建更具韧性的防御体系。
131 1
2025 年网络法律论坛 | 应对安全风险,构建韧性举措
|
3月前
|
机器学习/深度学习
解决神经网络输出尺寸过小的实战方案
在CIFAR10分类模型训练中,因网络结构设计缺陷导致“RuntimeError: Given input size: (256x1x1). Calculated output size: (256x0x0)”错误。核心问题是六层卷积后接步长为2的池化层,使特征图尺寸过度缩小至归零。解决方案包括调整池化参数(如将部分步长改为1)和优化网络结构(采用“卷积-卷积-池化”模块化设计)。两种方案均可消除报错,推荐方案二以平衡特征表达与计算效率。
|
12月前
|
机器学习/深度学习 数据处理 Python
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
255 1
|
机器学习/深度学习 数据处理 计算机视觉
NumPy实践宝典:Python高手教你如何轻松玩转数据处理!
【8月更文挑战第22天】NumPy是Python科学计算的核心库,专长于大型数组与矩阵运算,并提供了丰富的数学函数。首先需安装NumPy (`pip install numpy`)。之后可通过创建数组、索引与切片、执行数学与逻辑运算、变换数组形状及类型、计算统计量和进行矩阵运算等操作来实践学习。NumPy的应用范围广泛,从基础的数据处理到图像处理都能胜任,是数据科学领域的必备工具。
146 0
|
12月前
|
机器学习/深度学习 算法 数据可视化
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
特征工程是机器学习流程中的关键步骤,通过将原始数据转换为更具意义的特征,增强模型对数据关系的理解能力。本文重点介绍处理数值变量的高级特征工程技术,包括归一化、多项式特征、FunctionTransformer、KBinsDiscretizer、对数变换、PowerTransformer、QuantileTransformer和PCA,旨在提升模型性能。这些技术能够揭示数据中的潜在模式、优化变量表示,并应对数据分布和内在特性带来的挑战,从而提高模型的稳健性和泛化能力。每种技术都有其独特优势,适用于不同类型的数据和问题。通过实验和验证选择最适合的变换方法至关重要。
356 6
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征

热门文章

最新文章