【睿慕课点云处理】第七章-深度学习基础

2024-02-28 15:48

本文主要是介绍【睿慕课点云处理】第七章-深度学习基础,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

深度学习基础

  • 课程
    • 课程汇总
  • 作业
    • 神经网络基础
      • 可视化
    • MNIST手写数字体识别
      • 1、MLP
      • 2、K-近邻
      • 3、CNN
  • 参考

课程

课程汇总


作业

神经网络基础

'''
@Description:  三层神经网络实现分类
@Author: Su Yunzheng
@Date: 2020-06-17 15:40:53
@LastEditTime: 2020-06-18 16:12:21
@LastEditors: Su Yunzheng
'''import numpy as np
import sklearn
import matplotlib 
import matplotlib.pyplot as pltfrom getData import gen_classify_data # 可视化
# input:sample_x(2*n), sample_y(n,)
def visualization(sample_x, sam_type, save=False, path='inference/sample-data.png'):samp = plt.figure()samp_ax = samp.add_subplot(1, 1, 1)samp_ax.set_title('sample data')type = sam_type                 # 给定一个label(n,)samp_ax.scatter(sample_x[0], sample_x[1], c=type, linewidths=type)if save:plt.savefig(path, dpi=400, bbox_inches='tight')plt.show()# 可视化对比图
# 可视化
# input:sample_x(2*1000), sam_type(1000,), pred_type(1000,)
def compare_visual(sample_x, sam_type, pred_type, save=False, path='inference/inference-compare.png',title='inference comparison', loss=0):# 查看输出的格式  # sample_x:(2, 1000),sample_y:(3, 1000),predict_y:(3, 1000)# print('sample_x:{},sample_y:{},predict_y:{}'.format(sample_x.shape, sample_y.shape, predict_y.shape))comp = plt.figure()comp.suptitle(title)samp_ax = plt.subplot2grid((2, 2), (0, 0))              # 划分位置pred_ax = plt.subplot2grid((2, 2), (0, 1))comp_ax = plt.subplot2grid((2, 2), (1, 0), colspan=2)samp_ax.set_title('sample results')pred_ax.set_title('predict results')comp_ax.set_title('comparison loss= %.5f' %loss)# sam_type = np.where(sample_y.T == sample_y.max())[1]        # 1000个点的类别 (1000,)# pred_type = np.where(predict_y.T == predict_y.max())[1]     # 1000个点的类别 0 1 2 # print("predict_y:{}".format(predict_y.shape))   # 3*1000# print("pred_type :{},sam_type shape:{}".format(pred_type,sam_type.shape))# print('sam_type:{}'.format(sam_type))d_type = pred_type - sam_type     # label和predict的差异# print('type:{}'.format(type))  samp_ax.scatter(sample_x[0], sample_x[1], c=sam_type, linewidths=sam_type)pred_ax.scatter(sample_x[0], sample_x[1], c=pred_type, linewidths=pred_type)comp_ax.scatter(sample_x[0], sample_x[1], c=d_type)                # 根据预测结果的不同,差异越大,其余颜色的数目就越多if save:plt.savefig(path, dpi=400, bbox_inches='tight')plt.show()# 生成作业数据数据 X为坐标,y为标签
X,y=gen_classify_data(200)
y=np.argmax(y,axis=0)         # [1,0,0]-->0;        [0,1,0]-->1;        [0,0,1]-->2;
X=np.transpose(X)  
# print("y :\n{}".format(y))
# print("y shape :\n{}".format(y.shape))
print("X :{},y :{}".format(X.shape,y.shape))
print("----------------------------------------")num_examples = len(X) # 样本数   本例题为200
nn_input_dim = 2 # 输入的维度   本例题有两个特征向量
# nn_output_dim = 2 # 输出的类别个数  分为两类
nn_output_dim = 3 # 输出的类别个数  分为三类# 梯度下降参数
epsilon = 0.01 # 学习率
reg_lambda = 0.01 # 正则化参数# 定义损失函数,计算损失(才能用梯度下降啊...)
def calculate_loss(model,X=X,y=y,num_examples=num_examples):'''input: model,  X,  y,  num_examples样本的数量(200或者1000)'''W1, b1, W2, b2 = model['W1'], model['b1'], model['W2'], model['b2']
#     print("W1:{}\nb1:{}\nW2:{}\nb2:{}\n".format(W1,b1,W2,b2))
#     print("X:{}\n".format(X.shape))# 向前推进,前向运算z1 = X.dot(W1) + b1  #200*2*2*10 =200*10,  200*10+200*10=200*10 ,z1:200*3# print("X.dot(W1):{}".format(X.dot(W1).shape))# print("z1:{}\n".format(z1.shape))a1 = np.tanh(z1)  #a1:200*10# print("a1:{}".format(a1.shape))  # 激活z2 = a1.dot(W2) + b2  #200*10*10*3=200*3  , b2:1*3->200*3 , z2:200*3exp_scores = np.exp(z2)  #200*3                 # 全部取指数   softmax函数# print("exp_scores.shape: {} ".format(exp_scores.shape)) probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)  #np.sum()  将矩阵按列相加,全部加到第一列 , 200*3/200*1->200*3/200*3
#     print("np.sum:{}".format(np.sum(exp_scores, axis=1, keepdims=True).shape))# print("probs:{}".format(probs))    # 概率值  200*3# 计算损失   交叉熵函数corect_logprobs = -np.log(probs[range(num_examples), y])  #取prob这个200*3的概率矩阵的每一行,具体是第几列是靠对应的y来确定的 #200*1
#     print("y:{}".format(y))data_loss = np.sum(corect_logprobs)    #200行加在一起->1*1  一个数
#     print("corect_logprobs:{}".format(corect_logprobs.shape))  #200*1
#     print("data_loss:{}".format(data_loss))  #200行加在一起->1*1  一个数# 也得加一下正则化项data_loss += reg_lambda/2 * (np.sum(np.square(W1)) + np.sum(np.square(W2)))  #W1:2*3 W2:3*2  data_loss是一个数
#     print("data_loss:{}".format(data_loss))
#     print("1./num_examples * data_loss:{}".format(1.*data_loss/num_examples  ))return 1./num_examples * data_loss   #返回一个数,作为损失值# 完整的训练建模函数定义
def build_model(nn_hdim, num_passes=20000, print_loss=False):'''参数:1) nn_hdim: 隐层节点个数   作业为102)num_passes: 梯度下降迭代次数3)print_loss: 设定为True的话,每1000次迭代输出一次loss的当前值'''# 随机初始化一下权重呗np.random.seed(0)  #seed只对第一组随机数起作用W1 = np.random.randn(nn_input_dim, nn_hdim) / np.sqrt(nn_input_dim) # nn.sqrt打印nn_input_dim=2的开方,也就是1.414
#     print("nn.sqrt:{}".format(np.sqrt(nn_input_dim)))
#     print("W1:{}".format(W1))
#     print(" np.random.randn(nn_input_dim, nn_hdim):{}",format( np.random.randn(nn_input_dim, nn_hdim)))b1 = np.zeros((1, nn_hdim))W2 = np.random.randn(nn_hdim, nn_output_dim) / np.sqrt(nn_hdim)  b2 = np.zeros((1, nn_output_dim))# 这是咱们最后学到的模型model = {}loss=[]    # 损失# 开始梯度下降...for i in range(0, num_passes):# 前向运算计算lossz1 = X.dot(W1) + b1a1 = np.tanh(z1)   # 激活函数 tanhz2 = a1.dot(W2) + b2exp_scores = np.exp(z2)probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)    # softmax 得到概率# print("probs shape: {}".format(probs.shape))     #  概率值  200*3# 反向传播delta3 = probs             #### 200*2  每一列表示对应的概率delta3[range(num_examples), y] -= 1    # 200# print("delta3:{}".format(delta3.shape))   ################################# print("delta3:{}".format(delta3))   ################################# 增量dW2 = (a1.T).dot(delta3)db2 = np.sum(delta3, axis=0, keepdims=True)delta2 = delta3.dot(W2.T) * (1 - np.power(a1, 2))dW1 = np.dot(X.T, delta2)db1 = np.sum(delta2, axis=0)# 加上正则化项dW2 += reg_lambda * W2dW1 += reg_lambda * W1# 梯度下降 更新参数W1 += -epsilon * dW1b1 += -epsilon * db1W2 += -epsilon * dW2b2 += -epsilon * db2# 得到的模型实际上就是这些权重model = { 'W1': W1, 'b1': b1, 'W2': W2, 'b2': b2}loss.append(calculate_loss(model))              # 将所有的loss放在一个list中# 如果设定print_loss了,那我们汇报一下中间状况if print_loss and i % 1000 == 0:print("Loss after iteration {}: {} ".format(i,calculate_loss(model)))# print("loss:{}".format(loss))     # 输出总的loss  一个list个格式# 绘制train-loss曲线fig = plt.figure()ax = fig.add_subplot(1, 1, 1)ax.set_title('train-loss')ax.set_ylim([0, 1])ax.plot(loss)plt.savefig('./inference/train-loss')plt.show()return model# 判定结果的函数
def predict(model, x):W1, b1, W2, b2 = model['W1'], model['b1'], model['W2'], model['b2']# 前向运算z1 = x.dot(W1) + b1a1 = np.tanh(z1)z2 = a1.dot(W2) + b2exp_scores = np.exp(z2)  #200*3# 计算概率输出最大概率对应的类别probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True) #200*3# print('probs:{}'.format(probs))    # 输出概率矩阵return np.argmax(probs, axis=1)  #返回200行中,每一行的最大的值,得到的矩阵是一个200*1的矩阵,表示200个元素对应的类别# 计算精度
def getAcc(pred,y):ac=sum(pred==y)/len(pred)   ## 统计两个数组相同元素的数目# ac=sum(pred==y)   ## 统计两个数组相同元素的数目return ac*100.0# 建立隐层有10个节点(神经元)的神经网络
model = build_model(10, print_loss=True)
print("-------------------------")
# print("model:{}".format(model))
# 评价训练集
pred=predict(model,X)   # 得到预测值# 计算损失
train_loss=calculate_loss(model,X,y)
print("train_loss:{}".format(train_loss))# print("pred:{}".format(pred))
# print("y :{}".format(y))# 计算精度
# print("y shape:{},pred shape:{}".format(y.shape,pred.shape))         #  y shape:(200,),pred shape:(200,)
print("Train Acc:{}%".format(getAcc(pred,y)))# 可视化训练集
visualization(np.transpose(X),y,True,path='./inference/train.png')
compare_visual(np.transpose(X),y,pred,True,path='./inference/compare_train.png',loss=train_loss)print("------------------Test------------------")
##### 生成测试集数据 1000个点
X_test,y_test=gen_classify_data(1000)
y_test=np.argmax(y_test,axis=0)         # [1,0,0]-->0;        [0,1,0]-->1;        [0,0,1]-->2;
X_test=np.transpose(X_test)             # 2*1000 ---> 1000*2
# print("y :\n{}".format(y))
# print("y shape :\n{}".format(y.shape))
print("X_test :{},y_test :{}".format(X_test.shape,y_test.shape))        # X_test :(1000, 2),y_test :(1000,)# 得到预测值
pred_test = predict(model,X_test)   # 得到预测值# 计算损失
test_loss = calculate_loss(model,X_test,y_test,len(X_test))
print("test_loss:{}".format(test_loss))# 计算精度
print("Test Acc:{}%".format(getAcc(pred_test,y_test)))# 可视化训练集
visualization(np.transpose(X_test),y_test,save=True,path='inference/test.png')
compare_visual(np.transpose(X_test),y_test,pred_test,save=True,path='inference/compare_test.png',loss=test_loss)

