机器学习/深度学习常见算法实现(秋招版)

这篇具有很好参考价值的文章主要介绍了机器学习/深度学习常见算法实现(秋招版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

包括BN层、卷积层、池化层、交叉熵、随机梯度下降法、非极大抑制、k均值聚类等秋招常见的代码实现。文章来源地址https://www.toymoban.com/news/detail-582474.html

1. BN层

import numpy as np

def batch_norm(outputs, gamma, beta, epsilon=1e-6, momentum=0.9, running_mean=0, running_var=1):
    '''
    :param outputs: [B, L]
    :param gamma: mean
    :param beta:
    :param epsilon:
    :return:
    '''
    mean = np.mean(outputs, axis=(0, 2, 3), keepdims=True) # 1, C, H, W
    var = np.var(outputs, axis=(0,2,3), keepdims=True) # 1, C, H, W

    # mean = np.mean(outputs, axis=0)
    # var = np.var(outputs, axis=0)


    # 滑动平均用于记录mean和var,用于测试
    running_mean = momentum * running_mean + (1-momentum) * mean
    running_var = momentum * running_var + (1-momentum) * var

    res = gamma * ( outputs - mean ) / np.sqrt(var + epsilon) + beta
    return res, running_mean, running_var

if __name__ == '__main__':
    outputs = np.random.random((16, 64, 8, 8))
    tmp, _, _ = batch_norm(outputs, 1, 1, 1e-6)
    # print(tmp.shape)
    mean = np.mean(tmp[:, 1, :, :])
    std = np.sqrt(np.var(tmp[:, 1, :, :]))
    print(mean, std)

2. 卷积层

import numpy as np

def conv_forward_naive(x, w, b, conv_param):
    '''
    :param x: [N, C_in, H, W]
    :param w: [C_out, C_in, k1, k2]
    :param b: [C_out]
    :param conv_param:
        - 'stride':
        - 'pad': the number of pixels that will be used to zero-pad the input
    :return:
        - 'out': (N, C_out, H', W')
        - 'cache': (x, w, b, conv_param)
    '''
    out = None
    N, C_in, H, W = x.shape
    C_out, _, k1, k2 = w.shape
    stride, padding = conv_param['stride'], conv_param['pad']
    H_out = (H-k1+2*padding) // stride + 1
    W_out = (W-k2+2*padding) // stride + 1
    out = np.zeros((N, C_out, H_out, W_out))

    x_pad = np.zeros((N, C_in, H+2*padding, W+2*padding))
    x_pad[:, :, padding:padding+H, padding:padding+W] = x

    for i in range(H_out):
        for j in range(W_out):
            x_pad_mask = x_pad[:, :, i*stride:i*stride+k1, j*stride:j*stride+k2]
            for c in range(C_out):
                out[:, c, i, j] = np.sum(x_pad_mask*w[c, :, :, :], axis=(1,2,3))
    out += b[None, :, None, None]

    cache = (x, w, b, conv_param)

    return out, cache

3. maxpooling

import numpy as np

def maxpooling_forward(feature, kernel, stride):
    '''
    :param feature: [N, C, H, W]
    :param kernel: [k1, k2]
    :param stride: [s1, s2]
    :return:
    '''
    N, C, H, W = feature.shape
    k1, k2 = kernel
    s1, s2 = stride

    H_out = (H - k1) // s1 + 1
    W_out = (W - k2) // s2 + 1

    out = np.zeros((N, C, H_out, W_out))
    for i in range(H_out):
        for j in range(W_out):
            feature_mask = feature[:, :, i*s1:i*s1+k1, j*s2:j*s2+k2]
            out[:, :, i, j] = np.max(feature_mask, axis=(2,3)) # 注意这里的2,3!!!

    return out

4. cross Entropy

import numpy as np

def cross_entropy(label, outputs, reduce=True):
    '''
    :param label: B x 1
    :param outputs: B x c
    :return: loss
    '''
    loss_list = []
    for i in range(len(label)):
        y = label[i]
        output = outputs[i]
        sum_exp = np.sum([np.exp(k) for k in output])
        prop = np.exp(output[y]) / sum_exp
        loss_list.append(-np.log(prop))
    if reduce:
        return np.mean(loss_list)
    else:
        return np.sum(loss_list)

def softmax(t):
    return np.exp(t) / np.sum(np.exp(t), axis=1, keepdims=True)

def softmax2(t):
    return np.exp(t) / np.sum(np.exp(t), axis=1, keepdims=True)

def cross_entropy_2(y, y_, onehot=True, reduce=True):
    y = softmax(y)
    if not onehot:
        cates = y.shape
        y_ = np.eye(cates[-1])[y_]
    if reduce:
        return np.mean(-np.sum(y_ * np.log(y), axis=1))
    else:
        return np.sum(-np.sum(y_ * np.log(y), axis=1))




if __name__ == '__main__':
    outputs = [[0.5, 0.5], [0, 1], [1, 0]]
    label = [0, 0, 1]
    print(cross_entropy(label, outputs, True))
    print(cross_entropy_2(outputs, label, False))

5. sgd

import numpy as np
import random
class MYSGD:
    def __init__(self, training_data, epochs, batch_size, lr, model):
        self.training_data = training_data
        self.epochs = epochs
        self.batch_size = batch_size
        self.lr = lr
        self.weight = [...]
        self.bias = [...]

    def run(self):
         n = len(self.training_data)
         for j in range(self.epochs):
             random.shuffle(self.training_data)
             mini_batches = [self.training_data[k*self.batch_size: (k+1)*self.batch_size]
                             for k in range(n//self.batch_size)]
             for mini_batch in mini_batches:
                 self.updata(mini_batch)
    def update(self, mini_batch):
        nabla_b = [np.zeros(b.shape) for b in self.bias]
        nabla_w = [np.zeros(w.shape) for w in self.weight]
        for x, y in mini_batch:
            delta_nabla_b, delta_nabla_w = self.backprop(x, y)
            nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]
            nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]
        self.weight = [w-(self.eta/len(mini_batch))*nw for w, nw in zip(self.weight, nabla_w)]
        self.bias = [b-(self.eta/len(mini_batch))*nb for b, nb in zip(self.bias, nabla_b)]

    def backprop(self, x, y):

6. nms

import numpy as np

def iou_calculate(bbox1, bbox2, mode='x1y1x2y2'):
    # 我的
    x11, y11, x12, y12 = bbox1
    x21, y21, x22, y22 = bbox2
    area1 = (y12-y11+1)*(x12-x11+1)
    area2 = (y22-y21+1)*(x22-x21+1)
    overlap = max(min(y12, y22) - max(y11, y21) + 1, 0) * max(min(x12, x22) - max(x11, x21) + 1, 0)

    return overlap / (area2 + area1 - overlap + 1e-6)

def bb_intersection_over_union(boxA, boxB):
    # 别人的
    boxA = [int(x) for x in boxA]
    boxB = [int(x) for x in boxB]

    xA = max(boxA[0], boxB[0])
    yA = max(boxA[1], boxB[1])
    xB = min(boxA[2], boxB[2])
    yB = min(boxA[3], boxB[3])

    interArea = max(0, xB - xA + 1) * max(0, yB - yA + 1)

    boxAArea = (boxA[2] - boxA[0] + 1) * (boxA[3] - boxA[1] + 1)
    boxBArea = (boxB[2] - boxB[0] + 1) * (boxB[3] - boxB[1] + 1)

    iou = interArea / float(boxAArea + boxBArea - interArea)

    return iou

def nms(outputs, scores, T):
    '''
    :param outputs: bboxes, x1y1x2y2
    :param scores: confidence of each bbox
    :param T: threshold
    :return:
    '''
    # 我的
    outputs = np.array(outputs)[np.argsort(-np.array(scores))]
    saved = [True for _ in range(outputs.shape[0])]
    for i in range(outputs.shape[0]):
        if saved[i]:
            for j in range(i+1, outputs.shape[0]):
                if saved[j]:
                    iou = iou_calculate(outputs[i], outputs[j])
                    if iou >= T:
                        saved[j] = False
    scores = np.sort(-np.array(scores))
    return outputs[saved], -scores[saved]


# 别人的
def nms_others(bboxes, scores, iou_thresh):
    """

    :param bboxes: 检测框列表
    :param scores: 置信度列表
    :param iou_thresh: IOU阈值
    :return:
    """

    x1 = bboxes[:, 0]
    y1 = bboxes[:, 1]
    x2 = bboxes[:, 2]
    y2 = bboxes[:, 3]
    areas = (y2 - y1) * (x2 - x1)

    # 结果列表
    result = []
    index = scores.argsort()[::-1]  # 对检测框按照置信度进行从高到低的排序,并获取索引
    # 下面的操作为了安全,都是对索引处理
    while index.size > 0:
        # 当检测框不为空一直循环
        i = index[0]
        result.append(i)  # 将置信度最高的加入结果列表

        # 计算其他边界框与该边界框的IOU
        x11 = np.maximum(x1[i], x1[index[1:]])
        y11 = np.maximum(y1[i], y1[index[1:]])
        x22 = np.minimum(x2[i], x2[index[1:]])
        y22 = np.minimum(y2[i], y2[index[1:]])
        w = np.maximum(0, x22 - x11 + 1) # 两个边重叠时,也有1列/行像素点是重叠的
        h = np.maximum(0, y22 - y11 + 1)
        overlaps = w * h
        ious = overlaps / (areas[i] + areas[index[1:]] - overlaps)
        # 只保留满足IOU阈值的索引
        idx = np.where(ious <= iou_thresh)[0]
        index = index[idx + 1]  # 处理剩余的边框
    bboxes, scores = bboxes[result], scores[result]
    return bboxes, scores

def mynms(bboxes, scores, iou_T):
    x1 = bboxes[:, 0]
    y1 = bboxes[:, 1]
    x2 = bboxes[:, 2]
    y2 = bboxes[:, 3]
    areas = (y2-y1+1) * (x2-x1+1)

    ids = np.argsort(scores)[::-1]
    res = []
    while len(ids) > 0:
        i = ids[0]
        res.append(i)

        x11 = np.maximum(x1[i], x1[ids[1:]])
        x22 = np.minimum(x2[i], x2[ids[1:]])
        y11 = np.maximum(y1[i], y1[ids[1:]])
        y22 = np.minimum(y2[i], y1[ids[1:]])

        # np.maximum(X,Y,None) : X与Y逐位取最大者. 最少两个参数
        overlap = np.maximum(x22-x11+1, 0) * np.maximum(y22-y11+1, 0)
        iou = overlap / (areas[i] +areas[ids[1:]] - overlap)
        ids = ids[1:][iou<T]
    return bboxes[res], scores[res]



if __name__ == '__main__':
    outputs = [[10, 10, 20, 20], [15, 15, 25, 25], [9, 15, 25, 13]]
    scores = [0.6, 0.8, 0.7]
    T = 0.1
    print(nms(outputs, scores, T))
    print(nms_others(np.array(outputs), np.array(scores), T))
    print(mynms(np.array(outputs), np.array(scores), T))

7. k-means

import numpy as np
import copy

def check(clusters_last, clusters_center):
    # clusters_last.sort()
    # clusters_center.sort()
    if len(clusters_last) == 0:
        return False
    for c1, c2 in zip(clusters_last, clusters_center):
        if np.linalg.norm(c1 - c2) > 0:
            return False
    return True


def kMeans(data, k):
    '''
    :param data: [n, c]
    :param k: the number of clusters
    :return:
    '''
    clusters_last = []
    clusters_center = [data[i] for i in range(k)] # random choosed

    while not check(clusters_last, clusters_center):
        clusters_last = copy.deepcopy(clusters_center)
        clusters = [[] for _ in range(k)]
        for i in range(data.shape[0]):
            min_dis = float('inf')
            for j, center in enumerate(clusters_center):
                distance = np.linalg.norm(center-data[i])
                if distance < min_dis:
                    min_dis = distance
                    idx = j
            clusters[idx].append(data[i])
        clusters_center = []
        for i in range(k):
            clusters_center.append(np.mean(clusters[i], axis=0))
    return clusters_center

def kMeans2(data, k):
    '''
    :param data: [n, c]
    :param k: the number of clusters
    :return:
    '''
    clusters_last = []
    clusters_center = copy.deepcopy(data[:k]) # random choosed

    while not check(clusters_last, clusters_center):
        clusters_last = copy.deepcopy(clusters_center)
        clusters = [[] for _ in range(k)]
        for i in range(data.shape[0]):
            distance = np.linalg.norm(clusters_center - data[i], axis=1)
            idx = np.argmin(distance)
            clusters[idx].append(data[i])
        clusters_center = []
        for i in range(k):
            clusters_center.append(np.mean(clusters[i], axis=0))
        clusters_center = np.array(clusters_center)
    return clusters_center

if __name__ == '__main__':
    data = np.random.random((20, 2))
    print(kMeans(data, 5))
    print(kMeans2(data, 5))

到了这里,关于机器学习/深度学习常见算法实现(秋招版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大数据毕设项目 - 深度学习 机器学习 酒店评价情感分析算法实现

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月19日
    浏览(28)
  • 机器学习面试中常见问题整理

    机器学习( ML )作为目前一个比较火领域,提供了许多有趣且高薪的工作和机会。 无论你是刚刚踏入机器学习领域的新手,还是已经积累了一定经验的从业者,面试都是检验你技能和知识的重要环节。 本文将梳理一些常见的面试问题,让你在面试中更加自信从容。 想要从事

    2024年03月11日
    浏览(36)
  • 机器学习与深度学习——使用paddle实现随机梯度下降算法SGD对波士顿房价数据进行线性回归和预测

    随机梯度下降(SGD)也称为增量梯度下降,是一种迭代方法,用于优化可微分目标函数。该方法通过在小批量数据上计算损失函数的梯度而迭代地更新权重与偏置项。SGD在高度非凸的损失表面上远远超越了朴素梯度下降法,这种简单的爬山法技术已经主导了现代的非凸优化。

    2024年02月03日
    浏览(40)
  • 【机器学习】机器学习常见算法详解第4篇:KNN算法计算过程(已分享,附代码)

    本系列文章md笔记(已分享)主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习,伴随浅显易懂的数学知识,让大家掌握机器学习常见算法原理,应用Scikit-learn实现机器学习算法的应用,结合场景解决实际问题。包括K-近邻算法,线性回归,逻

    2024年02月19日
    浏览(22)
  • 【人工智能】机器学习算法综述及常见算法详解

    目录 推荐 1、机器学习算法简介 1.1 机器学习算法包含的两个步骤 1.2 机器学习算法的分类 2、线性回归算法 2.1 线性回归的假设是什么? 2.2 如何确定线性回归模型的拟合优度? 2.3 如何处理线性回归中的异常值? 3、逻辑回归算法 3.1 什么是逻辑函数? 3.2 逻辑回归可以用于多类

    2024年04月22日
    浏览(30)
  • 【机器学习】几种常见的无监督学习算法

    本系列包含: 几种常见的有监督学习算法 几种常见的无监督学习算法 降维是指在保留数据特征的前提下,以少量的变量表示有许多变量的数据,这有助于降低多变量数据分析的复杂度。减少数据变量的方法有两种:一种是只选择重要的变量,不使用其余变量;另一种是基于

    2023年04月09日
    浏览(37)
  • 人工智能-10种机器学习常见算法

    机器学习是目前行业的一个创新且重要的领域。今天,给大家介绍机器学习中的10种常见的算法,希望可以帮助大家适应机器学习的世界。 线性回归(Linear Regression)是目前机器学习算法中最流行的一种,线性回归算法就是要找一条直线,并且让这条直线尽可能地拟合散点图中的

    2023年04月08日
    浏览(30)
  • 算法面试-深度学习基础面试题整理-AIGC相关(2023.9.01)

    1、stable diffusion和GAN哪个好?为什么 ? Stable diffusion是一种基于随机微分方程的生成方法,它通过逐步增加噪声来扰动原始图像,直到完全随机化。然后,它通过逐步减少噪声来恢复图像,同时使用一个神经网络来预测下一步的噪声分布。Stable Diffusion的优点是可以在连续的潜

    2024年02月09日
    浏览(31)
  • 机器学习&&深度学习——随机梯度下降算法(及其优化)

    在我们没有办法得到解析解的时候,我们可以用过梯度下降来进行优化,这种方法几乎可以所有深度学习模型。 关于优化的东西,我自己曾经研究过智能排班算法和优化,所以关于如何找局部最小值,以及如何跳出局部最小值的一些基本思想是有感触的,随机梯度算法和其优

    2024年02月15日
    浏览(32)
  • 深度学习DAY3:神经网络训练常见算法概述

    这是最常见的神经网络训练方法之一。它通过计算损失函数对权重的梯度,并沿着梯度的反方向更新权重,从而逐步减小损失函数的值。梯度下降有多个变种,包括随机梯度下降(SGD)和小批量梯度下降。 反向传播是一种基于链式法则的方法,用于计算神经网络中每个神经元

    2024年02月07日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包