使用pytorch创建resnet模型
环境 win11 rtx3060
anaconda 2020.07
tensorflow 2.4.1
cuda 11.1
cndnn 8.0.5
python 3.8
pytorch 1.8
tensorflow-addons 0.15.0
pandas 1.3.5
seaborn 0.11.2
numpy 1.19.5
pytorch=1.8
导入数据
https://blog.csdn.net/ChaoFeiLi/article/details/109764566
加载数据
data = np.load('data.npz')
data_features = data['data_features']
data_labels = data['data_labels']
切割数据
random_state=26
x_train, x_test, y_train_onehot, y_test_onehot = train_test_split(data_features, data_labels, test_size=0.3,
random_state=random_state)
x_test, x_val, y_test_onehot, y_val_onehot = train_test_split(x_test, y_test_onehot, test_size=0.3,
random_state=random_state)
转化为tensor
x_train, y_train_onehot,x_test,y_test_onehot,x_val,y_val_onehot= \
torch.as_tensor(x_train),torch.as_tensor(y_train_onehot),torch.as_tensor(x_test),\
torch.as_tensor(y_test_onehot),torch.as_tensor(x_val),torch.as_tensor(y_val_onehot)
将数据和标签放一块
# 定义CustomDataset类,继承Dataset方法,并重写__getitem__()和__len__()方法
class CustomDataset(torch.utils.data.Dataset):
# 初始化函数,得到数据
def __init__(self, Data, Label):
self.data = Data # 传入了dataset X的路径,并使用np.load进行加载数据
self.label = Label # 传入了label Y的路径
# index是根据batchsize划分数据后得到的索引,最后将data和对应的labels进行一起返回
def __getitem__(self, index):
data = self.data[index]
labels = self.label[index]
return data, labels
# 该函数返回数据大小长度,目的是DataLoader方便划分,如果不知道大小,DataLoader会一脸懵逼
def __len__(self):
return len(self.data)
train_data = CustomDataset(x_train, torch.argmax(y_train_onehot, -1))
test_data = CustomDataset(x_test, torch.argmax(y_test_onehot, -1))
val_data = CustomDataset(x_val, torch.argmax(y_val_onehot, -1))
读取数据
train_data = DataLoader(train_data, batch_size=128, shuffle=True, drop_last=False, num_workers=0)
val_data = DataLoader(val_data, batch_size=128, shuffle=True, drop_last=False, num_workers=0)
test_data = DataLoader(test_data, batch_size=128, shuffle=True, drop_last=False, num_workers=0)
自适应学习率
https://blog.csdn.net/qq_41554005/article/details/119879911
在ResNet网络中添加注意力机制
注意点:因为不能改变ResNet的网络结构,所以CBAM不能加在block里面(也可以加在block里面,此时网络不能加载预训练参数),因为加在block里面网络结构发生了变化,所以不能用预训练参数。加在最后一层卷积和第一层卷积不改变网络,可以用预训练参数。
https://blog.csdn.net/qq_37278761/article/details/117249138
保存数据
https://blog.csdn.net/qq_24193303/article/details/107756245