当前位置: 首页 > article >正文

25、深度学习-自学之路-卷积神经网络基于MNIST数据集的程序展示

import keras #添加Kerasku

import sys,numpy as np  

from keras.utils import np_utils

import os

from keras.datasets import mnist
print("licheng:"+"20"+'\n')
np.random.seed(1)

(x_train,y_train),(x_test,y_test) = mnist.load_data()   #第一次进行Mnist 数据的下载
images,labels = (x_train[0:1000].reshape(1000,28*28)/255,y_train[0:1000])  #将图片信息和图片标识信息赋值给images 和labels
'''
print("x_train[0:1000]"+str(x_train[0:1000]))
print("x_train[0:1000].reshape(1000,28*28)"+str(x_train[0:1000].reshape(1000,28*28)))#是一个全零的矩阵
print("images:"+str(images))#感觉是一个10*100的矩阵。
print("labels"+str(labels))#0-10的杂乱的数字
'''
one_hot_lables = np.zeros((len(labels),10))#创建一个1000行,10列的全零矩阵
#print("one_hot_lables"+str(one_hot_lables))#

for i,l in enumerate(labels):
    one_hot_lables[i][l] =1;
labels = one_hot_lables

test_images = x_test.reshape(len(x_test),28*28)/256
test_lables = np.zeros((len(y_test),10))
for i,l in enumerate(y_test):
    test_lables[i][l] = 1



def tanh(x):
    return np.tanh(x)

def tanh2deriv(output):
    return 1-(output**2)

def softmax(x):
    temp = np.exp(x)
    return temp/np.sum(temp,axis=1,keepdims=True)

#relu = lambda x:(x>=0)*x
#relu2deriv = lambda x:x>=0


alpha,iterations = (2,300)
#hidden_size,
pixels_per_image,num_labels = (784,10)
batch_size = 128

input_rows = 28
input_cols = 28

kernel_rows = 3
kernel_cols = 3
num_kernels = 16

hidden_size = ((input_rows - kernel_rows)*(input_cols - kernel_cols))*num_kernels

kernels = 0.02*np.random.random((kernel_rows*kernel_cols,num_kernels)) -0.01
weight_1_2 = 0.2*np.random.random((hidden_size,num_labels)) - 0.1

def get_image_section(layer,row_from,row_to,col_from,col_to):
    section = layer[:,row_from:row_to,col_from:col_to]
    return section.reshape(-1,1,row_to-row_from,col_to-col_from)

