让大模型帮我设计crnn网络及可运行demo,gpt4o豆包qwendeepseek-r1
prompt
使用 crnn 提取图像特征,给出图像好坏的二分类结果,写清楚代码备注,注释清楚向量维度大小,并给出一个可运行的 demo
1、GPT-4o
以下是一个使用 CRNN(Convolutional Recurrent Neural Network)提取图像特征并进行二分类的完整代码示例。我们将使用 PyTorch 框架来实现。代码中会包含详细的注释,解释每一步的操作和向量维度变化。
1. 安装依赖
首先,确保你已经安装了 PyTorch 和 torchvision。如果没有安装,可以使用以下命令安装:
pip install torch torchvision
2. 代码实现
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, Dataset
from torchvision import transforms, datasets
import numpy as np
import matplotlib.pyplot as plt# 设置随机种子,确保结果可复现
torch.manual_seed(42)# 定义一个简单的自定义数据集(用于演示)
class SimpleImageDataset(Dataset):def __init__(self, num_samples=1000, img_size=(32, 32)):self.num_samples = num_samplesself.img_size = img_sizeself.data = []self.labels = []# 生成随机图像数据for _ in range(num_samples):# 随机生成图像(0-1之间的浮点数)img = np.random.rand(*img_size).astype(np.float32)# 随机生成标签(0 或 1)label = np.random.randint(0, 2)self.data.append(img)self.labels.append(label)def __len__(self):return self.num_samplesdef __getitem__(self, idx):# 返回图像和标签img = self.data[idx]label = self.labels[idx]# 将图像转换为 PyTorch 张量,并添加通道维度 (1, H, W)img = torch.tensor(img).unsqueeze(0) # (1, H, W)label = torch.tensor(label).long() # 标签为整数return img, label# 定义 CRNN 模型
class CRNN(nn.Module):def __init__(self, input_channels=1, num_classes=2):super(CRNN, self).__init__()# 卷积层self.conv = nn.Sequential(nn.Conv2d(input_channels, 16, kernel_size=3, stride=1, padding=1), # (B, 16, H, W)nn.ReLU(),nn.MaxPool2d(2, 2), # (B, 16, H/2, W/2)nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1), # (B, 32, H/2, W/2)nn.ReLU(),nn.MaxPool2d(2, 2) # (B, 32, H/4, W/4))# RNN 层self.rnn_input_size = 32 * (img_size[1] // 4) # RNN 输入大小 = 通道数 * 宽度self.rnn = nn.LSTM(self.rnn_input_size, 128, batch_first=True, bidirectional=True) # 双向 LSTM# 全连接层self.fc = nn.Linear(128 * 2, num_classes) # 双向 LSTM 输出大小为 128 * 2def forward(self, x):# 输入 x 的形状: (B, C, H, W)batch_size = x.size(0)# 卷积层x = self.conv(x) # (B, 32, H/4, W/4)# 调整形状以适配 RNN 输入x = x.permute(0, 2, 3, 1) # (B, H/4, W/4, 32)x = x.view(batch_size, -1, self.rnn_input_size) # (B, H/4, 32 * W/4)# RNN 层x, _ = self.rnn(x) # (B, H/4, 128 * 2)# 取最后一个时间步的输出x = x[:, -1, :] # (B, 128 * 2)# 全连接层x = self.fc(x) # (B, num_classes)return x# 设置超参数
img_size = (32, 32) # 图像大小
batch_size = 16
num_epochs = 5
learning_rate = 0.001# 创建数据集和数据加载器
dataset = SimpleImageDataset(num_samples=1000, img_size=img_size)
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)# 初始化模型、损失函数和优化器
model = CRNN(input_channels=1, num_classes=2)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)# 训练模型
for epoch in range(num_epochs):model.train()total_loss = 0for images, labels in dataloader:# 前向传播outputs = model(images)loss = criterion(outputs, labels)# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()total_loss += loss.item()print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {total_loss/len(dataloader):.4f}")# 测试模型
model.eval()
with torch.no_grad():# 从数据集中取一个样本进行测试test_img, test_label = dataset[0]test_img = test_img.unsqueeze(0) # 添加 batch 维度 (1, 1, H, W)output = model(test_img)predicted_label = torch.argmax(output, dim=1).item()print(f"True Label: {test_label}, Predicted Label: {predicted_label}")# 可视化测试图像plt.imshow(test_img.squeeze(0).squeeze(0), cmap="gray")plt.title(f"Predicted: {predicted_label}, True: {test_label}")plt.show()
3. 代码说明
-
数据集:
- 使用了一个简单的自定义数据集
SimpleImageDataset
,生成随机图像和二分类标签。 - 图像大小为
(32, 32)
,标签为0
或1
。
- 使用了一个简单的自定义数据集
-
CRNN 模型:
- 卷积层提取图像的空间特征。
- RNN 层(LSTM)处理序列特征,输入为卷积层输出的特征序列。
- 全连接层将 RNN 的输出映射到二分类结果。
-
训练:
- 使用交叉熵损失函数
CrossEntropyLoss
。 - 优化器为 Adam。
- 使用交叉熵损失函数
-
测试:
- 从数据集中取一个样本,使用训练好的模型进行预测,并可视化结果。
4. 运行结果
运行代码后,你会看到训练过程中的损失值,以及测试样本的预测结果和真实标签。测试图像会以灰度图形式显示。
如果你有任何问题或需要进一步的帮助,请随时告诉我! 😊
2、豆包-1.5pro
下面是一个基于PyTorch框架实现的使用CRNN(Convolutional Recurrent Neural Network)进行图像二分类的示例代码。这个示例假设输入图像为正方形且为灰度图。对于彩色图像,可以简单修改卷积层以便处理3通道数据。
1. 引入必要的库
import torch
import torch.nn as nn
import torchvision.transforms as transforms
from torchvision.datasets import ImageFolder
from torch.utils.data import DataLoader
import torch.optim as optim
from PIL import Image# 用于图像预处理
transform = transforms.Compose([transforms.Resize((32, 32)),transforms.Grayscale(),transforms.ToTensor(),# 将图像数据标准化到[-1, 1]transforms.Normalize((0.5,), (0.5,))
])
2. 定义CRNN模型
class CRNN(nn.Module):def __init__(self):super(CRNN, self).__init__()# 卷积层1,输入通道数1(灰度图),输出通道数16,卷积核大小3x3,步长1,填充1self.conv1 = nn.Conv2d(1, 16, kernel_size=3, stride=1, padding=1)self.relu1 = nn.ReLU()# 最大池化层1,窗口大小2x2,步长2self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)# 卷积层2,输入通道数16,输出通道数32,卷积核大小3x3,步长1,填充1self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)self.relu2 = nn.ReLU()# 最大池化层2,窗口大小2x2,步长2self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)# 展平层,将多维张量展平为一维self.flatten = nn.Flatten()# RNN层,这里使用GRU,输入特征维度32 * 8 * 8 ,隐藏层维度64,1层self.gru = nn.GRU(input_size=32 * 8 * 8, hidden_size=64, num_layers=1, batch_first=True)# 全连接层,将GRU输出的64维向量映射到2维(2个类别)self.fc = nn.Linear(64, 2)def forward(self, x):x = self.pool1(self.relu1(self.conv1(x)))x = self.pool2(self.relu2(self.conv2(x)))x = self.flatten(x)x = x.unsqueeze(1)x, _ = self.gru(x)# 只取GRU最后一个时刻的输出x = x[:, -1, :]x = self.fc(x)return x
3. 定义训练过程
# 创建数据加载器,假设数据按类别存放在data/train目录下
train_dataset = ImageFolder(root='data/train', transform=transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)# 创建模型实例
model = CRNN()# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
num_epochs = 10
for epoch in range(num_epochs):running_loss = 0.0correct = 0total = 0for i, data in enumerate(train_loader, 0):inputs, labels = dataoptimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f'Epoch {epoch + 1}, Loss: {running_loss / len(train_loader)}, 'f'Accuracy: {correct / total * 100}%')
4. 定义预测过程
# 创建测试集数据加载器,假设数据按类别存放在data/test目录下
test_dataset = ImageFolder(root='data/test', transform=transform)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)# 评估模型
correct = 0
total = 0
with torch.no_grad():for data in test_loader:images, labels = dataoutputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f'Accuracy of the network on the test images: {correct / total * 100}%')def predict_single_image(image_path, model):img = Image.open(image_path).convert('L')img = transform(img).unsqueeze(0)with torch.no_grad():output = model(img)_, predicted = torch.max(output.data, 1)return predicted.item()
5. 运行预测
# 预测单个图像,这里假设image.jpg是需要预测的图像
predicted_class = predict_single_image('image.jpg', model)
print(f'Predicted class for single image: {predicted_class}')
代码说明
- 图像预处理:使用
transforms.Compose
将图像调整大小为32x32,转换为灰度图,然后转换为张量并进行标准化。 - CRNN模型:
- 卷积层部分:使用了两个
Conv2d
层和对应的ReLU
激活函数以及MaxPool2d
池化层进行特征提取。Conv2d
层用于学习图像的局部特征,池化层用于降低数据维度。 - RNN层部分:将卷积层输出的数据展平后输入到
GRU
层,学习序列特征(此处将图像数据看成一个序列)。 - 全连接层:将GRU层的输出映射到2个类别,输出最终的分类结果。
- 卷积层部分:使用了两个
- 训练过程:
- 加载训练数据集,使用
ImageFolder
和DataLoader
按批次加载数据。 - 定义损失函数(
CrossEntropyLoss
)和优化器(Adam
)。 - 在每个epoch中,前向传播计算损失,反向传播更新模型参数,并打印每个epoch的损失和准确率。
- 加载训练数据集,使用
- 预测过程:
- 加载测试数据集,对测试集进行评估并打印准确率。
predict_single_image
函数用于对单个图像进行预测,返回预测的类别。
请确保安装了torch
、torchvision
和Pillow
库,可以使用以下命令安装:
pip install torch torchvision pillow
测试和训练数据集的目录结构应如下:
data/
├── train/
│ ├── good_images/
│ │ ├── image1.jpg
│ │ ├── image2.jpg
│ │ └──...
│ └── bad_images/
│ ├── image3.jpg
│ ├── image4.jpg
│ └──...
└── test/├── good_images/│ ├── image5.jpg│ ├── image6.jpg│ └──...└── bad_images/├── image7.jpg├── image8.jpg└──...
在实际应用中,你可以根据具体的数据集和任务需求调整模型架构、超参数等。
3、Qwen-2.5
好的,下面是一个使用CRNN(卷积循环神经网络)提取图像特征并用于二分类任务的PyTorch示例代码。我们将使用一个简单的CRNN模型来实现这个任务。代码中会包含详细的注释说明每一步的操作和向量维度的变化。
首先,确保你已经安装了必要的库:
pip install torch torchvision
以下是完整的代码示例:
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import transforms, datasets
from torch.utils.data import DataLoader# 定义CRNN模型
class CRNN(nn.Module):def __init__(self, num_classes=2, input_size=1024, hidden_size=512, num_layers=2):super(CRNN, self).__0__init__()self.num_classes = num_classesself.hidden_size = hidden_sizeself.num_layers = num_layers# 卷积层self.conv = nn.Sequential(nn.Conv2d(3, 64, kernel_size=(3, 3), padding=(1, 1)),nn.ReLU(),nn.MaxPool2d(kernel_size=(2, 2), stride=(2, 2)), # (B, 64, H/2, W/2)nn.Conv2d(64, 128, kernel_size=(3, 3), padding=(1, 1)),nn.ReLU(),nn.MaxPool2d(kernel_size=(2, 2), stride=(2, 2)), # (B, 128, H/4, W/4)nn.Conv2d(128, 256, kernel_size=(3, 3), padding=(1, 1)),nn.ReLU(),nn.MaxPool2d(kernel_size=(2, 2), stride=(2, 2)), # (B, 256, H/8, W/8)nn.Conv2d(256, 512, kernel_size=(3, 3), padding=(1, 1)),nn.ReLU(),nn.MaxPool2d(kernel_size=(2, 2), stride=(2, 2)) # (B, 512, H/16, W/16))# 计算经过卷积层后的输出尺寸self.fc_input_size = 512 * (32 // 16) * (32 // 16) # 假设输入图像大小为 (B, 3, 32, 32)# 全连接层self.fc = nn.Linear(self.fc_input_size, input_size)# 循环层self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)# 输出层self.fc_out = nn.Linear(hidden_size, num_classes)def forward(self, x):# 卷积层conv_out = self.conv(x) # (B, 512, H/16, W/16)batch_size, channels, height, width = conv_out.size()# 展平conv_out = conv_out.view(batch_size, channels * height, width) # (B, 512*(H/16), W/16)# 全连接层conv_out = conv_out.permute(0, 2, 1) # (B, W/16, 512*(H/16))fc_out = self.fc(conv_out) # (B, W/16, input_size)# 循环层out, _ = self.lstm(fc_out) # (B, W/16, hidden_size)# 取最后一个时间步的输出out = out[:, -1, :] # (B, hidden_size)# 输出层out = self.fc_out(out) # (B, num_classes)return out# 数据预处理
transform = transforms.Compose([transforms.Resize((32, 32)),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])# 加载数据集
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)# 初始化模型、损失函数和优化器
model = CRNN(num_classes=2, input_size=1024, hidden_size=512, num_layers=2)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
num_epochs = 10
for epoch in range(num_epochs):model.train()for i, (images, labels) in enumerate(train_loader):optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()if (i + 1) % 100 == 0:print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {loss.item():.4f}')# 验证模型model.eval()with torch.no_grad():correct = 0total = 0for images, labels in test_loader:outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f'Epoch [{epoch+1}/{num_epochs}], Accuracy: {100 * correct / total:.2f}%')# 保存模型
torch.save(model.state_dict(), 'crnn_model.pth')
代码说明
-
CRNN模型定义:
- 卷积层:使用四个卷积层,每个卷积层后跟着一个ReLU激活函数和一个最大池化层。
- 全连接层:将卷积层的输出展平后通过一个全连接层。
- 循环层:使用LSTM层处理时间序列数据。
- 输出层:将LSTM的输出通过一个全连接层得到最终的分类结果。
-
数据预处理:
- 使用
transforms
对图像进行标准化和resize操作。
- 使用
-
数据加载:
- 使用
datasets.CIFAR10
加载CIFAR-10数据集,并创建数据加载器。
- 使用
-
训练和验证:
- 在每个epoch中,先对模型进行训练,然后在测试集上进行验证,计算分类准确率。
-
保存模型:
- 训练完成后,保存模型的参数到文件。
希望这个示例对你有帮助!如果有任何问题,欢迎随时提问。
4、deepseek-r1:
以下是一个使用CRNN(卷积递归神经网络)进行图像分类的完整代码示例,包括详细的注释和可运行的demo。代码使用PyTorch框架实现。
1. 环境要求
- Python 3.x
- PyTorch 1.x
- torchvision
- matplotlib(可选,用于可视化)
2. 代码实现
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms, datasets
import numpy as np
import matplotlib.pyplot as plt# 定义CRNN模型
class CRNN(nn.Module):def __init__(self, num_classes):super(CRNN, self).__init__()# CNN部分self.cnn = nn.Sequential(# 第一层卷积nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, stride=1, padding=1),# 输出维度:(32, 224, 224)nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2),# 输出维度:(32, 112, 112)# 第二层卷积nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, stride=1, padding=1),# 输出维度:(64, 112, 112)nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2)# 输出维度:(64, 56, 56))# RNN部分self.rnn = nn.Sequential(# LSTM层nn.LSTM(input_size=64*56, hidden_size=128, num_layers=2, batch_first=True))# 分类器self.fc = nn.Linear(128, num_classes)def forward(self, x):# CNN特征提取x = self.cnn(x) # 输出维度:(batch_size, 64, 56, 56)# 将CNN输出展平并调整维度以适应RNNbatch_size = x.size(0)x = x.view(batch_size, -1, 64*56) # 输出维度:(batch_size, 56, 64*56)# RNN处理x, _ = self.rnn(x) # 输出维度:(batch_size, 56, 128)# 取最后一个时间步的输出x = x[:, -1, :] # 输出维度:(batch_size, 128)# 分类x = self.fc(x) # 输出维度:(batch_size, num_classes)return x# 定义数据预处理
transform = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])
])# 自定义数据集(假设数据分为good和bad两类)
class ImageDataset(Dataset):def __init__(self, root_dir, transform=None):self.root_dir = root_dirself.transform = transformself.images = []self.labels = []# 加载good图像good_dir = f"{root_dir}/good"for img_name in os.listdir(good_dir):if img_name.endswith('.jpg'):self.images.append(f"{good_dir}/{img_name}")self.labels.append(0) # good为0# 加载bad图像bad_dir = f"{root_dir}/bad"for img_name in os.listdir(bad_dir):if img_name.endswith('.jpg'):self.images.append(f"{bad_dir}/{img_name}")self.labels.append(1) # bad为1def __len__(self):return len(self.images)def __getitem__(self, idx):img_path = self.images[idx]label = self.labels[idx]image = Image.open(img_path).convert('RGB')if self.transform:image = self.transform(image)return image, label# 数据加载
train_dataset = ImageDataset(root_dir="path_to_train_data", transform=transform)
val_dataset = ImageDataset(root_dir="path_to_val_data", transform=transform)
test_dataset = ImageDataset(root_dir="path_to_test_data", transform=transform)train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=4)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=4)# 初始化模型
model = CRNN(num_classes=2)# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练循环
num_epochs = 10for epoch in range(num_epochs):model.train()running_loss = 0.0for images, labels in train_loader:# 前向传播outputs = model(images)loss = criterion(outputs, labels)# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()running_loss += loss.item()# 打印训练损失print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader)}")# 验证model.eval()val_loss = 0.0val_correct = 0with torch.no_grad():for images, labels in val_loader:outputs = model(images)loss = criterion(outputs, labels)val_loss += loss.item()_, predicted = torch.max(outputs.data, 1)val_correct += (predicted == labels).sum().item()val_accuracy = val_correct / len(val_dataset)print(f"Validation Loss: {val_loss/len(val_loader)}, Accuracy: {val_accuracy}")# 测试
model.eval()
test_correct = 0
with torch.no_grad():for images, labels in test_loader:outputs = model(images)_, predicted = torch.max(outputs.data, 1)test_correct += (predicted == labels).sum().item()test_accuracy = test_correct / len(test_dataset)
print(f"Test Accuracy: {test_accuracy}")# 可视化示例
def visualize_example():# 加载测试图像test_images, test_labels = next(iter(test_loader))outputs = model(test_images)_, predicted = torch.max(outputs.data, 1)plt.figure(figsize=(16, 8))for i in range(4):plt.subplot(2, 4, i+1)img = test_images[i].numpy().transpose(1, 2, 0)img = (img * [0.229, 0.224, 0.225]) + [0.485, 0.456, 0.406]plt.imshow(img)plt.title(f"Predicted: {predicted[i].item()}, Actual: {test_labels[i].item()}")plt.axis('off')plt.show()visualize_example()
3. 代码说明
1. 模型结构
- CNN部分:用于提取图像特征,包含两个卷积层和两个最大池化层。
- RNN部分:使用LSTM处理序列特征,提取时序信息。
- 分类器:全连接层用于最终分类。
2. 数据预处理
- 图像resize到224x224
- 转换为Tensor
- 标准化处理
3. 数据集
- 自定义数据集类
ImageDataset
,支持自定义数据路径。 - 数据分为
good
和bad
两类,分别对应标签0和1。
4. 训练与验证
- 使用交叉熵损失函数
CrossEntropyLoss
- 优化器选择Adam
- 每个epoch进行训练和验证,打印损失和准确率。
5. 测试与可视化
- 在测试集上评估模型性能。
- 随机选择4张测试图像进行可视化,显示预测结果与真实标签。
4. 使用说明
- 替换
path_to_train_data
、path_to_val_data
和path_to_test_data
为实际数据路径。 - 确保数据目录结构如下:
train_data/good/img1.jpgimg2.jpg...bad/imgA.jpgimgB.jpg... val_data/good/...bad/... test_data/good/...bad/...
- 运行代码,训练模型并查看结果。
5. 依赖安装
pip install torch torchvision matplotlib
希望这段代码对您有所帮助!如果需要进一步调整或优化,可以根据具体需求修改网络结构、优化器参数或数据预处理步骤。
相关文章:
让大模型帮我设计crnn网络及可运行demo,gpt4o豆包qwendeepseek-r1
prompt 使用 crnn 提取图像特征,给出图像好坏的二分类结果,写清楚代码备注,注释清楚向量维度大小,并给出一个可运行的 demo1、GPT-4o 以下是一个使用 CRNN(Convolutional Recurrent Neural Network)提取图…...
代码随想录-- 第一天图论 --- 岛屿的数量
99 统计岛屿的数量 c 99. 岛屿数量 #include <iostream> #include <vector> #include <queue>using namespace std;struct MGraph {int numVertices, numEdges;vector<vector<int>> Edge; };int dir[4][2] {{1, 0}, {0, 1}, {-1, 0}, {0, -1}…...

