关于分类:游戏分类

游戏分类是依据游戏的特色和特点进行分组和归类的过程。依据不同的分类规范,游戏能够被分为多个不同的类别。上面是一些常见的游戏分类及其对应的经典游戏:1、依照游戏的玩法来分 PZG益智游戏(Puzzle Game):这类游戏次要考验玩家的逻辑思维、空间设想、记忆力等能力,通常有肯定的难度和挑战性。玩家须要通过解决各种谜题、拼图、迷宫等来达成游戏指标。典型的游戏实例有《俄罗斯方块》、《扫雷》、《动物大战僵尸》等。 SLG策略和模拟游戏(Strategy and Simulation Game):这类游戏次要考验玩家的策略布局、资源管理、决策判断等能力,通常有较高的自由度和复杂度。玩家须要通过模仿经营、指挥作战、建设倒退等来达成游戏指标。典型的游戏实例有《文化》、《三国志》、《模拟城市》等。文化! SPG体育游戏(Sports Game):这类游戏次要考验玩家的操作技巧、反应速度、竞争意识等能力,通常有较强的真实感和趣味性。玩家须要通过模仿各种体育项目,如足球、篮球、赛车等来达成游戏指标。典型的游戏实例有《FIFA》、《NBA 2K》、《极品飞车》等。nba2k.jpegNBA2k RAC竞速游戏(Racing Game):这类游戏是体育游戏的一个子类,次要考验玩家的驾驶技术、速度感、危险管制等能力,通常有较高的刺激感和视觉效果。玩家须要通过驾驶各种车辆,如汽车、摩托车、飞机等来达成游戏指标。典型的游戏实例有《极品飞车》、《GT赛车》、《微软航行模拟器》等。![上传中...]()欧洲卡车2 RPG角色扮演游戏(Role-playing Game):这类游戏次要考验玩家的角色扮演、剧情了解、团队合作等能力,通常有较丰盛的故事背景和人物设定。玩家须要通过表演一个或多个角色,参加各种冒险、工作、对话等来达成游戏指标。典型的游戏实例有《最终幻想》、《龙与地下城》、《魔兽世界》等。魔兽世界 AVG冒险游戏(Adventure Game):这类游戏次要考验玩家的摸索发现、解谜推理、情感投入等能力,通常有较强的代入感和沉迷感。玩家须要通过摸索各种场景,收集线索,解决谜题,推动剧情等来达成游戏指标。典型的游戏实例有《神秘海域》、《古墓丽影》、《生化危机》等。生化危机 ACT动作游戏(Action Game):这类游戏次要考验玩家的动作管制、敌人应答、闯关过关等能力,通常有较高的动静感和痛快感。玩家须要通过操纵角色进行各种动作,如跳跃、攻打、进攻等来达成游戏指标。典型的游戏实例有《超级玛丽》、《鬼泣》、《刺客信条》等。刺客信条 FPS第一人称射击游戏(First-Person Shooter Game):这类游戏是动作游戏的一个子类,次要考验玩家的射击技巧、战术策略、团队配合等能力,通常有较强的紧张感和画面感。玩家须要通过应用各种武器,如枪支、手雷、刀具等来达成游戏指标。典型的游戏实例有《反恐精英》、《使命号召》、《战地》等。反恐精英 这些游戏不仅代表了各个类型和格调的经典作品,也展现了游戏行业的多样性和丰富性。无论是动作游戏、射击游戏还是角色扮演游戏,每种游戏类型都有其独特的魅力和玩法,满足了不同玩家的趣味和需要。同时,不同的游戏平台和游戏格调也带来了不同的游戏体验,丰盛了游戏行业的倒退。

September 22, 2023 · 1 min · jiezi

机器学习(七)-基于KNN分类的约会网站配对改进算法

