首页 > 其他分享 >深度学习与图像识别day4

深度学习与图像识别day4

时间:2024-07-28 19:55:38浏览次数:12  
标签:图像识别 fold day4 np train 深度 test self mean

KNN在Cifar上的应用

def getXmean(X_train):
    X_train = np.reshape(X_train, (X_train.shape[0], -1))  # 将图片从二维展开为一维
    mean_image = np.mean(X_train, axis=0)  # 求出训练集所有图片每个像素位置上的平均值
    return mean_image

def centralized(X_test,mean_image):
    X_test = np.reshape(X_test, (X_test.shape[0], -1))  # 将图片从二维展开为一维
    X_test = X_test.astype(np.float)
    X_test -= mean_image  # 减去均值图像,实现零均值化????
    return X_test

X_train = train_loader.dataset.train_data
mean_image = getXmean(X_train)
X_train = centralized(X_train,mean_image)
y_train = train_loader.dataset.train_labels
X_test = test_loader.dataset.test_data[:100]
X_test = centralized(X_test,mean_image)
y_test = test_loader.dataset.test_labels[:100]
num_test = len(y_test)
y_test_pred = kNN_classify(6, 'M', X_train, y_train, X_test)#这里并没有使用封装好的类  是因为没有定义一个新的类来存放方法吗
num_correct = np.sum(y_test_pred == y_test)
accuracy = float(num_correct) / num_test
print('Got %d / %d correct => accuracy: %f' % (num_correct, num_test, accuracy))
  • X_train.shape[0]:这表示X_train的第一个维度的大小,即它的行数。在机器学习和数据处理的上下文中,这通常代表样本的数量。
  • -1:在numpyreshape函数中,-1是一个特殊的值,它告诉numpy自动计算该维度的大小,以保持数组中元素的总数不变。这意味着,如果你指定了除-1之外的其他所有维度的大小,numpy将计算出-1所在维度的大小,以确保重塑后的数组与原始数组具有相同数量的元素。

 

模型参数调优

机器学习方法(深度学习是机器学习中的一种)往往涉及很多参数甚至超参数,此实践过程中需要对这些参数进行适当地选择和调整。
对于KNN算法来说,k就是需要调整的超参数。

有一种更专业的穷举调参方法称为GridSearch,    即在所有候选的参数中,通过循环遍历,尝试每一种的可能性,表现最好的参数就是最终的结果。

那么选用哪些数据集进行调参呢?                                                                  k=1 总是最好的??
方法一,选择整个数据集进行测试。这种方法有一个非常明显的问题,那就是设定 k=1 总是最好的,因为每个测试样本的位置总是与整个训练集中的自己最接近,

Your Dataset
方法二,将整个数据集拆分成训练集和测试集,然后在测试集中选择合适的超参数。这里也会存在一个问题,那就是不清楚这样训练出来的算法模型对于接下来的新的测试数据的表现会如何
train
test

方法三,将整个数据集拆分成训练集、验证集和测试集,然后在验证集中选择合适的超参数,最后在测试集上进行测试。这个方法相对来说比之前两种方法好很多,也是在实践中经常使用的方法
train validation test

方法四,使用交叉验证,将数据分成若干份,将其中的各份作为验证集之后给出平均准确率,最后将评估得到的合适的超参数在测试集中进行测试。这个方法更加严谨,但实
践中常在较小的数据集上使用


fold 1 fold 2 fold 3 fold 4 fold 5 test
fold 1 fold 2 fold 3 fold 4 fold 5 test
fold 1 fold 2 fold 3 fold 4 fold 5 test

class Knn:

    def __init__(self):
        pass

    def fit(self,X_train,y_train):  #定义了一个封装吗
        self.Xtr = X_train
        self.ytr = y_train

    def predict(self,k, dis, X_test):
        assert dis == 'E' or dis == 'M', 'dis must E or M'
        num_test = X_test.shape[0]  # 测试样本的数量
        labellist = []
        # 使用欧拉公式作为距离度量
        if (dis == 'E'):
            for i in range(num_test):
                distances = np.sqrt(np.sum(((self.Xtr - np.tile(X_test[i], (self.Xtr.shape[0], 1))) ** 2), axis=1))
                nearest_k = np.argsort(distances)   从小到大排列
                topK = nearest_k[:k]
                classCount = {}
                for i in topK:
                    classCount[self.ytr[i]] = classCount.get(self.ytr[i], 0) + 1
  1. self.ytr[i]:访问 self.ytr 列表(或数组)中索引为 i 的元素,即当前训练样本的标签。

  2. classCount.get(self.ytr[i], 0):尝试从 classCount 字典中获取键为 self.ytr[i] 的值。如果 self.ytr[i] 不在 classCount 的键中,则使用默认值 0
  3. + 1:将上一步得到的值(无论是从字典中检索到的还是默认值 0)增加 1
                sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)  #降序
