游戏AI的创造思路-技术基础-深度学习(2)

news2024/9/20 8:08:52

感觉坑越挖越大,慢慢填~~~~

继续上篇进行填坑,这一篇我们介绍下循环神经网络

目录

3.2. 循环神经网络(RNN)

3.2.1. 算法形成过程

3.2.2. 运行原理

3.2.3. RNN有哪些优缺点

3.2.4. RNN参数

3.2.5. 如何选择RNN模型参数

3.2.6. 算法简单示例

3.2.7. 梯度消失/爆炸问题

3.2.8. 反向传播算法(BPTT)


3.2. 循环神经网络(RNN)

循环神经网络(Recurrent Neural Network, RNN)是一类用于处理序列数据的神经网络。

3.2.1. 算法形成过程

循环神经网络的形成过程主要基于对传统神经网络结构的扩展,以适应序列数据的处理需求。

其关键特点在于网络中的循环连接,使得信息能够在网络中循环传递。

RNN的基本结构包括输入层、隐藏层和输出层,其中隐藏层具有循环连接,能够捕获并记忆序列中的时间依赖关系。

3.2.2. 运行原理

RNN的运行原理可以归纳为以下几点:

  1. 序列输入:RNN接受一系列有序的输入数据,如时间序列、文本序列等。

  2. 循环连接:RNN的隐藏层之间存在循环连接,使得网络能够维护一个“记忆”状态。这个状态包含了过去的信息,使RNN能够理解序列中的上下文信息。

  3. 时间步迭代:在每个时间步,RNN都会根据当前的输入和上一个时间步的隐藏状态来计算新的隐藏状态。这个过程会沿着序列依次进行,形成信息的循环传递。

  4. 输出:在每个时间步,RNN都可以产生一个输出,这个输出可以基于当前的隐藏状态计算得出。对于某些任务,如文本生成,RNN的输出可以直接作为下一个时间步的输入。

  5. 训练与优化:RNN的训练通常使用反向传播算法(Backpropagation Through Time, BPTT)来优化网络参数。通过最小化预测值与真实值之间的误差来更新网络权重。

3.2.3. RNN有哪些优缺点

优点:

  1. 处理序列数据能力强:RNN天然适合处理序列数据,如文本、时间序列等。由于其循环连接的结构,RNN能够捕捉序列中的时间依赖关系,从而在处理具有时序特性的数据时表现出色。

  2. 记忆能力:RNN具有记忆先前信息的能力,这使得它在处理需要上下文信息的任务时非常有用。例如,在机器翻译中,RNN能够记住源语言句子的前面部分,从而帮助生成更准确的翻译。

  3. 参数共享:RNN在每个时间步都使用相同的参数,这使得模型更加简洁且易于训练。参数共享还减少了模型需要学习的参数数量,有助于防止过拟合。

  4. 动态性:RNN可以处理变长的输入序列,这使得它在处理不同长度的数据时具有很大的灵活性。

缺点:

  1. 梯度消失/爆炸问题:在训练过程中,RNN可能会遇到梯度消失或梯度爆炸的问题。当序列长度较长时,梯度在反向传播过程中可能会逐渐消失(变得非常小),导致模型难以学习到长距离依赖关系;或者梯度可能会急剧增大(爆炸),导致模型训练不稳定。

  2. 计算效率低:由于RNN需要按时间步顺序处理输入序列,因此它不能并行化计算。这限制了RNN在处理大规模数据集时的计算效率。

  3. 难以捕捉长期依赖:尽管RNN具有一定的记忆先前信息的能力,但在实践中,它往往难以捕捉到非常长期的依赖关系。这可能是因为梯度消失问题以及RNN结构的局限性。

  4. 训练难度:RNN的训练可能比其他类型的神经网络更加困难,特别是当涉及到长序列时。需要仔细调整学习率、初始化参数等超参数以获得良好的训练效果。

为了解决RNN的这些缺点,研究者们提出了许多改进方案,如LSTM(长短期记忆网络)和GRU(门控循环单元)等变体结构,它们通过引入门控机制和记忆单元来改进RNN的性能,特别是在处理长序列和捕捉长期依赖方面取得了显著进展。(我怎么又在给自己挖坑-.-bbbbbb)

3.2.4. RNN参数