可视化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述

MNIST手写数字体识别

给出三种实现方式

1、MLP

'''
@Description: mlp MNIST手写数字体识别
@Author: Su Yunzheng
@Date: 2020-06-18 16:14:32
@LastEditTime: 2020-06-18 17:18:14
@LastEditors: Su Yunzheng
'''### 查看tensorboard:
# (tf) C:\Users\11604>tensorboard --logdir F:\睿慕课\7\苏云征-三维点云7\logs  --host=127.0.0.1import tensorflow as tf
import matplotlib.pyplot as plt
import os
import numpy as np
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_DATA",one_hot=True)    #onehot对标签的标注,非onehot是1,2,3.onehot就是只有一个1其余全是0#超参数(学习率,batch的大小,训练的轮数,多少轮展示一下loss)
learning_rate = 0.2     # 学习率
num_step = 20          # 迭代次数
batch_size = 128        # 一个batch的size
n_batch=mnist.train.num_examples//batch_size    # 有多少个batch
display_step =100     # 多少轮打印一次#网络参数(有多少层网络,每层有多少个神经元,整个网络的输入是多少维度的,输出是多少维度的)
num_input = 784     #(28*28)
h1=1000             # 隐藏层 这个是没用到的
num_class = 10      # 输出#图的输入
X = tf.placeholder(tf.float32,[None,num_input])
Y = tf.placeholder(tf.float32,[None,num_class])#网络的权重和偏向,如果是两个隐层的话需要定义三个权重,包括输出层
weights={'out':tf.Variable(tf.zeros([num_input,num_class]))}biase = {'out':tf.Variable(tf.zeros([num_class]))
}#定义网络结构
def neural_net(x):# h1_out = tf.matmul(x,weights['h1'])+biase['h1']out_layer = tf.matmul(x,weights['out'])+biase['out']return out_layer#模型输出处理
logits = neural_net(X)
prediction = tf.nn.softmax(logits)    # 得到batch_size*10的概率矩阵# 定义损失和优化器
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits,labels=Y))
optimizer = tf.train.GradientDescentOptimizer(learning_rate = learning_rate)
train_step = optimizer.minimize(loss_op)#评估模型准确率
correct_pred = tf.equal(tf.argmax(prediction,1),tf.argmax(Y,1))    #结果存放在一个布尔型列表中(argmax函数返回一维张量中最大的值所在的位置)
accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32))   #求准确率(tf.cast将布尔值转换为float型)#初始化变量
init = tf.global_variables_initializer()mse_summary=tf.summary.scalar("loss", loss_op)
# Create a summary to monitor accuracy tensor
acc_summary=tf.summary.scalar("accuracy", accuracy)
file_writer = tf.summary.FileWriter('./logs',tf.get_default_graph())#开始训练
with tf.Session() as sess:sess.run(init)for step in range(num_step):   # 总迭代for batch in range(n_batch):batch_x,batch_y = mnist.train.next_batch(batch_size)_,los,ac=sess.run([train_step,mse_summary,acc_summary],feed_dict={X:batch_x,Y:batch_y})# 记录下来每一次训练的数据file_writer.add_summary(los,step*n_batch+batch)   # lossfile_writer.add_summary(ac,step*n_batch+batch)    # acc# if step % display_step == 0 or step == 1:# print("step:{},loss:{},acc:{}".format(step,loss,acc))acc=sess.run(accuracy,feed_dict={X:mnist.test.images,Y:mnist.test.labels})print("Iter:{},testing Accuracy:{}".format(step,acc))print("优化完成!")#训练完模型后,开始测试# 读取图片# print(mnist.test.images.shape)          #(10000, 784)plt.imshow(mnist.test.images[0].reshape(28,28))plt.show()pred_pic=mnist.test.images[0].reshape(1,-1)pred_num=sess.run(prediction,feed_dict={X:pred_pic})print("预测结果:{}".format( np.argmax(pred_num) ))