sorted() 函数是 Python 的内置函数,用于对可迭代对象(如列表、元组、字典的项等)进行排序,并返回一个新的列表,其中包含已排序的元素。与列表的 .sort() 方法不同,sorted() 函数不会修改原始的可迭代对象,而是返回一个新的列表。
labellist.append(sortedClassCount[0][0]) return np.array(labellist) # 使用曼哈顿公式作为距离度量 if (dis == 'M'): for i in range(num_test): # 按照列的方向相加,其实就是行相加 distances = np.sum(np.abs(self.Xtr - np.tile(X_test[i], (self.Xtr.shape[0], 1))), axis=1) nearest_k = np.argsort(distances) topK = nearest_k[:k] classCount = {} for i in topK: classCount[self.ytr[i]] = classCount.get(self.ytr[i], 0) + 1 sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) labellist.append(sortedClassCount[0][0]) return np.array(labellist)

 

sorted() 函数的基本语法如下:

sorted(iterable, *, key=None, reverse=False)
   
  • iterable:要排序的可迭代对象。
  • key:一个函数,用于从每个元素中提取一个用于比较的关键字。默认为 None,表示直接比较元素本身。
  • reverse:一个布尔值,指定排序是升序(False)还是降序(True)。默认为 False

准备验证集与测试集数据,使用交叉验证,在选择超参数阶段不需要使用X-TEST与Y-TEST的使用

常见的超参数包括:

  1. 学习率(Learning Rate):控制模型在训练过程中权重更新的步长大小。学习率太小会导致训练过程缓慢,而学习率太大则可能导致训练过程不稳定,甚至无法收敛。

  2. 批量大小(Batch Size):在每次权重更新时使用的样本数量。批量大小的选择会影响模型的训练速度和泛化能力。较小的批量大小可能导致训练过程更加不稳定,但有助于模型更快地适应训练数据的变化。

  3. 迭代次数/训练周期(Epochs):整个训练数据集被遍历的次数。迭代次数太少可能导致模型欠拟合,而迭代次数太多则可能导致模型过拟合。

  4. 正则化参数(Regularization Parameters):用于控制模型复杂度的参数,如L1正则化、L2正则化中的系数。正则化参数有助于防止模型过拟合。

  5. 网络架构参数:在神经网络中,超参数还包括网络的层数、每层的神经元数量、激活函数类型等。这些参数的选择对模型的性能有着重要影响。

  6. 优化器参数:如动量(Momentum)、学习率衰减(Learning Rate Decay)等,这些参数控制优化算法的行为,进而影响模型的训练过程。

  7. dropout比率:在神经网络中,dropout是一种正则化技术,用于减少神经元之间的共适应性,从而提高模型的泛化能力。dropout比率是指在训练过程中随机丢弃神经元的比例。

X_train = train_loader.dataset.train_data
X_train = X_train.reshape(X_train.shape[0],-1)
mean_image = getXmean(X_train)
X_train = centralized(X_train,mean_image)
y_train = train_loader.dataset.train_labels
y_train = np.array(y_train)
X_test = test_loader.dataset.test_data
X_test = X_test.reshape(X_test.shape[0],-1)
X_test = centralized(X_test,mean_image)
y_test = test_loader.dataset.test_labels
y_test = np.array(y_test)
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)

num_folds = 5
k_choices = [1, 3, 5, 8, 10, 12, 15, 20]#k的值一般选择1~20以内
num_training=X_train.shape[0]
X_train_folds = []
y_train_folds = []
indices = np.array_split(np.arange(num_training), indices_or_sections=num_folds) # 把下标分成5个部分
for i in indices:
X_train_folds.append(X_train[i])
y_train_folds.append(y_train[i])
k_to_accuracies = {}
for k in k_choices:
# 进行交叉验证
acc = []
for i in range(num_folds):
x = X_train_folds[0:i] + X_train_folds[i+1:] #训练集不包括验证集
x = np.concatenate(x, axis=0) # 使用concatenate将4个训练集拼在一起
y = y_train_folds[0:i] + y_train_folds[i+1:]
y = np.concatenate(y) # 对label使用同样的操作
test_x = X_train_folds[i] #单独拿出验证集
test_y = y_train_folds[i]