RNN模型参数主要包括以下几类,我将分点表示并进行归纳:

  1. 输入层参数
    • 词嵌入层参数:当处理文本数据时,RNN通常需要一个词嵌入层将离散的词语转换为连续向量。这包括词汇表的大小(vocab_size)和词向量的维度(embedding_dim)。
    • 序列长度参数(seq_length):表示输入序列的长度。不同的任务可能需要不同长度的输入序列。
    • 输入层维度参数(input_dim):表示输入序列的维度,即每个时间步的输入特征的维度。
  2. 隐含层参数
    • 隐含层维度参数(hidden_dim):即RNN隐含层的维度,也就是隐含层状态的维度。这个参数的选择对模型的表达能力和表示能力有着重要影响。
    • 隐含层类型参数(cell_type):表示RNN隐含层的类型,如简单RNN(SimpleRNN)、长短期记忆网络(LSTM)和门控循环单元(GRU)等。不同类型的隐含层具有不同的记忆能力和建模能力。
    • 隐含层层数参数(num_layers):表示RNN模型中隐含层的层数。增加层数可以提高模型的复杂度,但也可能增加过拟合的风险。
  3. 其他参数
    • 非线性激活函数:如tanh、ReLU等,用于增加网络的非线性表达能力。
    • 偏置(bias):表示是否在模型中使用偏置项,通常默认为True。
    • batch_first:如果为True,则输入和输出的第一个维度将是batch size。
    • dropout:表示在层之间的dropout概率,用于防止过拟合。
    • 双向RNN(bidirectional):表示是否为双向RNN,双向RNN可以同时考虑序列的前后信息。

这些参数的选择对RNN模型的性能有着至关重要的影响。在实际应用中,通常需要通过实验来确定最佳的参数组合。此外,当使用深度学习框架(如PyTorch或TensorFlow)实现RNN时,还可以根据框架提供的API来调整和优化这些参数。

3.2.5. 如何选择RNN模型参数

选择RNN模型参数是一个关键步骤,它直接影响模型的性能和训练效果。以下是选择RNN模型参数的具体步骤:

1. 确定隐藏层大小

  • 隐藏层神经元数量:隐藏层大小指的是RNN模型中隐藏层的神经元数量。这个参数的选择对模型的容量和性能有重要影响。
  • 选择方法:可以通过交叉验证或网格搜索等方法来尝试不同的隐藏层大小,并选择在验证集上表现最好的大小。较小的隐藏层可能会导致模型容量不足,难以捕捉序列中的复杂关系;而较大的隐藏层可能会导致模型过拟合。

2. 设置学习率

  • 学习率的作用:学习率决定了模型在每次参数更新时的步长大小,对模型的训练速度和稳定性有重要影响。
  • 选择方法:一种常见的做法是从一个较大的学习率开始训练,然后逐渐减小学习率,以帮助模型更好地收敛。此外,还可以使用学习率调度器(如指数衰减、余弦退火等)来自动调整学习率。

3. 确定迭代次数

  • 迭代次数的定义:迭代次数指的是训练过程中模型遍历整个数据集的次数。
  • 选择方法:迭代次数应根据数据集的大小、模型的复杂度和训练时间等因素来综合确定。过多的迭代次数可能导致训练时间过长,而过少的迭代次数可能导致模型未能充分学习数据的特征。

4. 选择激活函数

  • 激活函数的作用:激活函数为模型引入非线性,使得RNN能够学习到复杂的模式。
  • 常见选择:在RNN中,常见的激活函数包括tanh和ReLU等。选择合适的激活函数可以提高模型的表达能力和训练效率。

5. 考虑正则化技术

  • 正则化的目的:为了防止模型过拟合,可以考虑使用正则化技术,如L1正则化、L2正则化或dropout等。
  • 实施方法:这些技术可以在训练过程中添加到模型中,以提高模型的泛化能力。

6. 监控验证集性能

  • 重要性:在训练过程中,应始终监控模型在验证集上的性能。
  • 调整参数:如果发现模型在验证集上的性能下降或出现波动,应及时调整上述参数以优化模型性能。

选择RNN模型参数是一个迭代和优化的过程。通过不断地尝试和调整,可以找到最适合当前任务和数据集的参数组合。

3.2.6. 算法简单示例

Python示例

以下是一个简单的RNN实现示例,使用TensorFlow框架:

import tensorflow as tf  
from tensorflow.keras.models import Sequential  
from tensorflow.keras.layers import SimpleRNN, Dense  
  
# 定义RNN模型  
model = Sequential()  
model.add(SimpleRNN(50, input_shape=(None, 1)))  # 隐藏层有50个单元,输入形状为(时间步长, 特征数)  
model.add(Dense(1))  # 输出层有1个单元  
  
# 编译模型  
model.compile(optimizer='adam', loss='mse')  
  
# 假设我们有一些训练数据  
import numpy as np  
x_train = np.random.random((100, 10, 1))  # 100个样本,每个样本10个时间步,每个时间步1个特征  
y_train = np.random.random((100, 1))  # 100个样本的输出  
  
# 训练模型  
model.fit(x_train, y_train, epochs=10, batch_size=32)

C++示例

在C++中实现RNN通常需要使用专门的机器学习库,如TensorFlow C++ API。以下是一个简化的示例框架,展示如何在C++中使用TensorFlow来实现RNN(请注意,这只是一个框架示例,具体实现细节可能因TensorFlow版本和具体任务而异):

#include "tensorflow/core/public/session.h"  
#include "tensorflow/core/platform/env.h"  
  
using namespace tensorflow;  
  
int main() {  
    // 初始化TensorFlow会话  
    Session* session;  
    Status status = NewSession(SessionOptions(), &session);  
    if (!status.ok()) { /* 处理错误 */ }  
  
    // 加载已经训练好的RNN模型(此处为伪代码)  
    GraphDef graph_def;  
    status = ReadBinaryProto(Env::Default(), "path/to/your/model.pb", &graph_def);  
    if (!status.ok()) { /* 处理错误 */ }  
    status = session->Create(graph_def);  
    if (!status.ok()) { /* 处理错误 */ }  
  
    // 准备输入数据(此处为伪代码)  
    Tensor input_tensor(DT_FLOAT, TensorShape({1, 10, 1}));  
    // 填充input_tensor数据...  
  
    // 运行RNN模型进行推断  
    std::vector<Tensor> outputs;  
    status = session->Run({{"input_placeholder", input_tensor}}, {"output_tensor"}, {}, &outputs);  
    if (!status.ok()) { /* 处理错误 */ }  
  
    // 处理输出结果  
    // ...  
  
    // 清理资源  
    session->Close();  
    delete session;  
    return 0;  
}

请注意,C++中的实现通常更加复杂,需要处理更多的底层细节。上述C++示例主要是为了展示如何在TensorFlow C++ API中加载模型和处理数据的基本流程。实际应用中,你需要根据自己的模型和数据进行相应的调整。

由于C++实现RNN涉及较多底层细节和TensorFlow C++ API的复杂使用,通常建议先在Python环境中进行模型的开发和调试,然后再考虑将模型导出为可在C++环境中使用的格式(如TensorFlow的SavedModel格式),最后在C++中进行加载和使用。

3.2.7. 梯度消失/爆炸问题

在RNN算法中,梯度消失和梯度爆炸是两个常见的问题,它们主要发生在反向传播过程中。

梯度消失产生原因

  • 网络层次过深:在深层RNN中,误差需要通过多层网络进行反向传播。如果每一层的梯度都小于1,随着层数的增加,梯度会呈指数级衰减,最终导致梯度几乎为零。这种情况下,网络无法有效地更新权重,难以学习到长距离依赖关系。
  • 激活函数选择不当:某些激活函数(如sigmoid和tanh)的导数在大部分定义域内都较小。例如,sigmoid函数的导数最大值仅为0.25。在链式求导过程中,这些小导数会相乘,导致梯度迅速减小。

梯度爆炸产生原因

  • 权重初始化值过大:在深度神经网络中,如果初始权重过大,反向传播时的梯度可能会变得非常大。
  • 网络结构问题:在某些网络结构中,层与层之间的梯度如果大于1并且重复相乘,梯度可能会以指数级增长。

常规解决方法

