この現象は、"trainnet" で "trainingOptions" の "ValidationData" を指定した場合、学習後に返されるネットワークの重みが異なるため発生します。"ValidationData" を指定すると、"OutputNetwork" プロパティの既定値が "best-validation" となり、学習中にバリデーション損失が最小となった時点のネットワークが返されます。一方、"ValidationData" を指定しない場合は、"last-iteration"(最終エポック時点)のネットワークが返されます。
そのため、同じ学習条件でも推論結果が異なる場合があります。両者の結果を揃えたい場合は、"trainingOptions" の "OutputNetwork" を明示的に "last-iteration" に設定してください。設定例は以下の通りです。
options = trainingOptions("adam", ...
"ValidationData", dsVal, ...
"OutputNetwork", "last-iteration", ...
... % その他のオプション
);
この設定により、"ValidationData" の有無によらず、最終エポック時点のネットワークで推論できます。