1 项目介绍某APP用户一直使用在线约会软件寻找适合自己的约会对象。尽管约会网站会推荐不同的人选,但她并不是喜欢每一个人。经过一番总结,她发现曾交往过三种类型的人:不喜欢的人(3)魅力一般的人(2)极具魅力的人(1)某APP用户希望分类软件可以更好地帮助她将匹配对象划分到确切的分类中。此外还可以收集了约会软件未曾记录的数据信息,她认为这些数据更有助于匹配对象的归类。收集的部分信息如下图所示:数据集下载样本主要包含以下3种特征:每年获得的飞行常客里程数玩视频游戏所耗时间百分比每周消费的冰淇淋公升数2 准备数据:从文本文件中解析数据在将上述特征数据输入到分类器之前,必须将待处理数据的格式改变为分类器可以接受的格式。import numpy as npdef file2matrix(filename): """ :param filename: APP用户收集的约会数据的文件名 :return: returnMat: 用户提供的每行数据信息,三列, 分别是每年获得的飞行常客里程数, 玩视频游戏所耗时间百分比, 每周消费的冰淇淋公升数 classLabelVetor: 用户的评价信息, 一般分为3类(1,2,3) """ fr = open(filename) arrayOfLines = fr.readlines() # print(arrayOfLines) # 获得文件行数; numerOfLines = len(arrayOfLines) # 创建要返回的Numpy矩阵; returnMat = np.zeros((numerOfLines, 3)) # 解析文件数据到矩阵中; classLabelVetor = [] index = 0 for line in arrayOfLines: line = line.strip() listFromLine = line.split(’\t’) returnMat[index, :] = listFromLine[0:3] classLabelVetor.append(listFromLine[-1]) index += 1 return returnMat, classLabelVetorprint(file2matrix(‘data/datingTestSet2’))返回的值显示: 3 分析数据:使用 Matplotlib 创建散点图使用Matplotlib库图形化清晰地标识了三个不同的样本分类区域,具有不同爱好的人其类别区域也不同。def draw_pic(datingDataMat, datingLabels): """ 每年获取的飞行常客里程数与每周所消费的冰淇淋公升数”构成的散点图。 :param datingDataMat: :param datingLabels: :return: """ # 中文显示乱码问题; myfont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=12) # 创建画布 fig = plt.figure() ax = fig.add_subplot(111) ax.scatter(datingDataMat[:, 0], datingDataMat[:, 2], 15 * datingLabels, datingLabels) plt.xlabel(“每年的飞行里程数”, fontproperties=myfont) plt.ylabel(“每周消费的冰淇淋公升数”, fontproperties=myfont) plt.grid(alpha=0.5) plt.show()效果展示4 准备数据:归一化数值计算样本3和样本4之间的距离:问题: 飞行常客里程数对于计算结果的影响将远远大于其他两个特征的影响解决方式: 处理不同取值范围的特征值时,通常采用的方法是将数值归一化,如将取值范围处理为0到1或者-1到1之间。归一化公式: newValue = oldValue / maxdef autoNorm(dataSet): """ 归一化数值, :param dataSet:用户提供的每行数据信息,三列; :return: normDataSet: 归一化的特征信息; maxVals:每个特征数据的最大值; """ # 获取每个特征数据的最大值; maxVals = dataSet.max(0) # 获取样本个数; m = dataSet.shape[0] # 根据公式生成归一化的特征信息; normDataSet = dataSet / np.tile(maxVals, (m, 1)) return normDataSet, maxVals4 实施 kNN 算法对未知类别属性的数据集中的每个点依次执行以下操作, 与上一个案例代码相同:(1) 计算已知类别数据集中的点与当前点之间的距离;(2) 按照距离递增次序排序;(3) 选取与当前点距离最小的k个点;(4) 确定前k个点所在类别的出现频率;(5) 返回前k个点出现频率最高的类别作为当前点的预测分类。def classify(inX, dataSet, labels, k): """ :param inX: 要预测的数据 :param dataSet: 我们要传入的已知数据集 :param labels: 我们要传入的标签 :param k: KNN里的k, 也就是说我们要选几个近邻 :return: 排序的结果 """ dataSetSize = dataSet.shape[0] # (6,2) 6 # tile会重复inX, 把他重复成(datasetsize, 1)型的矩阵 # print(inX) # (x1 - y1), (x2- y2) diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet # 平方 sqDiffMat = diffMat ** 2 # 相加, axis=1 行相加 sqDistance = sqDiffMat.sum(axis=1) # 开根号 distances = sqDistance ** 0.5 # print(distances) # 排序 输出的是序列号index,并不是值 sortedDistIndicies = distances.argsort() # print(sortedDistIndicies) classCount = {} for i in range(k): voteLabel = labels[sortedDistIndicies[i]] classCount[voteLabel] = classCount.get(voteLabel, 0) + 1 # print(classCount) sortedClassCount = sorted(classCount.items(), key=lambda d: float(d[1]), reverse=True) return sortedClassCount[0]5 测试算法:作为完整程序验证分类器如果分类器的正确率满足要求,就可以使用这个软件来处理约会网站提供的约会名单了。机器学习算法一个很重要的工作就是评估算法的正确率,通常我们只提供已有数据的90%作为训练样本来训练分类器,而使用其余的10%数据去测试分类器,检测分类器的正确率。def datingClassTest(): """ 分类器针对约会网站的测试代码, 获取错误率; :return: """ hoRatio = 0.10 datingDataMat, datingLabels = file2matrix(‘data/datingTestSet2’) normDataSet, maxVals = autoNorm(datingDataMat) # 样本个数 m = normDataSet.shape[0] # 测试集个数; numTestVecs = int(mhoRatio) errorCount = 0.0 for i in range(numTestVecs): classiferResult = classify(normDataSet[i, :], normDataSet[numTestVecs:m, :], datingLabels[numTestVecs:m], 3) # print(classiferResult) if classiferResult != datingLabels[i]: errorCount += 1 print(“正确结果:”, datingLabels[i]) print(“预测结果:”, classiferResult) # print(“错误个数:”, errorCount) return errorCount执行效果展示:6 使用算法:构建完整可用的预测系统def classifyPerson(Person): """ 使用这个分类器为某APP用户来对人们分类。 :param Person: :return: """ datingDataMat, datingLabels = file2matrix(‘data/datingTestSet2’) normDataSet, maxVals = autoNorm(datingDataMat) classiferResult = classify(Person / maxVals, normDataSet, datingLabels, 3) if classiferResult == ‘1’: print(“不喜欢”) elif classiferResult == ‘2’: print(“有一点喜欢”) else: print(“非常喜欢”)完整代码# encoding:utf-8"““KNN实现,基于KNN分类的约会网站配对改进算法”““import numpy as npimport matplotlib.pyplot as pltfrom matplotlib import font_managerdef file2matrix(filename): "”” :param filename: APP用户收集的约会数据的文件名 :return: returnMat: 用户提供的每行数据信息,三列, 分别是每年获得的飞行常客里程数, 玩视频游戏所耗时间百分比, 每周消费的冰淇淋公升数 classLabelVetor: 用户的评价信息, 一般分为3类(1,2,3) "”" fr = open(filename) arrayOfLines = fr.readlines() # print(arrayOfLines) # 获得文件行数; numerOfLines = len(arrayOfLines) # 创建要返回的Numpy矩阵; returnMat = np.zeros((numerOfLines, 3)) # 解析文件数据到矩阵中; classLabelVetor = [] index = 0 for line in arrayOfLines: line = line.strip() listFromLine = line.split(’\t’) returnMat[index, :] = listFromLine[0:3] classLabelVetor.append(listFromLine[-1]) index += 1 return returnMat, classLabelVetordef autoNorm(dataSet): """ 归一化数值, 计算样本3和样本4之间的距离: [(0-67)**2 + (20000 - 32 000)**2 + (1.1 - 0.1)**2]**0.5 问题: 飞行常客里程数对于计算结果的影响将远远大于其他两个特征的影响 解决方式: 处理不同取值范围的特征值时, 通常采用的方法是将数值归一化,如将取值范围处理为0到1或者-1到1之间。 归一化公式: newValue = oldValue / max :param dataSet:用户提供的每行数据信息,三列; :return: normDataSet: 归一化的特征信息; maxVals:每个特征数据的最大值; """ # 获取每个特征数据的最大值; maxVals = dataSet.max(0) # 获取样本个数; m = dataSet.shape[0] # 根据公式生成归一化的特征信息; normDataSet = dataSet / np.tile(maxVals, (m, 1)) return normDataSet, maxValsdef draw_pic(datingDataMat, datingLabels): """ 每年获取的飞行常客里程数与每周所消费的冰淇淋公升数”构成的散点图。 :param datingDataMat: :param datingLabels: :return: """ # 中文显示乱码问题; myfont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=12) # 创建画布 fig = plt.figure() ax = fig.add_subplot(111) ax.scatter(datingDataMat[:, 0], datingDataMat[:, 2], 15 * datingLabels, datingLabels) plt.xlabel(“每年的飞行里程数”, fontproperties=myfont) plt.ylabel(“每周消费的冰淇淋公升数”, fontproperties=myfont) plt.grid(alpha=0.5) plt.show()def classify(inX, dataSet, labels, k): """ :param inX: 要预测的数据 :param dataSet: 我们要传入的已知数据集 :param labels: 我们要传入的标签 :param k: KNN里的k, 也就是说我们要选几个近邻 :return: 排序的结果 """ dataSetSize = dataSet.shape[0] # (6,2) 6 # tile会重复inX, 把他重复成(datasetsize, 1)型的矩阵 # print(inX) # (x1 - y1), (x2- y2) diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet # 平方 sqDiffMat = diffMat ** 2 # 相加, axis=1 行相加 sqDistance = sqDiffMat.sum(axis=1) # 开根号 distances = sqDistance ** 0.5 # print(distances) # 排序 输出的是序列号index,并不是值 sortedDistIndicies = distances.argsort() # print(sortedDistIndicies) classCount = {} for i in range(k): voteLabel = labels[sortedDistIndicies[i]] classCount[voteLabel] = classCount.get(voteLabel, 0) + 1 # print(classCount) sortedClassCount = sorted(classCount.items(), key=lambda d: float(d[1]), reverse=True) return sortedClassCount[0][0]def datingClassTest(): """ 分类器针对约会网站的测试代码, 获取错误率; :return: """ hoRatio = 0.10 datingDataMat, datingLabels = file2matrix(‘data/datingTestSet2’) normDataSet, maxVals = autoNorm(datingDataMat) # 样本个数 m = normDataSet.shape[0] # 测试集个数; numTestVecs = int(mhoRatio) errorCount = 0.0 for i in range(numTestVecs): classiferResult = classify(normDataSet[i, :], normDataSet[numTestVecs:m, :], datingLabels[numTestVecs:m], 3) # print(classiferResult) if classiferResult != datingLabels[i]: errorCount += 1 print(“正确结果:”, datingLabels[i]) print(“预测结果:”, classiferResult) # print(“错误个数:”, errorCount) return errorCountdef classifyPerson(Person): """ 使用这个分类器为某APP用户来对人们分类。 :param Person: :return: """ datingDataMat, datingLabels = file2matrix(‘data/datingTestSet2’) normDataSet, maxVals = autoNorm(datingDataMat) classiferResult = classify(Person / maxVals, normDataSet, datingLabels, 3) if classiferResult == ‘1’: print(“不喜欢”) elif classiferResult == ‘2’: print(“有一点喜欢”) else: print(“非常喜欢”)if name == ‘main’: # personData = [30000, 10, 1.3] personData = [40920, 8.326976, 0.953952] classifyPerson(personData)执行结果 ...