Mybatis MyBatis框架的缓存 一级缓存
1. 缓存的概念 缓存的概念 在内存中临时存储数据,速度快,可以减少数据库的访问次数。经常需要查询,不经常修改的数据,不是特别重要的数据都适合于存储到缓存中。 2.Mybatis缓存 mybatis包含了一个非常强大的查询缓存特性&#…...

Weboffice在线Word权限控制:限制编辑,只读、修订、禁止复制等
在现代企业办公中,文档编辑是一项常见且重要的任务。尤其是在线办公环境中,员工需要在网页中打开和编辑文档,但如何确保这些文档只能进行预览而无法被编辑或复制,成为许多企业面临的一个痛点。尤其是在处理涉密文档时,…...

RT-Thread+STM32L475VET6实现呼吸灯
文章目录 前言一、板载资源资源说明二、具体步骤1.新建rt_thread项目2. 打开PWM设备驱动3. 在Stm32CubeMX配置定时器3.1打开Stm32CubeMX3.2 使用外部高速时钟,并修改时钟树3.3打开定时器1,并配置通道一为PWM输出模式(定时器根据自己需求调整)3.4 打开串口…...
【Web前端开发精品课 HTML CSS JavaScript基础教程】第二十四章课后题答案
文章目录 问题1:问题2:问题3: 问题1: 在HTML中嵌入JavaScript,应该使用的标签是( )。 选项: A. <style></style> B. <script></script> C. <js><…...

