-
神經網絡 非線性激活層
作用:增強模型的非線性擬合能力
非線性激活層網絡:
class activateNet(nn.Module):def __init__(self):super(activateNet,self).__init__()self.relu = nn.ReLU()self.sigmoid = nn.Sigmoid()def forward(self,input):#output = self.relu(input)output = self.sigmoid(input)return outputactivatenet = activateNet()
relu:
sigmoid:
完整代碼:
這里是將上一步池化層的輸出作為非線性激活層的輸入
code:
import torch import torchvision from torch import nn from torch.nn import Conv2d, MaxPool2d from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter from torchvision.datasets import ImageFolder from torchvision import transforms#數據預處理 transform = transforms.Compose([transforms.Resize((224,224)),transforms.ToTensor(),transforms.Normalize(mean = [0.5,0.5,0.5],std = [0.5,0.5,0.5]) ])#加載數據集 folder_path = '../images' dataset = ImageFolder(folder_path,transform=transform) dataloader = DataLoader(dataset,batch_size=1)#卷積 class convNet(nn.Module):def __init__(self):#調用父類nn.Module的構造函數super(convNet,self).__init__()self.conv1 = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)def forward(self,x):x = self.conv1(x)return xconvnet = convNet()#池化 class poolNet(nn.Module):def __init__(self):super(poolNet,self).__init__()#ceil_mode=True表示邊緣不滿3x3的部分也會被池化#kernel_size=3 默認是卷積核的大小self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=True)self.maxpool2 = MaxPool2d(kernel_size=3,ceil_mode=False)def forward(self,input):output = self.maxpool1(input)#output = self.maxpool2(input)return outputpoolnet = poolNet()#非線性激活層(這里使用relu、sigmoid) class activateNet(nn.Module):def __init__(self):super(activateNet,self).__init__()self.relu = nn.ReLU()self.sigmoid = nn.Sigmoid()def forward(self,input):#output = self.relu(input)output = self.sigmoid(input)return outputactivatenet = activateNet()writer = SummaryWriter('../logs')cnt = 0 for data in dataloader:img,label = dataprint(img.shape)conv_output = convnet(img)print(conv_output.shape)writer.add_images('input',img,cnt)conv_output = torch.reshape(conv_output,(-1,3,222,222))writer.add_images('conv_output',conv_output,cnt)pool_output = poolnet(conv_output)writer.add_images('pool_output',pool_output,cnt)activate_output = activatenet(pool_output)writer.add_images('activate_output',activate_output,cnt)cnt = cnt + 1writer.close()
-
神經網絡 正則化層
防止過擬合
比較簡單 不寫了
這這里區別幾個概念:
- 歸一化:將數據映射到特定區間(如[0,1]或[-1,1])的過程,常見方法如min-max歸一化,通過減去最小值并除以極差實現。其目的是消除不同特征量綱差異的影響,使數據處于統一量級,便于模型快速收斂,例如將圖像像素值從0-255轉換為0-1。
- 標準化:將數據轉換為均值為0、標準差為1的分布,即通過減去均值并除以標準差實現(z-score標準化)。它能讓數據更符合正態分布,降低異常值對模型的影響,常用于線性回歸、SVM等對數據分布敏感的算法中。
- 正則化:在模型訓練中加入額外約束(如L1、L2范數)以防止過擬合的技術。L1正則化通過懲罰權重絕對值,可產生稀疏權重;L2正則化(權重衰減)懲罰權重平方,使權重更平滑。其核心是平衡模型復雜度與擬合能力,提升泛化性能。
-
神經網絡 線性層(全連接層)
輸入為上一步非線性激活層的輸出
線性層:
code:
class linearNet(nn.Module):def __init__(self):super(linearNet,self).__init__()#in_features(根據下面展開后輸出的數值) 表示輸入特征的維度,out_features=10 表示輸出特征的維度self.linear = nn.Linear(32856,10)def forward(self,input):output = self.linear(input)return outputlinearnet = linearNet()
in_features:
#為了得到in_featuresprint(torch.reshape(activate_output,(1,1,1,-1)).shape)
完整代碼:
code:
import torch import torchvision from torch import nn from torch.nn import Conv2d, MaxPool2d from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter from torchvision.datasets import ImageFolder from torchvision import transforms#數據預處理 transform = transforms.Compose([transforms.Resize((224,224)),transforms.ToTensor(),transforms.Normalize(mean = [0.5,0.5,0.5],std = [0.5,0.5,0.5]) ])#加載數據集 folder_path = '../images' dataset = ImageFolder(folder_path,transform=transform) #drop_last=True 表示最后一個batch可能小于batch_size,不足的部分會被丟棄 #dataloader = DataLoader(dataset,batch_size=1,drop_last=True) dataloader = DataLoader(dataset,batch_size=1)#卷積 class convNet(nn.Module):def __init__(self):#調用父類nn.Module的構造函數super(convNet,self).__init__()self.conv1 = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)def forward(self,x):x = self.conv1(x)return xconvnet = convNet()#池化 class poolNet(nn.Module):def __init__(self):super(poolNet,self).__init__()#ceil_mode=True表示邊緣不滿3x3的部分也會被池化#kernel_size=3 默認是卷積核的大小self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=True)self.maxpool2 = MaxPool2d(kernel_size=3,ceil_mode=False)def forward(self,input):output = self.maxpool1(input)#output = self.maxpool2(input)return outputpoolnet = poolNet()#非線性激活層(這里使用relu、sigmoid) class activateNet(nn.Module):def __init__(self):super(activateNet,self).__init__()self.relu = nn.ReLU()self.sigmoid = nn.Sigmoid()def forward(self,input):#output = self.relu(input)output = self.sigmoid(input)return outputactivatenet = activateNet()#線性層(全連接層) class linearNet(nn.Module):def __init__(self):super(linearNet,self).__init__()#in_features(根據下面展開后輸出的數值) 表示輸入特征的維度,out_features=10 表示輸出特征的維度self.linear = nn.Linear(32856,10)def forward(self,input):output = self.linear(input)return outputlinearnet = linearNet()writer = SummaryWriter('../logs')cnt = 0 for data in dataloader:img,label = dataprint(img.shape)conv_output = convnet(img)print(conv_output.shape)writer.add_images('input',img,cnt)conv_output = torch.reshape(conv_output,(-1,3,222,222))writer.add_images('conv_output',conv_output,cnt)pool_output = poolnet(conv_output)writer.add_images('pool_output',pool_output,cnt)activate_output = activatenet(pool_output)writer.add_images('activate_output',activate_output,cnt)#為了得到in_featuresprint(torch.reshape(activate_output,(1,1,1,-1)).shape)#flatten:展開成一維數組linear_output = torch.flatten(activate_output)linear_output = linearnet(linear_output)print(linear_output.shape)cnt = cnt + 1writer.close()