准备工作

数据集介绍

数据文件 train.csv 和 test.csv 包含从零到九的手绘数字的灰度图像。

每张图像高 28 像素,宽 28 像素,总共 784 像素。每个像素都有一个与之关联的像素值,表示该像素的亮度或暗度,数字越大表示越暗。该像素值是介于 0 和 255 之间的整数,包括 0 和 255。

训练数据集 (train.csv) 有 785 列。第一列称为“标签”,是用户绘制的数字。其余列包含相关图像的像素值。

训练集中的每个像素列都有一个类似 pixelx 的名称,其中 x 是 0 到 783 之间的整数,包括 0 到 783。要在图像上定位该像素,假设我们已将 x 分解为 x = i * 28 + j,其中 i 和 j 是 0 到 27 之间的整数,包括 0 和 27。然后 pixelx 位于 28 x 28 矩阵的第 i 行和第 j 列(索引为零)。

例如,pixel31 表示左数第四列、上数第二行的像素,如下面的 ascii 图表所示。

从视觉上看,如果我们省略“像素”前缀,像素组成图像如下:

000 001 002 003 ... 026 027
028 029 030 031 ... 054 055
056 057 058 059 ... 082 083
| | | | ... | |
728 729 730 731 ... 754 755
756 757 758 759 ... 782 783

测试数据集 (test.csv) 与训练集相同,只是它不包含“标签”列。

您的提交文件应采用以下格式:对于测试集中的 28000 张图像中的每一张,输出一行包含 ImageId 和您预测的数字。例如,如果您预测第一张图像是 3,第二张图像是 7,第三张图像是 8,那么您的提交文件将如下所示:

000 001 002 003 ... 026 027
028 029 030 031 ... 054 055
056 057 058 059 ... 082 083
| | | | ... | |
728 729 730 731 ... 754 755
756 757 758 759 ... 782 783

本次比赛的评价指标是分类准确率,或者说测试图像被正确分类的比例。例如,0.97 的分类准确度表示您已正确分类除 3% 的图像之外的所有图像。

数据集下载:https://wwp.lanzoub.com/iIUFY08t575a

导入包

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

读取数据集

train = pd.read_csv('../input/digit-recognizer/train.csv')
test = pd.read_csv('../input/digit-recognizer/test.csv')

查看数据特征

train.head()
label pixel0 pixel1 pixel2 pixel3 pixel4 pixel5 pixel6 pixel7 pixel8 ... pixel774 pixel775 pixel776 pixel777 pixel778 pixel779 pixel780 pixel781 pixel782 pixel783
0 1 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2 1 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
3 4 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0

5 rows × 785 columns

train.info()

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 42000 entries, 0 to 41999

Columns: 785 entries, label to pixel783

dtypes: int64(785)

memory usage: 251.5 MB

train.isnull().sum()

label 0

pixel0 0

pixel1 0

pixel2 0

pixel3 0

..

pixel779 0

pixel780 0

pixel781 0

pixel782 0

pixel783 0

Length: 785, dtype: int64

sum(train.isnull().sum())

0

预处理训练集|测试集

#y_train 是数字标签
y_train = train['label'].copy()
#X_train 是各像素亮度值
X_train = train.drop('label',axis=1)
y_train.value_counts()

1 4684

7 4401

3 4351

9 4188

2 4177

6 4137

0 4132

4 4072

8 4063

5 3795

Name: label, dtype: int64

y_train = pd.get_dummies(y_train,prefix='Num')
y_train.head()
Num_0 Num_1 Num_2 Num_3 Num_4 Num_5 Num_6 Num_7 Num_8 Num_9
0 0 1 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0
2 0 1 0 0 0 0 0 0 0 0
3 0 0 0 0 1 0 0 0 0 0
4 1 0 0 0 0 0 0 0 0 0
#28×28一共784个像素,其中的数值表示亮度[0,255]
X_train.describe()
pixel0 pixel1 pixel2 pixel3 pixel4 pixel5 pixel6 pixel7 pixel8 pixel9 ... pixel774 pixel775 pixel776 pixel777 pixel778 pixel779 pixel780 pixel781 pixel782 pixel783
count 42000.0 42000.0 42000.0 42000.0 42000.0 42000.0 42000.0 42000.0 42000.0 42000.0 ... 42000.000000 42000.000000 42000.000000 42000.00000 42000.000000 42000.000000 42000.0 42000.0 42000.0 42000.0
mean 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.219286 0.117095 0.059024 0.02019 0.017238 0.002857 0.0 0.0 0.0 0.0
std 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 6.312890 4.633819 3.274488 1.75987 1.894498 0.414264 0.0 0.0 0.0 0.0
min 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.0 0.0 0.0 0.0
25% 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.0 0.0 0.0 0.0
50% 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.0 0.0 0.0 0.0
75% 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.0 0.0 0.0 0.0
max 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 254.000000 254.000000 253.000000 253.00000 254.000000 62.000000 0.0 0.0 0.0 0.0