记录 pycharm 无法识别提示导入已有的模块解决方案 No module named ‘xxx‘
在windows下,使用pycharm开发项目,每个项目都有自己独立的虚拟环境,有时候就会出现,在该项目中明明已经安装了某个模块,但是在写代码的时候就是导入不了,无法识别导入,在运行的时候却又是正常的…...

网工项目实践2.6 广域网需求分析及方案制定
本专栏持续更新,整一个专栏为一个大型复杂网络工程项目。阅读本文章之前务必先看《本专栏必读》。 全网拓扑展示 一.广域网互联方式 1.专线 优点 稳定 独享。绝对安全。可靠性高,带宽高,完全取决于终端接口。 缺点: 费用高。建设时间长。难…...

【架构】分层架构 (Layered Architecture)
一、分层模型基础理论 模型是一种常见的软件设计架构,它将软件系统按照功能划分为不同的层次,每个层次都有特定的职责和功能…...
玩客云 IP查找
1.玩客云使用静态IP在不同网段路由器下不能使用,动态不好找IP地址 1.1使用python3 实现自动获取发送 import requests import os import socket# 从环境变量获取 PushPlus 的 token 和群组编码 PUSH_PLUS_TOKEN os.getenv("PUSH_PLUS_TOKEN") PUSH_PLU…...
Android - Handler使用post之后,Runnable没有执行
问题:子线程创建的Handler。如果 post 之后,在Handler.removeCallbacks(run)移除了,下次再使用Handler.postDelayed(Runnable)接口或者使用post时,Runnable是没有执行。导致没有收到消息。 解决办法:只有主线程创建的…...

