【头歌】重生之CNN图片分类基础

创作不易,参考之前,点个赞,收藏,关注一下不过分吧,家人们

第1关:卷积操作

任务描述

本关任务:本关的小目标是编写一个实现卷积操作的函数

编程要求

根据提示,在右侧编辑器补充代码,计算输入矩阵在指定卷积核下的输出。

其中,测试输入格式如下:第一行为输入矩阵大小 n ,后 n 行为输入矩阵。

输出格式如下:输入矩阵经过给定卷积核的卷积操作后得到的输出矩阵,为 numpy 的 ndarray 格式。

#根据输入矩阵的大小创建输出的大小
#input:输入矩阵,类型为munpy
#output:全0的输出矩阵,类型为numpy
def generate_dst(srcImg):
    # 请在此添加代码 完成本关任务
    # ********** Begin *********#
    row, col = np.shape(srcImg)
    kr,kc = np.shape(test_kernel)

    dst = np.zeros((row-kr+1,col-kc+1))
    return dst
    # ********** End **********#

# 调用generate_dst函数,预分配输出,并调用_con_each计算输出矩阵中每个点的值
# input:src为输入矩阵,类型为munpy;kernel为卷积核,类型为numpy;k_size为卷积核的维度
# output:输出矩阵,类型为numpy
def conv_2d(src, kernel, k_size):
    dst = generate_dst(src)
    for i in range(dst.shape[0]):
        for j in range(dst.shape[1]):
            value = _con_each(src[i:i + k_size, j:j + k_size], kernel)
            dst[i, j] = value
    return dst.astype(int)

# 供conv_2d调用,计算输出矩阵中每个点的值
# input:src为输入矩阵中被卷积的部分,类型为munpy;kernel为卷积核,类型为numpy
# output:输入矩阵中被卷积的部分与卷积核的结果
def _con_each(src, kernel):
    pixel_count = kernel.size;
    pixel_sum = 0;
    _src = src.flatten();
    _kernel = kernel.flatten();

    for i in range(pixel_count):
        pixel_sum += _src[i] * _kernel[i];

    return pixel_sum

第2关:池化操作

任务描述

本关任务:本关的小目标是编写一个实现池化操作的函数。

编程要求

根据提示,在右侧编辑器的 begin-end 间补充代码,实现基本的池化操作。

其中,测试输入的第一行为输入矩阵的尺寸 n,后 n 行为输入矩阵。

测试输出为池化后的输出矩阵,为 numpy 的 ndarray 格式。

   # outputMap sizes
    #根据inputMap的大小,poolStride大小算出输出大小,并用np.zeros()进行预分配
    #其中,变量名定义如下:
    # out_row为输出的行数,out_col为输出的列数,outputMap为预分配内存的输出矩阵
    # 请在此添加代码 完成本关任务
    # ********** Begin *********#
    out_row, out_col = int(np.floor(in_row / poolStride)), int(np.floor(in_col / poolStride))
    row_remainder, col_remainder = np.mod(in_row,
poolStride), np.mod(in_col, poolStride)
    if row_remainder != 0:
        out_row += 1
    if col_remainder != 0:    
        out_col += 1
    outputMap = np.zeros((out_row, out_col))
    # ********** End **********#

第3关:dropout与正则化

任务描述

本关任务:编写一个实现按概率进行 dropout 的函数。

编程要求

根据提示,在右侧编辑器的 begin-end 间补充代码,实现模拟网络中节点按指定概率进行 dropout。

测试输入的第一行为一个向量,模拟网络中的节点。第二行为被 dropout 的比例。

测试输出为一个向量,模拟被按概率 dropout 后的网络节点。

  # 我们通过binomial函数,生成与x一样的维数向量。binomial函数就像抛硬币一样,我们可以把每个神经元当做抛硬币一样
    # 硬币 正面的概率为p,n表示每个神经元试验的次数
    # 因为我们每个神经元只需要抛一次就可以了所以n=1,size参数是我们有多少个硬币。
    # 生成一个0、1分布的向量,0表示这个神经元被屏蔽,不工作了,也就是dropout了
    # 并屏蔽某些神经元,让它们的值变为0

    # 请在此添加代码 完成本关任务
    # ********** Begin *********#
    sample = np.random.binomial(n=1, p=retain_prob, size=x.shape)
    x *= sample
    # ********** End **********#
    return x


注:内容只做参考和分享,未经允许不可传播,侵权立删

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值