Ich recherchiere mit DNN.
Nach einem Jahr habe ich das Gefühl, endlich die beste Vorgehensweise für das Projektmanagement gefunden zu haben, also werde ich sie offenlegen.
Da Onedrive eine Versicherung ist, wenn eine Datei plötzlich abbläst, denke ich, dass GitHub im Grunde genug ist.
program/
├ dataset/
│ ├ dev/
│ └ test/
└ src/
├ common/
│ ├ hoge.py
│ ├ fuga.py
│ ├ ...
├ method_xxx/
│ ├ output/
│ │ ├ YYYYMMDD_ID/
│ │ │ ├ loss/
│ │ │ │ ├ training_loss.npy
│ │ │ │ └ validation_loss.npy
│ │ │ ├ prediction/
│ │ │ │ ├ img/
│ │ │ │ ├ wav/
│ │ │ │ ├ ...
│ │ │ ├ condition.json
│ │ │ ├ model.pth
│ │ │ └ network.txt
│ │ ├ YYYYMMDD_ID/
│ │ ├ ...
│ ├ generate_dataset.py
│ ├ dataset_loader.py
│ ├ dnn_model.py
│ ├ dnn_training.py
│ ├ dnn_evaluation.py
│ ├ training_config.json
│ └ evaluation_config.json
├ method_zzz/
├ ...
method_xxx / method_zzz
: DNN-Modelle und -Datensätze werden auf verschiedene Arten erstellt, sodass Ordner entsprechend erstellt werden.common
: Enthält Module, die von jeder Methode gemeinsam verwendet werden.method_xxx / output /
: Das Lernergebnis und das Inferenzergebnis werden hier ausgespuckt.YYYYMMDD_ID / network.txt
: Beschreibt die Netzwerkstruktur des erstellten Modells. Die von PyTorch definierte Instanz des Modells wird unverändert ausgegeben.DNN-Modellstruktur ausgeben
class Model(nn.Module):
def __init__(self, in_units, hidden_units, out_units):
super(Model, self).__init__()
self.l1 = nn.Linear(in_units, hidden_units)
self.a1 = nn.ReLU()
self.l2 = nn.Linear(hidden_units, hidden_units)
self.a2 = nn.ReLU()
def forward(self, x):
x = self.a1(self.l1(x))
y = self.a2(self.l2(x))
return y
#Exportieren Sie Netzwerkinformationen für das DNN-Modell(.txt)
model = Model(in_size, hidden_size, out_size)
with open(OUT_DIR_NAME+'/network.txt', 'w') as f:
f.write(str(model))
network.txt
Model(
(l1): Linear(in_features=8546, out_features=682, bias=True)
(a1): ReLU()
(l2): Linear(in_features=682, out_features=682, bias=True)
(a2): ReLU()
)
Lernparametereinstellungen, Modellbewertung und experimentelle Ergebnisse werden in einer JSON-Datei verwaltet. Der Inhalt von jedem ist wie folgt.
training_config.json
{
"method": "Eine ausführliche Erläuterung der Methode finden Sie hier.",
"parameters": {
"max_epochs": 1000,
"batch_size": 128,
"optimizer": "adam",
"learning_rate": 0.001,
"patience": 50,
"norm": true
},
"datasets": {
"data1": "../../dataset/dev/<file1_name>",
"data2": "../../dataset/dev/<file2_name>"
}
}
evaluation_config.json
{
"target_dir": "YYYYMMDD_ID",
"src_dir": {
"file1": "../../dataset/test/<file1_name>",
"file2": "../../dataset/test/<file2_name>"
},
"output_dir": "OUTPUT_DIR_NAME"
}
condition.json
{
"method": "Erläuterung der Methode",
"parameters": {
"max_epochs": 345,
"batch_size": 128,
"optimizer": "adam",
"learning_rate": 0.001,
"patience": 50,
"norm": true
},
"datasets": {
"data1": "../../dataset/dev/<file1_name>",
"data2": "../../dataset/dev/<file1_name>",
},
"dnn": {
"input_size": 8546,
"output_size": 682
},
"loss": {
"training_loss": 0.087654,
"validation_loss": 0.152140
}
}
Für die Bewertung der DNN-Leistung wird zuerst "evaluation.json" gelesen, der Zielordner wird aus "target_dir" angegeben und die Parameter usw. werden aus "condition.json" darin erfasst.
Nach einigen Drehungen und Wendungen habe ich mich für diese Art von Managementmethode entschieden, aber bitte sagen Sie mir, ob es eine bessere Managementmethode gibt ...
Recommended Posts