做谷歌推广的网站如何引流,如何提升网站百度权重,合肥网站建设 合肥网络推广,互联网app推广具体怎么做1. 题目#xff1a;
在本次比赛中#xff0c;您的目标是从数以万计的手写图像数据集中正确识别数字。
1.1. Goal 目标✨
本次比赛的目标是拍摄手写个位数的图像#xff0c;并确定该数字是什么。 对于测试集中的每个标签#xff0c;您都应该预测正确的标签。
本次比赛的…1. 题目
在本次比赛中您的目标是从数以万计的手写图像数据集中正确识别数字。
1.1. Goal 目标✨
本次比赛的目标是拍摄手写个位数的图像并确定该数字是什么。 对于测试集中的每个标签您都应该预测正确的标签。
本次比赛的评估标准是预测的分类准确性正确图像的百分比。
1.2. Dataset Description 数据集描述
数据文件 train.csv 和 test.csv 包含手绘图数字的灰度图像从 0 到 9。 每张图像高 28 像素宽 28 像素总共 784 像素。每个像素都有一个与之关联的像素值表示该像素的明暗数字越大表示越暗。此像素值是介于 0 和 255 之间的整数含 0 和 255。
2. 数据处理
2.1. python库
导入需要的库和包
# basic
import numpy as np
import pandas as pd# visuals
import matplotlib.pyplot as plt
import seaborn as sns# Scikit-learn
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix,ConfusionMatrixDisplay,classification_report# tensorflow
from keras.models import Sequential
from keras.layers import Conv2D,Dense,Flatten,MaxPooling2D,BatchNormalization,Dropout,SpatialDropout2D
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from keras.utils import to_categorical
from tensorflow.keras.callbacks import ReduceLROnPlateau,EarlyStopping2.2. 观察数据
train_df pd.read_csv(rD:\WorkSpace\Kaggle\DigitRecognizer\data\InputData\train.csv)
test_df pd.read_csv(rD:\WorkSpace\Kaggle\DigitRecognizer\data\InputData\test.csv)
print(train_df.shape)
print(test_df.shape)
print(train_df.head())
print(test_df.head())train数据是42000785test是28000784这还是我自参加kaggle以来接触过的最大的数据了通过784个特征列去预测一个标签值。有点挑战难度呀 像素点都是0和1取决于像素是黑色的还是白色的接着观察下去吧。 打印一下描述信息:
print(train_df.describe())
print(test_df.describe())train数据的标签值的平均值是4.45方差为2.884方差不是特别大最小值是0最大值是9其他特征列均为0是因为分母太大啦test数据也是一样的情况呀。 查看一下数据是否存在缺失值盲猜是不存在缺失值的因为都是图片呀只有所有的像素点都存在才能构成原始图片像素点还是要给全的吧。虽然不排除图像损失需要根据已有的像素点去猜测原始图像但这一题似乎并不考察这个点
print(train_df.isnull().sum())
print(test_df.isnull().sum())果然如我所料无论是train还是test的每一列都确实不存在缺失值。 数据不需要处理呀我们也基本了解train和test数据集啦。
3. 数据探索和数据分析EDA
3.1. 标签值分布
这个题是数字识别器那train训练集中的数字是如何分布的呢均匀还是不均匀还是需要观察一下。
sns.countplot(datatrain_df, xlabel, paletteicefire).set_title(train set Label Distribution)
plt.show()一共有0-9共十个数字train训练集中的这十个数字分布还是比较平均的让我们之后的预测会更加简单一些至少可以在之后的学习和理解数字背后的模式出现不平衡。
太好啦数字都是均匀分布撒花 这个配色好好看是“icefire”冰火色。
3.2. 数据可视化
3.2.1. 将数据调整为合适的图像️
看看数据集里面的这些数字是什么样子的吧。
首先先将训练集和测试集的标签和特征分开分别存储。然后将特征列数据的值重塑为适合卷积神经网络的形状。
在卷积神经网络中输入数据通常是一个四维张量其形状为[bath_sizeheightwidthchannels][每个训练批次的样本数量图像的高度图形的宽度图像的通道数]在处理图像数据时需要将其重塑为这种形状以便于在卷积神经网络中使用。
将train和test数据集的特征列都重塑为适合卷积神经网络的形状[-1,28,28,1]然后除以255这意味着每个样本都是一个28*28的灰度图像其中每个像素的值都在0道1之间。
然后绘制了一个2*5的图像网格绘制了在1-1000中随机选择的训练集图像每个图像都是它的标签。这些图像可以帮助我们可视化数据集中的图像以确保数据集被正确的加载和处理。
最后将所有子图都输出。
labels train_df.label
features_train train_df.drop(columnslabel)
features_test test_dffeatures_train features_train.values.reshape(-1, 28, 28, 1)
features_test features_test.values.reshape(-1, 28, 28, 1)features_train features_train / 255
features_test features_test / 255fig, axes plt.subplots(2, 5, figsize(10, 5))
for i in range(2):for j in range(5):idx np.random.randint(1, 1000)ax axes[i, j]ax.imshow(features_train[idx], cmapgray)ax.set_title(fLabel: {labels[idx]})ax.axis(off)
plt.show()很显然手写数字并不像印刷体那样规范比如“4”都不像一个数字再怎么说都像一个9。
在我随机选择的同时还存在许多非常不规范的图形比如“7”、“9”这两个手写形状还是比较难以辨认的要不是看Label标签我都不敢认这是“7”和“9” 3.3. 数据增强
其实我的代码中没有比较这一步但是我看到很多大佬都做了这一步恰好我也不知道就顺便学习一下。
数据增强是深度学习中的一种技术可以从已有的数据中获取更多的数据。数据增强通过对原始数据进行一系列的变换和修改生成新的训练样本从而扩展训练集的规模和多样性。常用的数据增强的方法包括镜像翻转、旋转、平移、剪裁、颜色变换等这些操作可以在不改变图像语义信息的情况下引入一些变化使模型具有更好的鲁棒性。
数据增强使用的好处降低数据采集和数据标记的成本通过赋予模型更多的多样性和灵活性来改进模型的泛化提高模型在预测中的准确性因为它使用更多的数据来训练模型减少数据的过拟合通过增加少数类中的样本的来处理数据集中的不平衡。
epochs 150
batch_size 256
test_size 0.1
optimizer keras.optimizers.Adam(learning_rate0.001)# 1.3 数据增强
X_train, X_val, y_train, y_val train_test_split(features_train, labels, test_sizetest_size, random_state42)
train_datagen ImageDataGenerator(rotation_range18,width_shift_range0.2,height_shift_range0.2,shear_range0.2,zoom_range0.2,horizontal_flipFalse,
)train_datagen.fit(X_train)train_generator train_datagen.flow(xX_train, yy_train,batch_sizebatch_size)这段代码使用ImageDataGenerator类来生成一个数据增强器数据增强器被定义为train_datagen其中使用了一些不同的参数来指定要应用的数据增强操作如旋转、平移、缩放等。train_datagen.fit(X_train)训练train数据集train_generator被定义为一个生成器它可以按批次生成增强后的训练数据
4. 构建深度学习模型
Keras是一个用Python编写的深度学习的API运行在机器学习平台Tensorflow之上它的目的是为了让开发者能够快速实验和享受愉快的开发体验。
4.1. 构建模型
首先导入Sequential类用于创建一个顺序模型即按照顺序添加各种层的神经网络的模型。
model.add(Conv2D(32,3,activation‘relu’,padding‘same’,input_shape(28,28,1)))这句代码表示向模型添加一个二维卷积层该层有32个卷积核每个卷积核的大小是33激活函数是“relu”填充方式是same即保持输入和输出的尺寸相同输入的形状是28,28,1即2828的灰度图像。
下一句代码相似只是不需要指定输入的形状因为模型可以自动推断出来。
model.add(MaxPooling2D(2))这句代码是添加一个最大池化层该层可以对输入的特征图进行下采样减少参数的数量提高模型的效率参数“2”表示池化串口的大小是2*2。
接下来是做两次几乎重复操作仅仅增加卷积核的数量最后一次向模型中添加一个Flatten层该层可以将多维的输入一维化方便后面连接全连接层。
model.add(Dense(512,activation‘relu’))model.add(Dropout(0.2))这两句代码向模型中添加一个全连接层该层有512个神经元激活函数是“relu”然后向模型中添加一个Dropout层。
model.add(Dense(10,activation‘softmax’))这句代码是向模型中添加一个全连接层该层有10个神经元激活函数是“softmax”用于输出10个类别的概率分布。
最后打印出模型的结构和参数数量。
这就是基本的机器学习中的神经网络训练。训练完这段代码后我迫切的像安装jupter notebook因为pycharm每次训练实在太花时间了。
model Sequential()model.add(Conv2D(32,3,activationrelu,paddingsame,input_shape(28,28,1)))
model.add(Conv2D(32,3, activation relu, padding same))
model.add(MaxPooling2D(2))model.add(Conv2D(64,3,activationrelu,paddingsame))
model.add(Conv2D(64,3, activation relu, padding same))
model.add(MaxPooling2D(2))model.add(Conv2D(128, 3, padding same, activation relu))
model.add(Conv2D(128, 3, padding same, activation relu))
model.add(Flatten())model.add(Dense(512,activationrelu))
model.add(Dropout(0.2))model.add(Dense(10,activationsoftmax))model.summary()打印模型的结构以及其各参数。