April 17, 2019 · 4 min · jiezi

机器学习(六)-基于KNN分类算法的自动划分电影的题材类型实现

1 分类算法引言众所周知,电影可以按照题材分类,然而题材本身是如何定义的?由谁来判定某部电影属于哪个题材?也就是说同一题材的电影具有哪些公共特征?这些都是在进行电影分类时必须要考虑的问题。动作片中也会存在接吻镜头,爱情片中也会存在打斗场景,我们不能单纯依靠是否存在打斗或者亲吻来判断影片的类型。爱情片中的亲吻镜头更多,动作片中的打斗场景也更频繁,基于此类场景在某部电影中出现的次数可以用来进行电影分类。那么如何基于电影中出现的亲吻、打斗出现的次数,使用k-近邻算法构造程序,自动划分电影的题材类型。2 KNN算法及工作原理k-近邻(KNN)算法采用测量不同特征值之间的距离方法进行分类。存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。3 KNN的第一个实例:电影的分类3.1 项目介绍动作,爱情,喜剧,灾难…???使用打斗和接吻镜头数分类电影每部电影的打斗镜头数、接吻镜头数以及电影评估类型已知电影与未知电影的距离得到了距离后,选择前k个电影来判断未知电影的类型3.2 如何求距离?——欧氏距离公式二维空间多维空间3.3 k-近邻算法的一般流程(1) 收集数据:可以使用任何方法。(2) 准备数据:距离计算所需要的数值,最好是结构化的数据格式。(3) 分析数据:可以使用任何方法。(4) 训练算法:此步骤不适用于k-近邻算法。(5) 测试算法:计算错误率。(6) 使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。3.4 数据准备:使用 Python 导入数据import numpy as npdef createDataSet(): “““创建数据集””” # 每组数据包含打斗数和接吻数; group = np.array([[3, 104], [2, 100], [1, 81], [101, 10], [99, 5], [98, 2]]) # 每组数据对应的标签类型; labels = [‘Roman’, ‘Roman’, ‘Roman’, ‘Action’, ‘Action’, ‘Action’] return group, labels3.5 实施 KNN 算法对未知类别属性的数据集中的每个点依次执行以下操作:(1) 计算已知类别数据集中的点与当前点之间的距离;(2) 按照距离递增次序排序;(3) 选取与当前点距离最小的k个点;(4) 确定前k个点所在类别的出现频率;(5) 返回前k个点出现频率最高的类别作为当前点的预测分类。def classify(inx, dataSet, labels, k): """ KNN分类算法实现 :param inx:要预测电影的数据, e.g.[18, 90] :param dataSet:传入已知数据集,e.g. group 相当于x :param labels:传入标签,e.g. labels相当于y :param k:KNN里面的k,也就是我们要选择几个近邻 :return:电影类新的排序 """ dataSetSize = dataSet.shape[0] # (6,2) – 6行2列 ===> 6 获取行数 # tile会重复inx, 把它重复成(dataSetSize, 1)型的矩阵 # (x1 - y1), (x2 - y2) diffMat = np.tile(inx, (dataSetSize, 1)) - dataSet # 平方 sqDiffMat = diffMat ** 2 # 相加, axis=1行相加 sqDistance = sqDiffMat.sum(axis=1) # 开根号 distance = sqDistance ** 0.5 # 排序索引: 输出的是序列号index, 而不是值 sortedDistIndicies = distance.argsort() # print(sortedDistIndicies) classCount = {} for i in range(k): # 获取排前k个的标签名; voteLabel = labels[sortedDistIndicies[i]] classCount[voteLabel] = classCount.get(voteLabel, 0) + 1 sortedClassCount = sorted(classCount.items(), key=lambda d: float(d[1]), reverse=True) return sortedClassCount[0]3.6 如何测试分类器分类器并不会得到百分百正确的结果,我们可以使用多种方法检测分类器的正确率。为了测试分类器的效果,我们可以使用已知答案的数据,当然答案不能告诉分类器,检验分类器给出的结果是否符合预期结果。完美分类器的错误率为0最差分类器的错误率是1.0完整代码import numpy as npdef createDataSet(): “““创建数据集””” # 每组数据包含打斗数和接吻数; group = np.array([[3, 104], [2, 100], [1, 81], [101, 10], [99, 5], [98, 2]]) # 每组数据对应的标签类型; labels = [‘Roman’, ‘Roman’, ‘Roman’, ‘Action’, ‘Action’, ‘Action’] return group, labelsdef classify(inx, dataSet, labels, k): """ KNN分类算法实现 :param inx:要预测电影的数据, e.g.[18, 90] :param dataSet:传入已知数据集,e.g. group 相当于x :param labels:传入标签,e.g. labels相当于y :param k:KNN里面的k,也就是我们要选择几个近邻 :return:电影类新的排序 """ dataSetSize = dataSet.shape[0] # (6,2) – 6行2列 ===> 6 获取行数 # tile会重复inx, 把它重复成(dataSetSize, 1)型的矩阵 # (x1 - y1), (x2 - y2) diffMat = np.tile(inx, (dataSetSize, 1)) - dataSet # 平方 sqDiffMat = diffMat ** 2 # 相加, axis=1行相加 sqDistance = sqDiffMat.sum(axis=1) # 开根号 distance = sqDistance ** 0.5 # 排序索引: 输出的是序列号index, 而不是值 sortedDistIndicies = distance.argsort() # print(sortedDistIndicies) classCount = {} for i in range(k): # 获取排前k个的标签名; voteLabel = labels[sortedDistIndicies[i]] classCount[voteLabel] = classCount.get(voteLabel, 0) + 1 sortedClassCount = sorted(classCount.items(), key=lambda d: float(d[1]), reverse=True) return sortedClassCount[0][0]if name == ‘main’: group, label = createDataSet() result = classify([3, 104], group, label, 5) print("[3, 104]的电影类型:", result)效果展示 ...