8 rows × 784 columns

#from sklearn.preprocessing import Normalizer
X_train = X_train/255
X_train.head()
pixel0 pixel1 pixel2 pixel3 pixel4 pixel5 pixel6 pixel7 pixel8 pixel9 ... pixel774 pixel775 pixel776 pixel777 pixel778 pixel779 pixel780 pixel781 pixel782 pixel783
0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

5 rows × 784 columns

X_train.describe()
pixel0 pixel1 pixel2 pixel3 pixel4 pixel5 pixel6 pixel7 pixel8 pixel9 ... pixel774 pixel775 pixel776 pixel777 pixel778 pixel779 pixel780 pixel781 pixel782 pixel783
count 42000.0 42000.0 42000.0 42000.0 42000.0 42000.0 42000.0 42000.0 42000.0 42000.0 ... 42000.000000 42000.000000 42000.000000 42000.000000 42000.000000 42000.000000 42000.0 42000.0 42000.0 42000.0
mean 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.000860 0.000459 0.000231 0.000079 0.000068 0.000011 0.0 0.0 0.0 0.0
std 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.024756 0.018172 0.012841 0.006901 0.007429 0.001625 0.0 0.0 0.0 0.0
min 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.0 0.0 0.0
25% 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.0 0.0 0.0
50% 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.0 0.0 0.0
75% 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.0 0.0 0.0
max 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.996078 0.996078 0.992157 0.992157 0.996078 0.243137 0.0 0.0 0.0 0.0

8 rows × 784 columns

X_train = X_train.values.reshape(-1,28,28,1)
X_train

