修改網絡
神經網絡入門—自定義網絡-CSDN博客
修改數據集,y=x^2
# 生成一些示例數據
x_train = torch.tensor([[1.0], [2.0], [3.0], [4.0]], dtype=torch.float32)
y_train = torch.tensor([[1.0], [4.0], [9.0], [16.0]], dtype=torch.float32)
將預測代碼改為,可以接收用戶輸入并輸出
# 加載模型
loaded_model = Net()
loaded_model.load_state_dict(torch.load('model.pth'))
loaded_model.eval() # 將模型設置為評估模式
while True:# 輸入新數據進行預測num=float(input())new_input = torch.tensor([[num]], dtype=torch.float32)with torch.no_grad():prediction = loaded_model(new_input)print(f"輸入 {new_input.item()} 的預測結果: {prediction.item()}")
結果
分析
訓練數據x為[1.0,2.0,3.0,4.0]
x為3.0和3.5時,測試數據與訓練數據較為接近,模型能較為準確預測結果
x為5.0和10.0時,測試數據與訓練數據有一定差別,模型預測結果比較不準確
x為-1時,模型預測為負數,實際應為正數,因為我們的訓練集沒有負數,所以模型沒有學到這點
重新設計網絡
增加-100-100數據集
# 生成 -100 到 100 范圍內的 x
x_train = torch.arange(-100, 101, dtype=torch.float32).unsqueeze(1)
# 計算對應的 y,假設 y 是 x 的平方
y_train = x_train ** 2
Loss收斂慢,網絡不能擬合實際函數
即時增加到3000次迭代仍然不能解決問題/(ㄒoㄒ)/~~
問題:
- 模型結構過于簡單:當前模型僅包含兩個全連接層,對于擬合?\(y = x^2\)?這樣的非線性函數,可能表達能力不夠。可以增加網絡的深度和寬度,例如添加更多的隱藏層。
- 學習率不合適:學習率太大可能會使訓練過程不穩定,太小則會導致收斂速度過慢。可以嘗試使用自適應學習率的優化器,如 Adam。
- 訓練輪數不足:可以適當增加訓練輪數,讓模型有更多的機會學習數據的特征。
增加網絡層數
class Net(nn.Module):def __init__(self):super().__init__()# 增加網絡的寬度和深度self.fc1 = nn.Linear(1, 20)self.fc2 = nn.Linear(20, 20)self.fc3 = nn.Linear(20, 20)self.fc4 = nn.Linear(20, 20)self.fc5 = nn.Linear(20, 1)def forward(self, x):x = self.fc1(x)x = F.relu(x)x = self.fc2(x)x = F.relu(x)x = self.fc3(x)x = F.relu(x)x = self.fc4(x)x = F.relu(x)x = self.fc5(x)return x
增加神經元個數
class Net(nn.Module):def __init__(self):super().__init__()# 增加網絡的寬度和深度self.fc1 = nn.Linear(1, 200)self.fc2 = nn.Linear(200, 200)self.fc3 = nn.Linear(200, 200)self.fc4 = nn.Linear(200, 200)self.fc5 = nn.Linear(200, 1)def forward(self, x):x = self.fc1(x)x = F.relu(x)x = self.fc2(x)x = F.relu(x)x = self.fc3(x)x = F.relu(x)x = self.fc4(x)x = F.relu(x)x = self.fc5(x)return x
Loss波動,疑似出現過擬合