为了解决RNN中的梯度消失和梯度爆炸问题,可以采取以下策略:

  1. 选择合适的激活函数:使用如ReLU等激活函数,其导数在较大范围内保持较大值,有助于缓解梯度消失问题。

  2. 权重初始化方法:采用合适的权重初始化方法,如He初始化或Xavier初始化,以避免初始权重过大导致的梯度爆炸。

  3. 使用正则化技术:例如批归一化(Batch Normalization),可以帮助控制梯度的规模,减少梯度消失或爆炸的风险。

  4. 采用LSTM或GRU结构:这些特殊的RNN结构通过引入门控机制和记忆单元来更好地处理序列数据,从而有效缓解梯度消失和梯度爆炸问题。LSTM模型中的遗忘门、输入门和输出门协同工作,控制信息的流动和记忆的更新,使得模型能够更好地捕捉长期依赖关系。

  5. 梯度裁剪:通过设置梯度阈值,防止梯度在反向传播过程中过大增长,从而避免梯度爆炸。

3.2.8. 反向传播算法(BPTT)

RNN(循环神经网络)的训练通常使用反向传播算法(Backpropagation Through Time, BPTT)的一个变体。由于RNN处理的是序列数据,其反向传播算法需要沿着时间步进行,因此被称为“通过时间的反向传播”。在BPTT中,网络的输出误差会沿着时间反向传播,通过每个时间步,以更新网络的权重。

Python示例代码(使用PyTorch)

在Python中,使用PyTorch框架可以很方便地实现RNN的反向传播训练。以下是一个简单的示例:

import torch  
import torch.nn as nn  
import torch.optim as optim  
  
# 定义一个简单的RNN模型  
class SimpleRNN(nn.Module):  
    def __init__(self, input_size, hidden_size, output_size):  
        super(SimpleRNN, self).__init__()  
        self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)  
        self.fc = nn.Linear(hidden_size, output_size)  
  
    def forward(self, x):  
        out, _ = self.rnn(x)  
        out = self.fc(out[:, -1, :])  
        return out  
  
# 模型参数和超参数  
input_size = 1  
hidden_size = 10  
output_size = 1  
learning_rate = 0.01  
num_epochs = 100  
  
# 创建模型实例、损失函数和优化器  
model = SimpleRNN(input_size, hidden_size, output_size)  
criterion = nn.MSELoss()  
optimizer = optim.SGD(model.parameters(), lr=learning_rate)  
  
# 创建一些模拟数据和标签  
x = torch.randn(1, 5, input_size)  # 假设序列长度为5  
y = torch.randn(1, output_size)    # 假设输出维度为1  
  
# 训练模型  
for epoch in range(num_epochs):  
    # 前向传播  
    outputs = model(x)  
    loss = criterion(outputs, y)  
      
    # 反向传播和优化  
    optimizer.zero_grad()          # 清空梯度  
    loss.backward()                # 反向传播  
    optimizer.step()               # 更新权重  
      
    # 打印损失  
    if (epoch+1) % 10 == 0:  
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item()}')

C++示例代码(使用LibTorch)

在C++中,使用LibTorch(PyTorch的C++ API)也可以实现RNN的训练。以下是一个简单的示例:

#include <torch/torch.h>  
#include <iostream>  
  
// 定义模型(与前面的Python示例相似)  
struct SimpleRNNImpl : torch::nn::Module {  
    // ...(与前面的C++示例相同)  
};  
TORCH_MODULE(SimpleRNN);  
  
int main() {  
    // 初始化、模型定义等(与前面的C++示例相同)  
    // ...  
  
    // 定义优化器和损失函数  
    torch::optim::SGD optimizer(model->parameters(), torch::optim::SGDOptions(0.01));  
    auto criterion = torch::nn::MSELoss();  
  
    // 模拟数据和标签  
    torch::Tensor x = torch::randn({1, 5, input_size});  
    torch::Tensor y = torch::randn({1, output_size});  
  
    // 训练模型  
    for (int epoch = 0; epoch < num_epochs; ++epoch) {  
        optimizer.zero_grad();  
  
        // 前向传播  
        torch::Tensor outputs = model->forward(x);  
        torch::Tensor loss = criterion(outputs, y);  
  
        // 反向传播  
        loss.backward();  
  
        // 更新权重  
        optimizer.step();  
  
        // 打印损失  
        if ((epoch + 1) % 10 == 0) {  
            std::cout << "Epoch [" << epoch + 1 << "/" << num_epochs << "], Loss: " << loss.item() << std::endl;  
        }  
    }  
  
    return 0;  
}