for j in range(iterations):#一共循环350次
    error,correct_cnt = (0.0,0)
    for i in range(int(len(images)/batch_size)):  #有多少个图片就有多少个循环,
    #for i in range(1):
        batch_start,batch_end = ((i*batch_size),((i+1)*batch_size))
        #batch_start, batch_end = (0, 1)
        layer_0 = images[batch_start:batch_end]   #每一张图片解析出来的对应的像素点的单列矩阵或者是单行

        layer_0 = layer_0.reshape(layer_0.shape[0],28,28)
        #把layer_0重塑成一个三维数组,1,28,28
        #print("layer_0.shape"+str(np.shape(layer_0)))
        #print("layer_0"+str("   ")+str(layer_0))
        #layer_0.shape
        sects = list()
        #print("layer_0.shape[1]" +str(layer_0.shape[1]))
        #print("layer_0.shape[2]" + str(layer_0.shape[2]))
        for row_start in range(layer_0.shape[1] - kernel_rows):
            for col_start in range(layer_0.shape[2]-kernel_cols):
                sect = get_image_section(layer_0,
                                         row_start,
                                         row_start+kernel_rows,
                                         col_start,
                                         col_start+kernel_cols)
                #if row_start == 0:
                    #print("sect" +str("   ")+str(sect))
                sects.append(sect)#将数据打散成3*3的小数据,然后组合在一起。一行可以转化成25个小的3*3
        #print("sect" +str("   ")+str(sect))
        expanded_input = np.concatenate(sects,axis =1)
        #print("expanded_input" + str("   ") + str(expanded_input))
        es = expanded_input.shape   #输出为:es   (1, 625, 3, 3)
        #print("es" + str("   ") + str(es))
        #print("es[0]" + str("   ") + str(es[0]))
        #print("es[1]" + str("   ") + str(es[1]))
        flattened_input = expanded_input.reshape(es[0]*es[1],-1) #输出为:flattened_input.shape   (625, 9)
        #print("flattened_input.shape" + str("   ") + str(np.shape(flattened_input)))
        kernel_output = flattened_input.dot(kernels)#输出为:kernel_output.shape   (625, 16)
        #print("kernel_output" + str("   ") + str(kernel_output))
        #print("kernel_output.shape" + str("   ") + str(np.shape(kernel_output)))
        #print("layer_0:"+str(layer_0))

        #layer_1 = relu(np.dot(layer_0,weight_0_1))#对二层神经网络的数据进行rule处理。小于0的数字都为0,大于0的数字都是本身。
        layer_1 = tanh(kernel_output.reshape(es[0],-1))
        #print("layer_1.shape" + str("   ") + str(np.shape(layer_1)))#layer_1.shape   (1, 10000)

        dropout_mask = np.random.randint(2,size=layer_1.shape)

        layer_1 *= dropout_mask*2

        #layer_2 = np.dot(layer_1,weight_1_2)#将第二层神经网络的值和第二层的权重加权和得到输出数据。
        layer_2 = softmax(np.dot(layer_1,weight_1_2))

        #error += np.sum((labels[batch_start:batch_end] - layer_2)**2)#把每一张图片的误差值进行累加
        for k in range(batch_size):
            labelset = labels[batch_start+k:batch_start+k+1]
            _inc = int(np.argmax(layer_2[k:k+1])== \
                               np.argmax(labelset))#把每次预测成功率进行累加。
            correct_cnt +=_inc

        #layer_2_delta = np.full((100,10),(np.sum(labels[batch_start:batch_end]-layer_2))/batch_size)
        #print(layer_2.shape)

        layer_2_delta = (labels[batch_start:batch_end]-layer_2)\
                        /(batch_size * layer_2.shape[0])#计算权重反向误差第二层

        #layer_2_delta = (labels[batch_start:batch_end]-layer_2)        #计算权重反向误差第二层
        layer_1_delta = layer_2_delta.dot(weight_1_2.T)*tanh2deriv(layer_1)#第一层权重误差
        layer_1_delta *= dropout_mask

        weight_1_2 += alpha *layer_1.T.dot(layer_2_delta)#修改第一层权重
        l1d_reshape = layer_1_delta.reshape(kernel_output.shape)
        k_update = flattened_input.T.dot(l1d_reshape)
        kernels -= alpha*k_update

        #weight_0_1 += alpha *layer_0.T.dot(layer_1_delta)#修改第二层权重
    text_correct_cnt = 0
    #sys.stdout.write("\r"+"I:"+str(j)+"error"+str(error/float(len(images)))[0:5] + "correct"+str(correct/float(len(images))))
    #验证测试组的数字被预测出来的概率。
#for j in range(10):
#    if(j%10 == 0 or j == iterations-1):
#        error,correct = (0.0,0)
    for i in range(len(test_images)):
        layer_0 = test_images[i:i+1]
        layer_0 = layer_0.reshape(layer_0.shape[0],28,28)
        layer_0.shape
        sects =  list()

        for row_start in range(layer_0.shape[1] - kernel_rows):
            for col_start in range(layer_0.shape[2] - kernel_cols):
                sect = get_image_section(layer_0,
                                         row_start,
                                         row_start+kernel_rows,
                                         col_start,
                                         col_start+kernel_cols)
                sects.append(sect)  
        expanded_input = np.concatenate(sects,axis =1)
        es = expanded_input.shape
        flattened_input = expanded_input.reshape(es[0]*es[1],-1)

        kernel_output = flattened_input.dot(kernels)

        layer_1 = tanh(kernel_output.reshape(es[0],-1))
        layer_2 = np.dot(layer_1,weight_1_2)

            #error += np.sum((test_lables[i:i+1]-layer_2)**2)
        text_correct_cnt += int(np.argmax(layer_2)==np.argmax(test_lables[i:i+1]))
    if(j % 1 == 0):    
        print("\n"+"j"+str(j))
        sys.stdout.write("test-acc:"+str(text_correct_cnt/float(len(test_images))) + \
                 "train-acc:"+str(correct_cnt/float(len(images))))
        print()