April 17, 2019 · 2 min · jiezi

前端归类小结

工具类bootstrapbootstrap-selectbootsrtap-tableJavascriptjs在线测评网址数据可视化数据可视化图片在线压缩图片漂亮的代码截图工具carbonNode在Node中处理Excel文件CSS在线CSS三角形生成器webpackwebpack可视化工具其他mustache中文api日期选择器工具方案类canvascanvas画出平滑的曲线canvas绘制曲线动画canvas将折线转换成曲线ReactReact阻止冒泡事件ReactNativereactNative获取元素位置JavaScriptJavaScript中字符串与Unicode编码的互相转换csscss文字渐变其他基于html2canvas实现网页保存为图片自定义元素右键点击事件弹出层完美禁止页面滚动文档类ReduxRedux中文文档webpackwebpack性能优化布局flex布局测试框架测试框架MochaReactNativeReact Native ART介绍

January 9, 2019 · 1 min · jiezi

用PyTorch创建一个图像分类器?So easy!(Part 2)

摘要: 学习完了如何加载预训练神经网络,下面就让我们来看看如何训练分类器吧!在第一部分中,我们知道了为什么以及如何加载预先训练好的神经网络,我们可以用自己的分类器代替已有神经网络的分类器。那么,在这篇文章中,我们将学习如何训练分类器。训练分类器首先,我们需要为分类器提供待分类的图像。本文使用ImageFolder加载图像,预训练神经网络的输入有特定的格式,因此,我们需要用一些变换来调整图像的大小,即在将图像输入到神经网络之前,对其进行裁剪和标准化处理。具体来说,将图像大小调整为224*224,并对图像进行标准化处理,即均值为 [0.485,0.456,0.406],标准差为[0.229,0.224,0.225],颜色管道的均值设为0,标准差缩放为1。然后,使用DataLoader批量传递图像,由于有三个数据集:训练数据集、验证数据集和测试数据集,因此需要为每个数据集创建一个加载器。一切准备就绪后,就可以训练分类器了。在这里,最重要的挑战就是——正确率(accuracy)。让模型识别一个已经知道的图像,这不算啥事,但是我们现在的要求是:能够概括、确定以前从未见过的图像中花的类型。在实现这一目标过程中,我们一定要避免过拟合,即“分析的结果与特定数据集的联系过于紧密或完全对应,因此可能无法对其他数据集进行可靠的预测或分析”。隐藏层实现适当拟合的方法有很多种,其中一种很简单的方法就是:隐藏层。我们很容易陷入这样一种误区:拥有更多或更大的隐藏层,能够提高分类器的正确率,但事实并非如此。增加隐藏层的数量或大小以后,我们的分类器就需要考虑更多不必要的参数。举个例子来说,将噪音看做是花朵的一部分,这会导致过拟合,也会降低精度,不仅如此,分类器还需要更长的时间来训练和预测。因此,我建议你从数量较少的隐藏层开始,然后根据需要增加隐藏层的数量或大小,而不是一开始就使用特别多或特别大的隐藏层。在第一部分介绍的《AI Programming with Python Nanodegree》课程中的花卉分类器项目中,我只需要一个小的隐藏层,在第一个完整训练周期内,就得到了70%以上的正确率。数据增强我们有很多图像可供模型训练,这非常不错。如果拥有更多的图像,数据增强就可以发挥作用了。每个图像在每个训练周期都会作为神经网络的输入,对神经网络训练一次。在这之前,我们可以对输入图像做一些随机变化,比如旋转、平移或缩放。这样,在每个训练周期内,输入图像都会有差异。增加训练数据的种类有利于减少过拟合,同样也提高了分类器的概括能力,从而提高模型分类的整体准确度。Shuffle在训练分类器时,我们需要提供一系列随机的图像,以免引入任何误差。举个例子来说,我们刚开始训练分类器时,我们使用“牵牛花”图像对模型进行训练,这样一来,分类器在后续训练过程中将会偏向“牵牛花”,因为它只知道“牵牛花”。因此,在我们使用其他类型的花进行训练时,分类器最初的偏好也将持续一段时间。为了避免这一现象,我们就需要在数据加载器中使用不同的图像,这很简单,只需要在加载器中添加shuffle=true,代码如下:trainloader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)Dropout有的时候,分类器中的节点可能会导致其他节点不能进行适当的训练,此外,节点可能会产生共同依赖,这就会导致过拟合。Dropout技术通过在每个训练步骤中使一些节点处于不活跃状态,来避免这一问题。这样一来,在每个训练阶段都使用不同的节点子集,从而减少过拟合。除了过拟合,我们一定要记住,学习率( learning rate )是最关键的超参数。如果学习率过大,模型的误差永远都不会降到最小;如果学习率过小,分类器将会训练的特别慢,因此,学习率不能过大也不能过小。一般来说,学习率可以是0.01,0.001,0.0001……,依此类推。最后,在最后一层选择正确的激活函数会对模型的正确率会产生特别大的影响。举个例子来说,如果我们使用 negative log likelihood loss(NLLLoss),那么,在最后一层中,建议使用LogSoftmax激活函数。结论理解模型的训练过程,将有助于创建能够概括的模型,在预测新图像类型时的准确度更高。在本文中,我们讨论了过拟合将会如何降低模型的概括能力,并学习了降低过拟合的方法。另外,我们也强调了学习率的重要性及其常用值。最后,我们知道,为最后一层选择正确的激活函数非常关键。现在,我们已经知道应该如何训练分类器,那么,我们就可以用它来预测以前从未见过的花型了!本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 20, 2018 · 1 min · jiezi