这两个示例展示了如何使用PyTorch和LibTorch来训练一个简单的RNN模型。注意,在实际应用中,你可能需要处理更复杂的数据集、调整模型架构和超参数,并添加其他训练技巧(如早停、正则化等)以优化模型性能。

先写到这里,后面慢慢聊~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1860361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

odoo17 tree视图添加按钮

需求描述 点击下图中tree视图上的同步退货单按钮&#xff0c;弹出相应的form视图进行退货单同步&#xff0c;然后点击同步按钮调用后端python代码处理。 实现步骤 主要文件目录结构 js文件的创建 /** odoo-module **/ import { registry } from "web/core/registry&quo…

芒果YOLOv10改进66:特征融合Neck篇之原创 HFAMPAN 结构:信息高阶特征对齐融合和注入,全局融合多级特征,将全局信息注入更高级别

💡本篇内容:YOLOv10 改进原创 HFAMPAN 结构,信息高阶特征对齐融合和注入,全局融合多级特征,将全局信息注入更高级别 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv10 按步骤操作运行改进后的代码即可 💡本文提出改进 原创 方式:二次创新,YOLOv10 专属 论文…

Spring Boot基础入门

引言 Spring Boot是一个开源的Java框架&#xff0c;旨在简化Spring应用程序的创建和部署过程。它提供了一种快速和简便的方式来创建独立的、生产级别的基于Spring的应用程序。本文将介绍Spring Boot的基础知识&#xff0c;包括其核心特性、如何开始使用Spring Boot以及构建你的…

Docker 安装和加速

目录 1.安装 2.了解 docker 信息 3.查询状态 4. 重新启动Docker 1.安装 yum install –y docker 2.了解 docker 信息 cat /etc/redhat-release 3.查询状态 systemctl status docker 4.支持 1.12 的 docker 镜像加速 sudo mkdir -p /etc/docker sudo tee /etc/docke…

关于关闭防火墙后docker启动不了容器

做项目的时候遇到个怪事&#xff0c;在Java客户端没办法操作redis集群。反复检查了是否运行&#xff0c;端口等一系列细节的操作&#xff0c;结果都不行。 根据提示可能是Linux的防火墙原因。于是去linux关闭了防火墙。 关闭后果不其然 可以操作reids了&#xff0c;可是没想到另…

【linux学习十七】文件服务管理

一、FTP FTP server:FTP(File Transfer Protocol,文件传输协议 )是 TCP/IP 协议组中的协议之一 软件包&#xff1a;vsftpd/安装 yum -y install vsftpd//准备文件 touch /var/ftp/abc.txt //注释:FTP服务器的主目录:“/var/ftp/”&#xff0c;是FTP程序分享内容的本机目录…

ArkUI开发学习随机——得物卡片,京东登录界面

案例一&#xff1a;得物卡片 代码&#xff1a; Column(){Column(){Image($r("app.media.mihoyo")).width(200).height(200)Row(){Text("今晚玩这个 | 每日游戏打卡").fontWeight(700).fontSize(16).padding(4)}.width(200)Text("No.12").fontWe…

罗德与施瓦茨 ZND (RS) ZNB8 矢量网络分析仪

R&SZND 矢量网络分析仪 简介 R&S ZND 是一款提供最高 4.5 GHz 的单向测量的基本网络分析仪。 用户可选择选件以执行双向测量&#xff0c;并将频率范围扩展到 8.5 GHz。 主要特点 双端口网络分析仪&#xff0c;适用于 100 kHz 至 4.5 GHz 的单向测量 频率范围可扩展…

一分钟扫盲:互联网产品B端,C端,G端都是啥,有什么特征。

在互联网产品中&#xff0c;B端、C端和G端是常用的分类方式&#xff0c;用于描述产品的目标用户群体和市场定位。 B端&#xff08;Business-to-Business&#xff09;&#xff1a; B端产品是面向企业或机构的产品&#xff0c;即企业与企业之间的交互和服务。B端产品的特点包括…

​Python20 Numpy基础

NumPy&#xff08;Numerical Python&#xff09;是一个开源的Python库&#xff0c;广泛用于科学计算。它提供了一个高性能的多维数组对象&#xff0c;以及用于处理这些数组的工具和函数。NumPy是数据分析、机器学习、工程和科学研究中不可或缺的工具之一&#xff0c;因为它提供…