#训练结果
'''
licheng:20


j0
test-acc:0.0288train-acc:0.055

j1
test-acc:0.0273train-acc:0.037

j2
test-acc:0.028train-acc:0.037

j3
test-acc:0.0292train-acc:0.04

j4
test-acc:0.0339train-acc:0.046

j5
test-acc:0.0478train-acc:0.068

j6
test-acc:0.0758train-acc:0.083

j7
test-acc:0.1316train-acc:0.096

j8
test-acc:0.2138train-acc:0.127

j9
test-acc:0.2942train-acc:0.148

j10
test-acc:0.3563train-acc:0.181

j11
test-acc:0.4023train-acc:0.209

j12
test-acc:0.4359train-acc:0.238

j13
test-acc:0.4472train-acc:0.286

j14
test-acc:0.4389train-acc:0.274

j15
test-acc:0.3951train-acc:0.257

j16
test-acc:0.2222train-acc:0.243

j17
test-acc:0.0613train-acc:0.112

j18
test-acc:0.0266train-acc:0.035

j19
test-acc:0.0127train-acc:0.026

j20
test-acc:0.0133train-acc:0.022

j21
test-acc:0.0185train-acc:0.038

j22
test-acc:0.0363train-acc:0.038

j23
test-acc:0.0929train-acc:0.067

j24
test-acc:0.1994train-acc:0.081

j25
test-acc:0.3085train-acc:0.154

j26
test-acc:0.4275train-acc:0.204

j27
test-acc:0.5324train-acc:0.256

j28
test-acc:0.5917train-acc:0.305

j29
test-acc:0.6323train-acc:0.341

j30
test-acc:0.6607train-acc:0.426

j31
test-acc:0.6815train-acc:0.439

j32
test-acc:0.7048train-acc:0.462

j33
test-acc:0.717train-acc:0.484

j34
test-acc:0.7313train-acc:0.505

j35
test-acc:0.7355train-acc:0.53

j36
test-acc:0.7417train-acc:0.548

j37
test-acc:0.747train-acc:0.534

j38
test-acc:0.7492train-acc:0.55

j39
test-acc:0.7459train-acc:0.562

j40
test-acc:0.7352train-acc:0.54

j41
test-acc:0.708train-acc:0.496

j42
test-acc:0.6486train-acc:0.456

j43
test-acc:0.5212train-acc:0.353

j44
test-acc:0.3312train-acc:0.234

j45
test-acc:0.2055train-acc:0.174

j46
test-acc:0.2162train-acc:0.136

j47
test-acc:0.2694train-acc:0.171

j48
test-acc:0.3255train-acc:0.172

j49
test-acc:0.361train-acc:0.186

j50
test-acc:0.4221train-acc:0.21

j51
test-acc:0.5172train-acc:0.223

j52
test-acc:0.6008train-acc:0.262

j53
test-acc:0.6478train-acc:0.308

j54
test-acc:0.6763train-acc:0.363

j55
test-acc:0.696train-acc:0.402

j56
test-acc:0.7079train-acc:0.434

j57
test-acc:0.7209train-acc:0.441

j58
test-acc:0.7304train-acc:0.475

j59
test-acc:0.7358train-acc:0.475

j60
test-acc:0.7405train-acc:0.525

j61
test-acc:0.7499train-acc:0.517

j62
test-acc:0.7534train-acc:0.517

j63
test-acc:0.7608train-acc:0.538

j64
test-acc:0.7646train-acc:0.554

j65
test-acc:0.7726train-acc:0.57

j66
test-acc:0.779train-acc:0.586

j67
test-acc:0.7854train-acc:0.595

j68
test-acc:0.7853train-acc:0.591

j69
test-acc:0.7927train-acc:0.605

j70
test-acc:0.7975train-acc:0.64

j71
test-acc:0.8013train-acc:0.621

j72
test-acc:0.8028train-acc:0.626

j73
test-acc:0.8095train-acc:0.631

j74
test-acc:0.8099train-acc:0.638

j75
test-acc:0.8157train-acc:0.661

j76
test-acc:0.8155train-acc:0.639

j77
test-acc:0.8183train-acc:0.65

j78
test-acc:0.8217train-acc:0.67

j79
test-acc:0.8247train-acc:0.675

j80
test-acc:0.8237train-acc:0.666

j81
test-acc:0.8269train-acc:0.673

j82
test-acc:0.8273train-acc:0.704

j83
test-acc:0.8313train-acc:0.674

j84
test-acc:0.8293train-acc:0.686

j85
test-acc:0.8333train-acc:0.699

j86
test-acc:0.8358train-acc:0.694

j87
test-acc:0.8375train-acc:0.704

j88
test-acc:0.837train-acc:0.697

j89
test-acc:0.8398train-acc:0.704

j90
test-acc:0.8396train-acc:0.687

j91
test-acc:0.8436train-acc:0.705

j92
test-acc:0.8436train-acc:0.711

j93
test-acc:0.8447train-acc:0.721

j94
test-acc:0.845train-acc:0.719

j95
test-acc:0.8471train-acc:0.724

j96
test-acc:0.8478train-acc:0.726

j97
test-acc:0.848train-acc:0.718

j98
test-acc:0.8495train-acc:0.719

j99
test-acc:0.85train-acc:0.73

j100
test-acc:0.8513train-acc:0.737

j101
test-acc:0.8504train-acc:0.73

j102
test-acc:0.8506train-acc:0.717

j103
test-acc:0.8528train-acc:0.74

j104
test-acc:0.8531train-acc:0.733

j105
test-acc:0.8538train-acc:0.73

j106
test-acc:0.8568train-acc:0.721

j107
test-acc:0.857train-acc:0.75

j108
test-acc:0.8558train-acc:0.731

j109
test-acc:0.8578train-acc:0.744

j110
test-acc:0.8589train-acc:0.754

j111
test-acc:0.8578train-acc:0.732

j112
test-acc:0.8583train-acc:0.747

j113
test-acc:0.859train-acc:0.747

j114
test-acc:0.8597train-acc:0.751

j115
test-acc:0.8602train-acc:0.74

j116
test-acc:0.8601train-acc:0.753

j117
test-acc:0.8588train-acc:0.746

j118
test-acc:0.8611train-acc:0.741

j119
test-acc:0.8616train-acc:0.731

j120
test-acc:0.8632train-acc:0.753

j121
test-acc:0.8611train-acc:0.743

j122
test-acc:0.8629train-acc:0.752

j123
test-acc:0.8647train-acc:0.76

j124
test-acc:0.8651train-acc:0.766

j125
test-acc:0.8659train-acc:0.752

j126
test-acc:0.868train-acc:0.756

j127
test-acc:0.8649train-acc:0.767

j128
test-acc:0.8661train-acc:0.747

j129
test-acc:0.8669train-acc:0.753

j130
test-acc:0.8695train-acc:0.753

j131
test-acc:0.8691train-acc:0.76

j132
test-acc:0.866train-acc:0.756

j133
test-acc:0.8668train-acc:0.769

j134
test-acc:0.8691train-acc:0.77

j135
test-acc:0.8681train-acc:0.757

j136
test-acc:0.8702train-acc:0.77

j137
test-acc:0.8705train-acc:0.77

j138
test-acc:0.8685train-acc:0.768

j139
test-acc:0.8664train-acc:0.774

j140
test-acc:0.8668train-acc:0.756

j141
test-acc:0.8704train-acc:0.783

j142
test-acc:0.8702train-acc:0.775

j143
test-acc:0.8728train-acc:0.769

j144
test-acc:0.8725train-acc:0.776

j145
test-acc:0.8721train-acc:0.772

j146
test-acc:0.8717train-acc:0.765

j147
test-acc:0.8747train-acc:0.777

j148
test-acc:0.8746train-acc:0.77

j149
test-acc:0.8735train-acc:0.778

j150
test-acc:0.8733train-acc:0.785

j151
test-acc:0.8732train-acc:0.76

j152
test-acc:0.8724train-acc:0.779

j153
test-acc:0.8755train-acc:0.772

j154
test-acc:0.8728train-acc:0.773

j155
test-acc:0.8755train-acc:0.784

j156
test-acc:0.8731train-acc:0.774

j157
test-acc:0.8743train-acc:0.782

j158
test-acc:0.8762train-acc:0.772

j159
test-acc:0.8755train-acc:0.79

j160
test-acc:0.8751train-acc:0.774

j161
test-acc:0.8749train-acc:0.782

j162
test-acc:0.8744train-acc:0.78

j163
test-acc:0.8766train-acc:0.782

j164
test-acc:0.874train-acc:0.796

j165
test-acc:0.8754train-acc:0.798

j166
test-acc:0.8766train-acc:0.794

j167
test-acc:0.8747train-acc:0.784

j168
test-acc:0.8768train-acc:0.796

j169
test-acc:0.8757train-acc:0.789

j170
test-acc:0.8767train-acc:0.79

j171
test-acc:0.8732train-acc:0.791

j172
test-acc:0.8766train-acc:0.797

j173
test-acc:0.8773train-acc:0.789

j174
test-acc:0.8778train-acc:0.781

j175
test-acc:0.8758train-acc:0.799

j176
test-acc:0.8774train-acc:0.785

j177
test-acc:0.8766train-acc:0.796

j178
test-acc:0.8784train-acc:0.803

j179
test-acc:0.8788train-acc:0.794

j180
test-acc:0.8779train-acc:0.794

j181
test-acc:0.8779train-acc:0.8

j182
test-acc:0.8786train-acc:0.791

j183
test-acc:0.8778train-acc:0.787

j184
test-acc:0.8768train-acc:0.781

j185
test-acc:0.8765train-acc:0.786

j186
test-acc:0.8764train-acc:0.793

j187
test-acc:0.8788train-acc:0.796

j188
test-acc:0.8792train-acc:0.789

j189
test-acc:0.8764train-acc:0.79

j190
test-acc:0.8774train-acc:0.787

j191
test-acc:0.8766train-acc:0.782

j192
test-acc:0.8802train-acc:0.798

j193
test-acc:0.8783train-acc:0.789

j194
test-acc:0.8797train-acc:0.785

j195
test-acc:0.8792train-acc:0.807

j196
test-acc:0.878train-acc:0.796

j197
test-acc:0.8785train-acc:0.801

j198
test-acc:0.8777train-acc:0.81

j199
test-acc:0.8772train-acc:0.784

j200
test-acc:0.8777train-acc:0.792

j201
test-acc:0.8784train-acc:0.794

j202
test-acc:0.8788train-acc:0.795

j203
test-acc:0.8802train-acc:0.781

j204
test-acc:0.8798train-acc:0.804

j205
test-acc:0.878train-acc:0.779

j206
test-acc:0.8788train-acc:0.792

j207
test-acc:0.8763train-acc:0.793

j208
test-acc:0.8794train-acc:0.792

j209
test-acc:0.8798train-acc:0.803

j210
test-acc:0.8788train-acc:0.804

j211
test-acc:0.8792train-acc:0.797

j212
test-acc:0.8764train-acc:0.791

j213
test-acc:0.88train-acc:0.801

j214
test-acc:0.8812train-acc:0.799

j215
test-acc:0.8806train-acc:0.79

j216
test-acc:0.88train-acc:0.8

j217
test-acc:0.8804train-acc:0.802

j218
test-acc:0.8786train-acc:0.807

j219
test-acc:0.8819train-acc:0.797

j220
test-acc:0.8795train-acc:0.799

j221
test-acc:0.8789train-acc:0.815

j222
test-acc:0.879train-acc:0.816
j223
test-acc:0.8793train-acc:0.809
j224
test-acc:0.8814train-acc:0.795
j225
test-acc:0.8796train-acc:0.799
j226
test-acc:0.8805train-acc:0.806
j227
test-acc:0.8803train-acc:0.808
j228
test-acc:0.8782train-acc:0.801
j229
test-acc:0.8803train-acc:0.814

j230
test-acc:0.8808train-acc:0.8

j231
test-acc:0.8808train-acc:0.798

j232
test-acc:0.8808train-acc:0.82

j233
test-acc:0.8794train-acc:0.794

j234
test-acc:0.8809train-acc:0.806

j235
test-acc:0.8807train-acc:0.808

j236
test-acc:0.8789train-acc:0.802

j237
test-acc:0.8796train-acc:0.81

j238
test-acc:0.8768train-acc:0.805

j239
test-acc:0.8781train-acc:0.792

j240
test-acc:0.8786train-acc:0.809

j241
test-acc:0.8761train-acc:0.802

j242
test-acc:0.8775train-acc:0.811

j243
test-acc:0.8806train-acc:0.814

j244
test-acc:0.8795train-acc:0.804

j245
test-acc:0.8787train-acc:0.801

j246
test-acc:0.8776train-acc:0.795

j247
test-acc:0.8785train-acc:0.808

j248
test-acc:0.8788train-acc:0.803

j249
test-acc:0.8776train-acc:0.813

j250
test-acc:0.879train-acc:0.808

j251
test-acc:0.8788train-acc:0.803

j252
test-acc:0.8791train-acc:0.812

j253
test-acc:0.8793train-acc:0.804

j254
test-acc:0.8779train-acc:0.815

j255
test-acc:0.8798train-acc:0.811

j256
test-acc:0.8798train-acc:0.806

j257
test-acc:0.8801train-acc:0.803

j258
test-acc:0.8779train-acc:0.795

j259
test-acc:0.8799train-acc:0.803

j260
test-acc:0.8801train-acc:0.805

j261
test-acc:0.8788train-acc:0.807

j262
test-acc:0.8786train-acc:0.804

j263
test-acc:0.8792train-acc:0.806

j264
test-acc:0.8779train-acc:0.796

j265
test-acc:0.8785train-acc:0.821

j266
test-acc:0.8794train-acc:0.81

j267
test-acc:0.8784train-acc:0.816

j268
test-acc:0.8777train-acc:0.812

j269
test-acc:0.8792train-acc:0.812

j270
test-acc:0.8779train-acc:0.813

j271
test-acc:0.8782train-acc:0.82

j272
test-acc:0.8791train-acc:0.821

j273
test-acc:0.878train-acc:0.823

j274
test-acc:0.8788train-acc:0.816

j275
test-acc:0.8794train-acc:0.82

j276
test-acc:0.8779train-acc:0.829

j277
test-acc:0.8794train-acc:0.809

j278
test-acc:0.8751train-acc:0.806

j279
test-acc:0.8796train-acc:0.813

j280
test-acc:0.88train-acc:0.816

j281
test-acc:0.8797train-acc:0.819

j282
test-acc:0.8805train-acc:0.809

j283
test-acc:0.8804train-acc:0.811

j284
test-acc:0.8779train-acc:0.808

j285
test-acc:0.8818train-acc:0.82

j286
test-acc:0.8791train-acc:0.822

j287
test-acc:0.8792train-acc:0.817

j288
test-acc:0.877train-acc:0.814

j289
test-acc:0.8785train-acc:0.807

j290
test-acc:0.8781train-acc:0.817

j291
test-acc:0.8795train-acc:0.82

j292
test-acc:0.8803train-acc:0.824

j293
test-acc:0.8779train-acc:0.812

j294
test-acc:0.8784train-acc:0.816

j295
test-acc:0.8771train-acc:0.817

j296
test-acc:0.877train-acc:0.826

j297
test-acc:0.8775train-acc:0.816

j298
test-acc:0.8774train-acc:0.804

j299
test-acc:0.8775train-acc:0.814
'''