MyBatis-Plus之通用枚举
MyBatis-Plus之通用枚举 前言 MyBatis-Plus中提供了通用枚举,简单来说就是将数据库中的某一字段的代替的含义转换成真实的含义将数据展示给用户,用户在存储时也会将真实值转换成代替的数字存入到数据库中。举个例子:用户性别在数据库中存储…...

基于Spring Boot的图书管理系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

如何在 VS Code 中快速使用 Copilot 来辅助开发
在日常开发中,编写代码往往是最耗时的环节之一。而 GitHub Copilot,作为一款 AI 编码助手,可以帮助开发者 自动补全代码、生成代码片段,甚至直接编写完整的函数,大幅提升编码效率。那么,如何在 VS Code 中快…...
12.1 Android中协程的基本使用
文章目录 前言1、导入依赖2、使用协程获取服务器中的数据2.1 定义请求回调结果的数据类2.2 网络请求 3、网络回调结构4、通过ViewModel处理网络请求数据 前言 在使用协程的时候一直没有一个具体的概念,只知道协程能够使得异步操作等同于同步操作,且不会…...

【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步
【黑马点评优化】2-Canel实现多级缓存(RedisCaffeine)同步 0 背景1 配置MySQL1.1 开启MySQL的binlog功能1.1.1 找到mysql配置文件my.ini的位置1.1.2 开启binlog 1.2 创建canal用户 2 下载配置canal2.1 canal 1.1.5下载2.2 配置canal2.3 启动canal2.4 测试…...

php-fpm
摘要 php-fpm(fastcgi process manager)是PHP 的FastCGI管理器,管理PHP的FastCGI进程,提升PHP应用的性能和稳定性 php-fpm是一个高性能的php FastCGI管理器,提供了更好的php进程管理方式,可以有效的控制内存和进程,支…...
Python3测试开发面试题2
python的内存池机制 在Python中,内存管理是通过Python的内存管理器和C语言实现的,特别是依赖于CPython的实现。CPython使用一种名为“内存池”(memory pool)的技术来优化小对象(如小整数、短字符串等)的内…...

qt + opengl 给立方体增加阴影
在前几篇文章里面学会了通过opengl实现一个立方体,那么这篇我们来学习光照。 风氏光照模型的主要结构由3个分量组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的样子: 1 环境光照(Ambient …...
Webpack,Vite打包的理解
Webpack 和 Vite 都是现代前端开发中常用的构建工具,用于打包和优化项目代码。尽管它们的目标相似,但在设计理念、工作方式和适用场景上存在显著差异。 Webpack Webpack 是一个模块打包工具,主要用于将多个模块(如 JavaScript、…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...