在这里插入图片描述

2、K-近邻

3、CNN

'''
@Description: cnn MNIST手写数字体识别
@Author: Su Yunzheng
@Date: 2020-06-18 16:14:39
@LastEditTime: 2020-06-18 16:14:39
@LastEditors: Su Yunzheng
'''### 查看tensorboard:
# (tf) C:\Users\11604>tensorboard --logdir F:\睿慕课\7\苏云征-三维点云7\logs  --host=127.0.0.1import numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import matplotlib.pyplot as pltmnist = input_data.read_data_sets("MNIST_DATA", one_hot=True)logs_path = './log/example/' # log存放位置
batch_size = 50
n_batch=mnist.train.num_examples//batch_size    # 有多少个batchdef weight_variable(shape,namew='w'):initial = tf.truncated_normal(shape, stddev=0.1)return tf.Variable(initial,name=namew)def bias_variable(shape,nameb='b'):initial = tf.constant(0.1, shape=shape)return tf.Variable(initial,name=nameb)def conv2d(x, W,namec='c'):return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME',name=namec)def max_pool_2x2(x,namep='p'):return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME',name=namep)x = tf.placeholder(tf.float32, [None, 784],name='xinput')
y_ = tf.placeholder(tf.float32, [None, 10])
x_image = tf.reshape(x, [-1, 28, 28, 1])# Conv1 Layer
W_conv1 = weight_variable([5, 5, 1, 32],'w1')
b_conv1 = bias_variable([32],'b1')
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1,'c1')
h_pool1 = max_pool_2x2(h_conv1,'p1')# Conv2 Layer
W_conv2 = weight_variable([5, 5, 32, 64],'w2')
b_conv2 = bias_variable([64],'b2')
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)W_fc1 = weight_variable([7 * 7 * 64, 1024],'wf1')
b_fc1 = bias_variable([1024],'bf1')
h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)keep_prob = tf.placeholder(tf.float32,name="prob")
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)W_fc2 = weight_variable([1024, 10],'wfull2')
b_fc2 = bias_variable([10],'bf2')
y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1]))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))init=tf.global_variables_initializer()# tensorboard相关的
# Create a summary to monitor cost tensor
mse_summary=tf.summary.scalar("loss", cross_entropy)
# Create a summary to monitor accuracy tensor
acc_summary=tf.summary.scalar("accuracy", accuracy)
file_writer = tf.summary.FileWriter('./logs',tf.get_default_graph())
# Merge all summaries into a single op
# merged_summary_op = tf.summary.merge_all()#开始训练
with tf.Session() as sess:sess.run(init)# op to write logs to Tensorboard# summary_writer = tf.summary.FileWriter("logs/", graph=tf.get_default_graph())saver = tf.train.Saver()for i in range(2):for batch_i in range(n_batch):batch = mnist.train.next_batch(batch_size)sess.run(train_step,feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})summary_str = mse_summary.eval(feed_dict={x:batch[0],y_:batch[1],keep_prob:1.0})accuracy_str=acc_summary.eval(feed_dict={x:batch[0],y_:batch[1],keep_prob:1.0})# 记录下来每一次训练的数据file_writer.add_summary(summary_str,i*n_batch+batch_i)file_writer.add_summary(accuracy_str,i*n_batch+batch_i)# 训练集精度if (batch_i%500==0):train_accuracy = sess.run(accuracy,feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0})print("Iter %d, batch_i %d,training accuracy %g" % (i,batch_i, train_accuracy))# 一次遍历完整个数据集,打印测试集精度test_acc=sess.run(accuracy,feed_dict={x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0})print("Iter %d, test accuracy %g" % (i, test_acc))saver.save(sess, "Model/model.ckpt")print("model saved!")# 测试#训练完模型后,开始测试# 读取图片# print(mnist.test.images.shape)          #(10000, 784)plt.imshow(mnist.test.images[0].reshape(28,28))plt.show()pred_pic=mnist.test.images[0].reshape(1,-1)# print("pred_pic:{}".format(pred_pic.shape))  # pred_pic:(1, 784)pred_num=sess.run(y_conv,feed_dict={x:pred_pic,keep_prob: 1.0})   # 这是一个1*10的概率矩阵 , 这里feed_dict中要有keep_prob,否则会报错# print("概率矩阵softmax:{}".format(pred_num.shape))print("预测结果:{}".format( np.argmax(pred_num) ))