classifier = Knn() # 定义model
classifier.fit(x, y) # 将训练集读入
#dist = classifier.compute_distances_no_loops(test_x) # 计算距离矩阵
y_pred = classifier.predict(k,'M',test_x) # 预测结果
accuracy = np.mean(y_pred == test_y) # 计算准确率
acc.append(accuracy)
k_to_accuracies[k] = acc # 计算交叉验证的平均准确率
# 输出准确度
for k in sorted(k_to_accuracies):
for accuracy in k_to_accuracies[k]:
print('k = %d, accuracy = %f' % (k, accuracy))

 

 

# plot the raw observations
import matplotlib.pyplot as plt
for k in k_choices:
accuracies = k_to_accuracies[k]
plt.scatter([k] * len(accuracies), accuracies)

# plot the trend line with error bars that correspond to standard deviation
accuracies_mean = np.array([np.mean(v) for k,v in sorted(k_to_accuracies.items())])
accuracies_std = np.array([np.std(v) for k,v in sorted(k_to_accuracies.items())])
plt.errorbar(k_choices, accuracies_mean, yerr=accuracies_std)
plt.title('Cross-validation on k')
plt.xlabel('k')
plt.ylabel('Cross-validation accuracy')
plt.show()

 

标签:图像识别,fold,day4,np,train,深度,test,self,mean
From: https://www.cnblogs.com/candice1/p/18328767

相关文章

  • 深度学习计算
    一.参数访问我们以多层感知机为例importtorchfromtorchimportnnnet=nn.Sequential(nn.Linear(4,8),nn.ReLU(),nn.Linear(8,1))X=torch.rand(size=(2,4))net(X)先访问一下参数字典print(net[2].state_dict())结果:就是把参数名称和参数的值都列出来了1......
  • AI智能名片小程序在预测性产品管理与营销中的深度应用探索
    摘要:本文深入探讨了AI智能名片小程序在预测性产品管理与营销中的广泛应用及其带来的深远影响。通过详细分析该技术在数据收集、市场分析、用户画像构建、个性化推荐、客户关系管理以及风险预测等方面的具体实践,本文揭示了AI智能名片小程序如何助力企业实现精准决策、优化资源配......
  • 深度学习环境配置——总结下近期遇到的”坑“
    文章目录1.问题1:硬件选择的误区2.问题2:操作系统的适配难题3.问题3:深度学习框架的安装陷阱4.问题4:CUDA与cuDNN的版本匹配问题5.问题5:网络配置的瓶颈6.问题6:数据预处理的技巧7.问题7:模型调优的策略8.问题8:资源管理的艺术9.问题9:版本控制的重要性10.问题10:安全性......
  • PWA与原生应用:性能与用户体验的深度对比
    摘要随着Web技术的进步,渐进式Web应用(ProgressiveWebApps,PWA)已成为一种越来越受欢迎的选择,它结合了Web和原生应用的优点。尽管如此,原生应用仍然占据着移动应用市场的主导地位。本文将深入探讨PWA与原生应用之间的性能和用户体验方面的差异,并通过一些实际代码示例来展示如何......
  • 深度学习--数据预处理
    数据预处理importosimportpandasaspdimporttorch#创建csv文件os.makedirs(os.path.join('..','data'),exist_ok=True)data_file=os.path.join('..','data','house_tiny.csv')#往文件里写内容withopen(data_file,'w......
  • Raft协议深度解析:RocketMQ中基于DLedger的日志主从复制
    本文所涉及的注释源码:bigcoder84/dledgerRaft协议主要包含两个部分:Leader选举和日志复制。前面我们在Raft协议深度解析:RocketMQ中的自动Leader选举与故障转移一文中已经详细介绍了DLedger如何实现Leader选举的,而本文主要聚焦于Leader选举完成后的日志复制的过程。一.Rock......
  • 探索Memcached的宇宙:APIs及其工作原理深度解析
    ......
  • 深度解析Memcached:内存分配算法的优化之旅
    ......
  • 【C++深度探索】AVL树与红黑树的原理与特性
    ......
  • 深度学习与图像分类day3(KNN算法)
    KNN——最近邻算法(即选择最近的占比最高的类别作为预测类别)KNN算法的计算逻辑1)给定测试对象,计算它与训练集中每个对象的距离。2)圈定距离最近的k个训练对象,作为测试对象的邻居。3)根据这k个近邻对象所属的类别,找到占比最高的那个类别作为测试对象的预测类别。在KNN算法中,有......