从运行结果上看,其实和我们上次的程序处理的差不多。

其实这么来看的话,我们就需要进行更多的优化。其实有很多人已经做过相关的优化程序。后面我们将会学习的时候,更加深入的去理解别的更好的算法。


http://www.kler.cn/a/543153.html

相关文章:

  • 【黑马点评】 使用RabbitMQ实现消息队列——3.批量获取1k个用户token,使用jmeter压力测试
  • 【漏洞复现】Casbin get-users 账号密码泄漏漏洞
  • 超详细的数据结构3(初阶C语言版)栈和队列。
  • RAG 在智能答疑中的探索
  • java.io.InvalidClassException
  • JAVA学习第一天
  • 企业的文档安全怎么防护?
  • Python使用Flask结合DeepSeek开发
  • XSS 常用标签及绕过姿势总结
  • js数据类型与ts数据类型
  • 《深度学习》——pytorch简介和安装
  • Unity中自定义协程的简单实现
  • 对贵司需求的PLC触摸的远程调试的解决方案
  • 蓝桥杯备赛笔记(二)
  • 初阶c语言(while循环二分法)
  • 桥接模式——C++实现
  • 深度整合DeepSeek:智能化搭建企业帮助中心
  • 关于uniapp使用pinia持久化配置兼容问题
  • WPF 设置宽度为 父容器 宽度的一半
  • 2.【线性代数】——矩阵消元
  • 笔记3——字符串和编码
  • 趣味魔法项目 LinuxPDF —— 在 PDF 中启动一个 Linux 操作系统
  • CSS 怎么实现样式隔离?
  • LVS作业
  • 使用Kafka Streams构建实时数据流处理系统:从基础到实践
  • 视频基础操作