4.2. 定义回调函数
这段代码定义了两个回调函数
第一个是learning_rate_reduction用于验证集准确率停止提高时降低学习率。监控的指标是验证准确率如果在2个周期内没有提高就出发学习率衰减学习率衰减的因子是0.5学习率的最小值是0.00001学习率不能低于这个值。
第二个是early_stoping用于在验证集损失停止下降时提前结束训练。监控的指标是验证集损失如果在5个周期内没有下降就提前结束训练可以恢复最佳权重。
learning_rate_reduction ReduceLROnPlateau(monitor val_accuracy,patience2,factor0.5,min_lr 0.00001,verbose 1)early_stoping EarlyStopping(monitorval_loss,patience 5,restore_best_weightsTrue,verbose0)4.3. 编译训练模型
这段代码首先是编译一个神经网络模型选择“Adam”算法作为优化器用于更新模型的权重“分类交叉熵”作为损失函数用于衡量模型的预测和真是标签之间的差异评估指标选择“accuracy”准确率用于评估模型的性能。
然后就开始训练一个神经网络模型用训练数据和验证数据来更新模型的权重以提高模型的性能。
使用上面定义的两个函数作为回调函数每次训练的批量大小是10即每次使用10个样本来更新权重训练的总周期数是10即重复训练30次。
model.compile(optimizeradam,losscategorical_crossentropy,metrics[accuracy])digit model.fit(X_train,y_train,validation_data(X_val,y_val),callbacks[learning_rate_reduction,early_stoping],batch_size 10,epochs 30,verbose1)模型最多训练30次但是我们设定了提前停止的函数如果val_accuracy连续5次没有出现下降就停止模型训练时的精确度为0.9995。 4.4. 评估训练和验证数据的准确性和损失
分别使用evaluate函数对训练数据和测试数据进行评估以计算模型的性能指标。
loss,acc model.evaluate(X_train,y_train,batch_size 10, verbose 0)print(The accuracy of the model for training data is:,acc*100)
print(The Loss of the model for training data is:,loss)# Evaluvate for validation generator
loss,acc model.evaluate(X_val,y_val,batch_size 10, verbose 0)print(The accuracy of the model for validation data is:,acc*100)
print(The Loss of the model for validation data is:,loss)使用evaluate函数进行模型评估train数据集的精确度和损失度分别为99.833和0.00534test数据集的精确度和损失度分别为99.1369和0.40。 4.5. 绘制损失和准确率曲线图
将模型训练的历史记录转换为一个数据框包括训练集和验证集的损失和准确率。
error pd.DataFrame(digit.history)plt.figure(figsize(18,5),dpi200)
sns.set_style(darkgrid)plt.subplot(121)
plt.title(Cross Entropy Loss,fontsize15)
plt.xlabel(Epochs,fontsize12)
plt.ylabel(Loss,fontsize12)
plt.plot(error[loss])
plt.plot(error[val_loss])plt.subplot(122)
plt.title(Classification Accuracy,fontsize15)
plt.xlabel(Epochs,fontsize12)
plt.ylabel(Accuracy,fontsize12)
plt.plot(error[accuracy])
plt.plot(error[val_accuracy])plt.show()左边的那幅图是交叉熵损失降低的图右边是分类的精确度。前面的几轮训练交叉熵损失飞快降低分类精确度也对应增加这是因为前几轮训练会非常规范的数据的精确度随着训练的轮次增加模型训练精度逐渐放缓。 5. 数据预测
终于到预测啦
现在将预测和评估创建的测试数据集的标签。
batch_size表示每次预测的批量大小。
使用np.argmax函数从result的每一行中找出最大数值的下标返回一个一维数组。
result model.predict(X_test, batch_size 10,verbose 0)y_pred np.argmax(result, axis 1)5.1. 评估模型性能
评估测试数据的准确率用百分比表示然后打印测试数据的损失。
loss,acc model.evaluate(X_test,y_test, batch_size 10, verbose 0)print(The accuracy of the model for testing data is:,acc*100)
print(The Loss of the model for testing data is:,loss)测试集的精确度是98.869损失率是0.044. 5.2. 创建测试数据的分类报告
print(classification_report(y_true, y_pred,target_nameslabels))0-9这十个数字预测数据的精度都达到了98%以上训练结果很不错 5.3. 创建测试数据的混淆矩阵
混淆矩阵是一种用于评估分类模型性能的表格它显示了模型对每个类别的预测情况以及预测正确和错误的数量。
使用了confusion_matrix函数根据真实标签y_true和预测标签y_pred计算混淆矩阵。
混淆矩阵绘制为热力图使用seaborn库的heatmap完成。
confusion_mtx confusion_matrix(y_true,y_pred)sns.set_style(ticks)
f,ax plt.subplots(figsize (20,8),dpi200)
sns.heatmap(confusion_mtx, annotTrue, linewidths0.1, cmap gist_yarg_r, linecolorblack, fmt.0f, axax,cbarFalse, xticklabelslabels, yticklabelslabels)plt.xlabel(Predicted Label,fontsize10)
plt.ylabel(True Label,fontsize10)
plt.title(Confusion Matrix,fontsize13)plt.show()5.4. 预测测试数据
test_data reshape(test)# prediction
pred model.predict(test_data, batch_size 10,verbose 0)prediction np.argmax(pred, axis 1)submission pd.read_csv(D:\WorkSpace\Kaggle\DigitRecognizer\data\OutputData\sample_submission.csv)submission[Label] predictionsubmission.head()submission.to_csv(rD:\WorkSpace\Kaggle\DigitRecognizer\data\OutputData\predict.csv,indexFalse)打印一下需要提交数据的格式。 5.5. 提交数据
在kaggle上提交答案看一下能对多少。 公榜上是329名还是大佬的模型好啊。
这个题对于我来说很难深度学习我也没有学习过更多的是去参考了一些大佬的文章跑通了baseline也只是写文章记录下来。 前两天听讲座认识一个kaggle大佬参加kaggle竞赛拿了很多奖金今年秋招拿了一个25k的offer这是我努力的方向学习目标加油