在这里插入图片描述

参考

tensorboard生成的网址打不开的解决方法

tensorboard可视化图和损失曲线

tensorboard 手写数字识别可视化训练过程 (tensorflow小案例)

这篇关于【睿慕课点云处理】第七章-深度学习基础的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/755937

相关文章

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

Python结合requests和Cheerio处理网页内容的操作步骤

《Python结合requests和Cheerio处理网页内容的操作步骤》Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一,requests库是Python中用于发送HT... 目录一、前言二、环境搭建三、requests库的基本使用四、Cheerio库的基本使用五、结合req

使用Python处理CSV和Excel文件的操作方法

《使用Python处理CSV和Excel文件的操作方法》在数据分析、自动化和日常开发中,CSV和Excel文件是非常常见的数据存储格式,ython提供了强大的工具来读取、编辑和保存这两种文件,满足从基... 目录1. CSV 文件概述和处理方法1.1 CSV 文件格式的基本介绍1.2 使用 python 内

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

MyBatis延迟加载的处理方案

《MyBatis延迟加载的处理方案》MyBatis支持延迟加载(LazyLoading),允许在需要数据时才从数据库加载,而不是在查询结果第一次返回时就立即加载所有数据,延迟加载的核心思想是,将关联对... 目录MyBATis如何处理延迟加载?延迟加载的原理1. 开启延迟加载2. 延迟加载的配置2.1 使用