Navicat连接Oracle出现Oracle library is not loaded的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 使用Navicat链接Oracle的时候,出现如下提示:Oracle library is not loaded. 截图如下所示: 2. 原理分析 通常是由于缺少必需的 Oracle 客户端库或环境变量未正确配置所致 还有一种情况是 32位与64位的不匹配:Navica…

Labview_网络流

网络流的介绍 网络流是一种易于配置、紧密集成的动态通信方法&#xff0c;用于将数据从一个应用程序传输到另一个应用程序&#xff0c;其吞吐量和延迟特性可与 TCP 相媲美。但是&#xff0c;与 TCP 不同的是&#xff0c;网络流直接支持任意数据类型的传输&#xff0c;而无需先…

一键设置水印,全面护航:跨境平台产品刊登新功能上线

一、Allegro、OZON、Coupang、Cdiscount、Wish、Temu、Walmart、OnBuy、TikTok、Wildberries平台新增产品刊登支持设置水印。 【普通水印】直接跳转到添加水印页面&#xff0c;勾选所要的图片&#xff0c;点击确定&#xff0c;自动替换原图。 【管理水印】直接跳转到水印模版页…

JAVA【案例5-2】模拟默认密码自动生成

【模拟默认密码自动生成】 1、案例描述 本案例要求编写一个程序&#xff0c;模拟默认密码的自动生成策略&#xff0c;手动输入用户名&#xff0c;根据用户名自动生成默认密码。在生成密码时&#xff0c;将用户名反转即为默认的密码。 2、案例目的 &#xff08;1&#xff09…

汇凯金业:现货黄金交易规则有哪些 投资必读

现货黄金投资近年来发展迅猛&#xff0c;吸引了许多新手投资者进入市场。那么&#xff0c;现货黄金交易规则究竟有哪些?本文将详细介绍现货黄金交易的关键规则&#xff0c;帮助投资者更好地掌握投资技巧&#xff0c;实现稳健收益。 一、保证金交易制 什么是保证金交易? 现…

【智能家居照明磁吸灯驱动方案】LED磁吸轨道灯智能照明调光控制芯片FP7195,耐压80V降压恒流无频闪芯片,0.1%深度调光无频闪无抖动,调光细腻丝滑

随着极简主义无主灯照明的设计风潮来袭&#xff0c;磁吸灯成了室内灯光设计的重点元素&#xff0c;磁吸灯的设计采用模块化的概念。 预设好轨道后&#xff0c;可以自由选择光源的样式&#xff1a;筒灯、射灯、格栅灯、泛光条、吊线灯等等&#xff0c;各种灯具及不同色温光源的…

怎么改png图片的颜色?

要改变PNG图片的颜色&#xff0c;可以采取以下几种方法&#xff1a; 使用Photoshop等图像编辑软件&#xff1a;或者&#xff0c;也可以使用Photoshop中的选区工具&#xff08;如矩形选框、椭圆选框、套索工具等&#xff09;选中图片中需要改变颜色的部分&#xff0c;然后创建一…

Kompas AI自然语言处理能力对比

一、引言 自然语言处理&#xff08;NLP&#xff09;是衡量人工智能&#xff08;AI&#xff09;系统智能程度的重要指标之一。NLP技术的进步使得机器能够理解、解释和生成人类语言&#xff0c;在各个领域中发挥了巨大的作用。本文将对比Kompas AI与其他主要AI产品在NLP方面的表…

暴雨虐长沙,生灵受煎熬

今天&#xff0c;“湖南长沙市遭遇强降雨,一小时的降雨量足够注满54个西湖”这消息&#xff0c;终于登上互联网社交平台热搜榜。 截图&#xff1a;来源社交网站 综合多家媒体消息概述如下。 昨&#xff08;24日&#xff09;天&#xff0c;湖南长沙市遭遇强降雨&#xff0c;一…

房产平台系统小程序源码

&#x1f3e0; 一键解锁购房新体验 &#x1f513; 房产小程序 实现前端 发布二手房 租房 商品 求租 求购等信息&#xff1b; 后台发布 新房&#xff0c;二手房租房 商品 写字楼 求租求购等房源信息&#xff1b; 功能完善的一块房产小程序 &#x1f31f; 房产平台小程序的魅力…