import torch import torch.nn as nn import torch.nn.functional as F class FoodCNN(nn.Module): def __init__(self): super(FoodCNN, self).__init__() # 第一个卷积块 self.conv1 = nn.Conv2d(3, 32, 3, padding=1) self.conv2 = nn.Conv2d(32, 32, 3, padding=1) self.pool1 = nn.MaxPool2d(2, 2) self.dropout1 = nn.Dropout2d(0.25) # 第二个卷积块 self.conv3 = nn.Conv2d(32, 64, 3, padding=1) self.conv4 = nn.Conv2d(64, 64, 3, padding=1) self.pool2 = nn.MaxPool2d(2, 2) self.dropout2 = nn.Dropout2d(0.25) # 第三个卷积块 self.conv5 = nn.Conv2d(64, 128, 3, padding=1) self.conv6 = nn.Conv2d(128, 128, 3, padding=1) self.pool3 = nn.MaxPool2d(2, 2) self.dropout3 = nn.Dropout2d(0.25) # 全连接层 self.fc1 = nn.Linear(128 * 4 * 4, 512) self.dropout4 = nn.Dropout(0.5) self.fc2 = nn.Linear(512, 2) # 2分类 def forward(self, x): # 第一个卷积块 x = F.relu(self.conv1(x)) x = F.relu(self.conv2(x)) x = self.pool1(x) x = self.dropout1(x) # 第二个卷积块 x = F.relu(self.conv3(x)) x = F.relu(self.conv4(x)) x = self.pool2(x) x = self.dropout2(x) # 第三个卷积块 x = F.relu(self.conv5(x)) x = F.relu(self.conv6(x)) x = self.pool3(x) x = self.dropout3(x) # 展平 x = x.view(-1, 128 * 4 * 4) # 全连接层 x = F.relu(self.fc1(x)) x = self.dropout4(x) x = self.fc2(x) return x # 1. 初始化模型 model = FoodCNN() # 2. 加载训练好的权重 model.load_state_dict(torch.load("../model/01/best_food_model.pth", map_location='cpu')) model.eval() # 设置为推理模式 # 3. 创建示例输入 (假设输入是 3x224x224 的图片) example_input = torch.randn(1, 3, 224, 224) # 4. 转换为 TorchScript traced_script_module = torch.jit.trace(model, example_input) traced_script_module.save("../model/01/best_food_model_mobile.pt")