array([[[[0.],

[0.],

[0.],

...,

[0.],

[0.],

[0.]],

test.info()

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 28000 entries, 0 to 27999

Columns: 784 entries, pixel0 to pixel783

dtypes: int64(784)

memory usage: 167.5 MB

test.isnull().sum()

pixel0 0

pixel1 0

pixel2 0

pixel3 0

pixel4 0

..

pixel779 0

pixel780 0

pixel781 0

pixel782 0

pixel783 0

Length: 784, dtype: int64

sum(test.isnull().sum())

0

test = test/255
test.head()
pixel0 pixel1 pixel2 pixel3 pixel4 pixel5 pixel6 pixel7 pixel8 pixel9 ... pixel774 pixel775 pixel776 pixel777 pixel778 pixel779 pixel780 pixel781 pixel782 pixel783
0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

5 rows × 784 columns

test.describe()
pixel0 pixel1 pixel2 pixel3 pixel4 pixel5 pixel6 pixel7 pixel8 pixel9 ... pixel774 pixel775 pixel776 pixel777 pixel778 pixel779 pixel780 pixel781 pixel782 pixel783
count 28000.0 28000.0 28000.0 28000.0 28000.0 28000.0 28000.0 28000.0 28000.0 28000.0 ... 28000.000000 28000.000000 28000.000000 28000.000000 28000.000000 28000.0 28000.0 28000.0 28000.0 28000.0
mean 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.000646 0.000287 0.000110 0.000044 0.000026 0.0 0.0 0.0 0.0 0.0
std 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.021464 0.014184 0.007112 0.004726 0.003167 0.0 0.0 0.0 0.0 0.0
min 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.0 0.0 0.0 0.0
25% 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.0 0.0 0.0 0.0
50% 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.0 0.0 0.0 0.0
75% 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.0 0.0 0.0 0.0
max 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.992157 0.996078 0.756863 0.733333 0.466667 0.0 0.0 0.0 0.0 0.0

8 rows × 784 columns

test = test.values.reshape(-1,28,28,1)
test

array([[[[0.],

[0.],

[0.],

...,

[0.],

[0.],

[0.]],

训练CNN Model

import tensorflow as tf
tf.__version__

'2.6.4'

cnn = tf.keras.models.Sequential()

2022-08-01 05:41:16.816392: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1510] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 15403 MB memory: -> device: 0, name: Tesla P100-PCIE-16GB, pci bus id: 0000:00:04.0, compute capability: 6.0

#Convolution
cnn.add(tf.keras.layers.Conv2D(filters=256,kernel_size=(5,5),activation='relu',input_shape=(28,28,1)))
#Max Pooling
cnn.add(tf.keras.layers.MaxPool2D(pool_size=(3,3),strides=3))
cnn.add(tf.keras.layers.BatchNormalization())
cnn.add(tf.keras.layers.Conv2D(filters=128,kernel_size=(4,4),activation='relu'))
cnn.add(tf.keras.layers.MaxPool2D(pool_size=(2,2),strides=2))
#Flattening
cnn.add(tf.keras.layers.Flatten())
#Full connection
cnn.add(tf.keras.layers.Dense(units=256,activation='relu'))
#Output Layer
cnn.add(tf.keras.layers.Dense(units=10,activation='softmax'))
#Compile cnn
cnn.compile(optimizer='adam',loss='categorical_crossentropy')
# Epoch(时期):
# 当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一次>epoch。(也就是说,所有训练样本在神经网络中都 进行了一次正向传播 和一次反向传播 )
# 再通俗一点,一个Epoch就是将所有训练样本训练一次的过程。
# 然而,当一个Epoch的样本(也就是所有的训练样本)数量可能太过庞大(对于计算机而言),就需要把它分成多个小块,也就是就是分成多个Batch 来进行训练。** # Batch(批 / 一批样本):
# 将整个训练样本分成若干个Batch。 # Batch_Size(批大小):
# 每批样本的大小。 # Iteration(一次迭代):
# 训练一个Batch就是一次Iteration(这个概念跟程序语言中的迭代器相似)。 cnn.fit(X_train,y_train,batch_size=32,epochs=50)

2022-08-01 05:41:18.154328: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:185] None of the MLIR Optimization Passes are enabled (registered 2)

Epoch 1/50

2022-08-01 05:41:19.541340: I tensorflow/stream_executor/cuda/cuda_dnn.cc:369] Loaded cuDNN version 8005

1313/1313 [] - 13s 5ms/step - loss: 0.1159

Epoch 2/50

1313/1313 [] - 5s 4ms/step - loss: 0.0496

Epoch 3/50

1313/1313 [] - 6s 4ms/step - loss: 0.0367

Epoch 4/50

1313/1313 [] - 5s 4ms/step - loss: 0.0289

Epoch 5/50

1313/1313 [] - 6s 4ms/step - loss: 0.0256

Epoch 6/50

1313/1313 [] - 5s 4ms/step - loss: 0.0220

Epoch 7/50

1313/1313 [] - 6s 4ms/step - loss: 0.0192

Epoch 8/50

1313/1313 [] - 5s 4ms/step - loss: 0.0167

Epoch 9/50

1313/1313 [] - 6s 4ms/step - loss: 0.0146

Epoch 10/50

1313/1313 [] - 5s 4ms/step - loss: 0.0121

Epoch 11/50

1313/1313 [] - 6s 4ms/step - loss: 0.0133

Epoch 12/50

1313/1313 [] - 5s 4ms/step - loss: 0.0142

Epoch 13/50

1313/1313 [] - 6s 4ms/step - loss: 0.0119

Epoch 14/50

1313/1313 [] - 6s 4ms/step - loss: 0.0125

Epoch 15/50

1313/1313 [] - 6s 4ms/step - loss: 0.0103

Epoch 16/50

1313/1313 [] - 6s 4ms/step - loss: 0.0103

Epoch 17/50

1313/1313 [] - 6s 4ms/step - loss: 0.0130

Epoch 18/50

1313/1313 [] - 6s 4ms/step - loss: 0.0118

Epoch 19/50

1313/1313 [] - 6s 4ms/step - loss: 0.0093

Epoch 20/50

1313/1313 [] - 6s 4ms/step - loss: 0.0075

Epoch 21/50

1313/1313 [] - 6s 4ms/step - loss: 0.0075

Epoch 22/50

1313/1313 [] - 6s 5ms/step - loss: 0.0129

Epoch 23/50

1313/1313 [] - 6s 4ms/step - loss: 0.0105

Epoch 24/50

1313/1313 [] - 6s 4ms/step - loss: 0.0087

Epoch 25/50

1313/1313 [] - 6s 4ms/step - loss: 0.0097

Epoch 26/50

1313/1313 [] - 6s 4ms/step - loss: 0.0117

Epoch 27/50

1313/1313 [] - 5s 4ms/step - loss: 0.0051

Epoch 28/50

1313/1313 [] - 6s 5ms/step - loss: 0.0086

Epoch 29/50

1313/1313 [] - 6s 4ms/step - loss: 0.0100

Epoch 30/50

1313/1313 [] - 6s 4ms/step - loss: 0.0087

Epoch 31/50

1313/1313 [] - 6s 4ms/step - loss: 0.0096

Epoch 32/50

1313/1313 [] - 6s 4ms/step - loss: 0.0065

Epoch 33/50

1313/1313 [] - 5s 4ms/step - loss: 0.0082

Epoch 34/50

1313/1313 [] - 6s 4ms/step - loss: 0.0110

Epoch 35/50

1313/1313 [] - 6s 4ms/step - loss: 0.0063

Epoch 36/50

1313/1313 [] - 6s 4ms/step - loss: 0.0107

Epoch 37/50

1313/1313 [] - 5s 4ms/step - loss: 0.0048

Epoch 38/50

1313/1313 [] - 6s 4ms/step - loss: 0.0076

Epoch 39/50

1313/1313 [] - 5s 4ms/step - loss: 0.0154

Epoch 40/50

1313/1313 [] - 6s 4ms/step - loss: 0.0095

Epoch 41/50

1313/1313 [] - 5s 4ms/step - loss: 0.0052

Epoch 42/50

1313/1313 [] - 6s 4ms/step - loss: 0.0057

Epoch 43/50

1313/1313 [] - 5s 4ms/step - loss: 0.0080

Epoch 44/50

1313/1313 [] - 6s 4ms/step - loss: 0.0085

Epoch 45/50

1313/1313 [] - 5s 4ms/step - loss: 0.0108

Epoch 46/50

1313/1313 [] - 6s 4ms/step - loss: 0.0062

Epoch 47/50

1313/1313 [] - 5s 4ms/step - loss: 0.0118

Epoch 48/50

1313/1313 [] - 6s 4ms/step - loss: 0.0078

Epoch 49/50

1313/1313 [] - 5s 4ms/step - loss: 0.0083

Epoch 50/50

1313/1313 [] - 6s 4ms/step - loss: 0.0044

<keras.callbacks.History at 0x7f35f40ac710>

pred = cnn.predict(test)
pred = np.argmax(pred,axis=1)
pred

array([2, 0, 9, ..., 3, 9, 2])

pred = pd.DataFrame(pred,columns=['Label'])
test_id = list(range(1,len(test)+1,1))
test_id = pd.DataFrame(test_id,columns=['ImageId'])
submission = pd.concat([test_id,pred],axis=1)
submission.describe()
ImageId Label
count 28000.000000 28000.000000
mean 14000.500000 4.453036
std 8083.048105 2.896665
min 1.000000 0.000000
25% 7000.750000 2.000000
50% 14000.500000 4.000000
75% 21000.250000 7.000000
max 28000.000000 9.000000

原创作者:孤飞-博客园

原文地址:https://www.cnblogs.com/ranxi169/p/16540166.html

jupyter格式代码查看|下载https://www.kaggle.com/code/ranxi169/digit-recognizer-with-cnn-for-beginner/notebook

适合初学者的使用CNN的数字图像识别项目:Digit Recognizer with CNN for beginner的更多相关文章

  1. 【深度学习系列】手写数字识别卷积神经--卷积神经网络CNN原理详解(一)

    上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...

  2. 推荐10个适合初学者的 HTML5 入门教程

    HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...

  3. [C#] Timer + Graphics To Get Simple Animation (简单的源码例子,适合初学者)

    >_<" 这是一个非常简单的利用C#的窗口工程创立的程序,用来做一个简单的动画,涉及Timer和Graphics,适合初学者,高手略过~

  4. 5、WPF实现简单计算器-非常适合初学者练习

    Sample Calculator 这是微软社区WPF的一个示例,在源程序的基础上我进行了一点点修改,非常适合初学者练习,详细代码解释. 源程序的下载地址 http://code.msdn.micro ...

  5. 使用ImageMagick和Tesseract进行简单数字图像识别

    使用ImageMagick和Tesseract进行简单数字图像识别 由于直接使用 tesseract 进行识别,识别率很低, ImageMagick 安装.配置及使用: 平台:winXP 1. 安装I ...

  6. 强烈推荐visual c++ 2012入门经典适合初学者入门

    强烈推荐visual c++ 2012入门经典适合初学者入门 此书循序渐进,用其独特.易于理解的教程风格来介绍各个主题,无论是编程新手,还是经验丰富的编程人员,都很容易理解. 此书的目录基本覆盖了Wi ...

  7. Linux内核开发进阶书籍推荐(不适合初学者)

    Linux内核开发进阶书籍推荐(不适合初学者) 很早之前就想写一篇文章总结一下Linux Kernel开发的相关资料,项目的原因,再加上家里的一些事情,一直没能找到闲暇,今天终于有些时间,希望可以完成 ...

  8. 适合初学者的python实际例子

    最近在github上发现了一个有意思的项目,很适合初学者学习python代码. 学习一门语言刚开始的时候是很枯燥的,各种概念语法以及无聊的打印都会让人失去更进一步学习的动力. 很多同学在学习了一段时间 ...

  9. 7-OKHttp使用详解,步骤挺详细的,适合初学者使用!

    OKHttp使用详解,步骤挺详细的,适合初学者使用! 一,OKHttp介绍 okhttp是一个第三方类库,用于android中请求网络. 这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Squ ...

随机推荐

  1. docker 1.1 介绍和安装

    1.docker是什么? Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现 ...

  2. mysql5.7介绍和安装

    环境准备: 1.关闭防火墙和selinux systemctl stop firewalldsystemctl stop SElinux 2. 如果安装过mariadb需要停止且卸载服务 system ...

  3. mysql Bad handshake

    由于 Java 程序访问 MySQL 时,MySQL 抛出 Bad handshake 错误,导致接口抛错,然后在 MySQL 配置文件新增 skip_ssl 配置(忽略 SSL 密钥和证书文件),重 ...

  4. 好客租房43-react组件基础综合案例-4获取评论信息

    获取评论信息 1使用受控组件方式创建表单 //导入react import React from 'react' import ReactDOM from 'react-dom' //导入组件 // ...

  5. SpringBoot+Mybatis-Plus整合Sharding-JDBC5.1.1实现单库分表【全网最新】

    一.前言 小编最近一直在研究关于分库分表的东西,前几天docker安装了mycat实现了分库分表,但是都在说mycat的bug很多.很多人还是倾向于shardingsphere,其实他是一个全家桶,有 ...

  6. Pycharm连接远程服务器并保持文件夹同步

    pycharm版本2021 服务器版本 Ubuntu 18 1.连接远程服务器 xxx这部省略了,因为之前就已经连接上了hh,后面用到再补充. 2.保持文件夹同步 1.首先在本地(windows环境创 ...

  7. Vue出现Component template should ...

    当运行vue出现错误Component template should contain exactly one root element. If you ...的时候,我们只需要将<templa ...

  8. ES6 - promise(2)

    从上一篇中我们知道promise的概念,上一篇也提到了 promise的过程: 启动异步任务 => 返回promise对象 =>给promise对象绑定回调函数(甚至可以在异步任务结束后指 ...

  9. Python3 collections模块

    https://www.cnblogs.com/zhangxinqi/p/7921941.html http://www.wjhsh.net/meng-wei-zhi-p-8259022.html h ...

  10. 线程安全性-原子性之Atomic包

    先了解什么是线程安全性:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称为这个类是线程 ...