np.concatenate、torch.split()

本文介绍了numpy的concatenate函数用于一维和二维数组的拼接,以及torch中的split函数用于tensor的分割,stack函数用于tensor的堆叠,并提及了torch.nn.functional.normalize用于tensor的归一化处理。示例代码展示了不同参数设置下的操作效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,np.concatenate

np.concatenate 是numpy中对array进行拼接的函数
参考
numpy.concatenate((a1, a2, …), axis=0, out=None, dtype=None, casting=“same_kind”)

对于一维数组拼接,axis的值不影响最后的结果

axis =1 axis=1为行数不变列拼接

axis =0 axis=0为列数不变行拼接

参数

A1,A2,…阵列序列数组必须具有相同的形状

# 行数不变,列数相加
a=np.array([[1,2,3]])
b=np.array([[11,21]])
d = np.concatenate((a,b),axis=1) # 默认情况下,axis=0可以不写
print(d)

d=array([[1,2,3,11,21]])

2,torch.split()

参考
torch.split(tensor, split_size_or_sections, dim=0)

torch.split()作用将tensor分成块结构。

参数:

tesnor:input,待分输入
split_size_or_sections:需要切分的大小(int or list )
dim:切分维度


import torch
 
x = torch.rand(4,8,6)
y = torch.split(x,2,dim=0) #在第0维度去分,每块包含2个小块
for i in y :
    print(i.size())
 

output:
torch.Size([2, 8, 6])
torch.Size([2, 8, 6])

3,torch.stack()

参考

4,torch.stack([x, x],dim=x).max(dim)

参考
其实就是在相应的维度上找最大值,然后维度信息会恢复到堆叠前的维度信息。

5,torch.nn.functional.normalize

参考

import scipy.io import numpy as np import torch import torch.nn as nn from torch.utils.data import DataLoader, TensorDataset 1. 加载MAT文件(保持不变) def load_matlab_data(file_path): data = scipy.io.loadmat(file_path) csi = np.squeeze(data[‘csi’]) allocations = np.squeeze(data[‘allocations’]) symbols = np.squeeze(data[‘symbols_with_channel’]) snr = np.squeeze(data[‘snr’]) return csi, allocations, symbols, snr 2. 数据预处理(重构后) def preprocess_data(csi, allocations, snr): csi_abs = np.abs(csi) snr_expanded = np.expand_dims(snr, axis=1).repeat(csi_abs.shape[1], axis=1) X = np.concatenate([csi_abs, snr_expanded], axis=-1) y = allocations return X, y 3. 定义LSTM模型(修正后) class LSTMModel(nn.Module): def init(self, input_dim, hidden_dim, output_dim, num_layers=2): super().init() self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers, batch_first=True) self.fc = nn.Linear(hidden_dim, output_dim) def forward(self, x): out, _ = self.lstm(x) return self.fc(out) 4. 训练与验证(修正后) def train_model(model, X_train, y_train, num_epochs=50, batch_size=32, lr=1e-3): dataset = TensorDataset( torch.tensor(X_train, dtype=torch.float32), torch.tensor(y_train, dtype=torch.long) ) dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True) criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=lr) for epoch in range(num_epochs): model.train() total_loss = 0 for batch_X, batch_y in dataloader: optimizer.zero_grad() outputs = model(batch_X) loss = criterion(outputs.permute(0, 2, 1), batch_y) loss.backward() optimizer.step() total_loss += loss.item() if (epoch + 1) % 10 == 0: print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {total_loss/len(dataloader):.4f}') def evaluate_model(model, X_test, y_test): model.eval() with torch.no_grad(): outputs = model(torch.tensor(X_test, dtype=torch.float32)) preds = outputs.argmax(dim=-1) accuracy = (preds == torch.tensor(y_test, dtype=torch.long)).float().mean() print(f’Test Accuracy: {accuracy.item():.4f}') 主函数(修正数据划分) def main(): csi, allocations, _, snr = load_matlab_data(‘ofdm_dataset_with_channel.mat’) X, y = preprocess_data(csi, allocations, snr) # 按时间顺序划分 split_idx = int(0.8 * len(X)) X_train, X_test = X[:split_idx], X[split_idx:] y_train, y_test = y[:split_idx], y[split_idx:] model = LSTMModel( input_dim=X_train.shape[-1], # 输入维度为 num_users + 1 hidden_dim=128, output_dim=np.max(allocations) + 1 # 类别数 ) train_model(model, X_train, y_train) evaluate_model(model, X_test, y_test) if name == ‘main’: main()修改bug
最新发布
03-17
import scipy.io import numpy as np import torch import torch.nn as nn from torch.utils.data import DataLoader, TensorDataset from sklearn.model_selection import train_test_split # 1. 加载MAT文件 def load_matlab_data(file_path): data = scipy.io.loadmat(file_path) csi = np.squeeze(data['csi']) # [num_samples, num_subcarriers, num_users] allocations = np.squeeze(data['allocations']) # [num_samples, num_subcarriers] symbols = np.squeeze(data['symbols_with_channel']) snr = np.squeeze(data['snr']) return csi, allocations, symbols, snr # 2. 数据预处理 def preprocess_data(csi, allocations, snr): X = np.concatenate([ np.abs(csi).reshape(csi.shape[0], -1), snr.reshape(-1, 1) ], axis=1) y = allocations return X, y # 3. 定义LSTM模型 class LSTMModel(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim, num_layers=2): super().__init__() self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers, batch_first=True) self.fc = nn.Linear(hidden_dim, output_dim) def forward(self, x): out, _ = self.lstm(x) # [batch_size, seq_length=1, hidden_dim] out = self.fc(out) # [batch_size, seq_length=1, output_dim] return out.squeeze(1) # [batch_size, output_dim] # 4. 训练与验证 def train_model(model, X_train, y_train, num_epochs=50, batch_size=32, lr=1e-3): dataset = TensorDataset( torch.tensor(X_train, dtype=torch.float32), torch.tensor(y_train, dtype=torch.long) ) dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True) criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=lr) for epoch in range(num_epochs): model.train() total_loss = 0 for batch_X, batch_y in dataloader: optimizer.zero_grad() outputs = model(batch_X.unsqueeze(1)) # [batch_size, output_dim] outputs_flat = outputs.view(-1, outputs.shape[-1]) targets_flat = batch_y.view(-1) loss = criterion(outputs_flat, targets_flat) loss.backward() optimizer.step() total_loss += loss.item() if (epoch + 1) % 10 == 0: print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {total_loss/len(dataloader):.4f}') def evaluate_model(model, X_test, y_test): model.eval() with torch.no_grad(): outputs = model(torch.tensor(X_test, dtype=torch.float32).unsqueeze(1)) outputs_flat = outputs.view(-1, outputs.shape[-1]) targets_flat = torch.tensor(y_test, dtype=torch.long).view(-1) accuracy = (outputs_flat.argmax(1) == targets_flat).float().mean() print(f'Test Accuracy: {accuracy.item():.4f}') # 主函数 def main(): csi, allocations, _, snr = load_matlab_data('ofdm_dataset_with_channel.mat') X, y = preprocess_data(csi, allocations, snr) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) model = LSTMModel( input_dim=X_train.shape[1], hidden_dim=128, output_dim=np.max(allocations) + 1 ) train_model(model, X_train, y_train) evaluate_model(model, X_test, y_test) if __name__ == '__main__': main()找到问题
03-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值