本科做的科研项目是基于深度学习的自动调制识别技术,在接触深度学习时,在数据处理、性能分析方面遇到了许多问题,此博客用于记录。
数据处理
import torch # 导入PyTorch库
import pickle # 导入pickle库
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import torch.optim as optim
import numpy as np
import torch.optim as optim
import torch.nn as nn
import torch.nn.functional as F
import torch, gc
import random
import matplotlib.pyplot as plt
from torch.utils.data import DataLoader, TensorDataset
from torchvision.utils import save_image
from torch.utils.data import Dataset
gc.collect()
torch.cuda.empty_cache()
def to_onehot(yy):
yy1 = np.zeros([len(yy), max(yy) + 1])
yy1[np.arange(len(yy)), yy] = 1
return yy1
def setup_seed(seed):
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
np.random.seed(seed)
random.seed(seed)
torch.backends.cudnn.deterministic = True
# 设置随机数种子
setup_seed(624)
def to_onehot(yy):
yy1 = np.zeros([len(yy), max(yy) + 1])
yy1[np.arange(len(yy)), yy] = 1
return yy1
Xd = pickle.load(open("RML2016.10a_dict.pkl", 'rb'), encoding='latin')
snrs, mods = map(lambda j: sorted(list(set(map(lambda x: x[j], Xd.keys())))), [1, 0])
X = []
lbl = []
for mod in mods:
for snr in snrs:
X.append(Xd[(mod, snr)])
for i in range(Xd[(mod, snr)].shape[0]):
lbl.append((mod, snr))
X = np.vstack(X)
# 计算各部分数据集的比例
train_ratio = 0.4
val_ratio = 0.3
test_ratio = 0.3
# 设置随机种子
n_examples = X.shape[0]
n_train = int(n_examples * train_ratio)
n_val = int(n_examples * val_ratio)
n_test = n_examples - n_train - n_val
# 创建随机索引
idx = np.random.permutation(n_examples)
train_idx = idx[:n_train]
val_idx = idx[n_train:n_train+n_val]
test_idx = idx[n_train+n_val:]
# 划分数据集
X_train = X[train_idx]
X_val = X[val_idx]
X_test = X[test_idx]
print(X_train.shape)
trainy = list(map(lambda x: mods.index(lbl[x][0]), train_idx))
Y_train = torch.tensor(trainy)
valy = list(map(lambda x: mods.index(lbl[x][0]), val_idx))
valy = torch.tensor(valy)
testy = list(map(lambda x: mods.index(lbl[x][0]), test_idx))
testy = torch.tensor(testy)
X_train = torch.tensor(X[train_idx]).view(len(train_idx),1,2,128)
X_val = torch.tensor(X[val_idx]).view(len(val_idx),1,2,128)
X_test = torch.tensor(X[test_idx]).view(len(test_idx),1,2,128)
# 将维度从[𝑁,2,128]调整为[𝑁,1,2,128]
print(X_train.shape,Y_train.shape)
#数据归一化
print(testy[1024])
将IQ数据归一化
切记,数据喂入网络前一定要进行归一化,刚开始学习时发现未对数据归一化,数据的分布差异较大,因此网络无法学习。
# 获得A/P特征
def toAP(iqdata):
data = iqdata
data = torch.sqrt(iqdata[:,:,0,:]**2+iqdata[:,:,1,:]**2)
phase = torch.atan(iqdata[:,:,1,:]/iqdata[:,:,0,:])
#增加一个维度
data = data.un