%% MLP do regresji – przykład z funkcją nieliniową % Zadanie: nauczyć sieć przewidywać wartość funkcji y = 3*sin(x)*exp(-x*2) % na podstawie x, przy dodanym szumie losowym. % potrzebne toolboxy: Deep Learning Toolbox Parallel Computing Toolbox (dla uczenia z GPU) clear; clc; rng('default'); % dla powtarzalności %% 1. Generowanie danych n = 500; % liczba próbek X = linspace(0, 2*pi, n)'; % wejścia: x z zakresu 0 do 2π Y = 3*sin(X).*exp(-X*2) + 0.01*randn(n,1); % wyjścia: f(x) + szum % Podział danych na zbiór treningowy i testowy idx = randperm(n); % Tworzy losową permutację liczb całkowitych od 1 do n (czyli indeksów próbek). % Używamy tego, by losowo przetasować dane przed podziałem na zbiory. nTrain = round(0.8 * n); % Obliczamy liczbę próbek, które mają trafić do zbioru treningowego – 80% całego zbioru. XTrain = X(idx(1:nTrain)); YTrain = Y(idx(1:nTrain)); % Tworzymy zbiór treningowy: % - Wybieramy pierwsze 80% danych przetasowanych losowo. % - X: wejścia (np. cechy), Y: odpowiadające wartości (etykiety lub wartości regresji) XTest = X(idx(nTrain+1:end)); YTest = Y(idx(nTrain+1:end)); % Tworzymy zbiór testowy z pozostałych 20% danych (od pozycji nTrain+1 do końca). %% 2. Definicja sieci MLP do regresji layers = [ featureInputLayer(1,'Name','input') % wejście: 1 cecha (x) fullyConnectedLayer(20,'Name','fc1') % warstwa ukryta: 20 neuronów reluLayer('Name','relu1') % funkcja aktywacji ReLU fullyConnectedLayer(6,'Name','fc2') % druga warstwa: 10 neuronów sigmoidLayer('Name','sigm2') fullyConnectedLayer(20,'Name','fc3') % warstwa ukryta: 20 neuronów reluLayer('Name','relu2') % funkcja aktywacji ReLU fullyConnectedLayer(1,'Name','output') % wyjście: 1 neuron regressionLayer('Name','regression') % warstwa do regresji ]; %% 3. Ustawienia treningu % sgdm - uczenie gradzient + momentum % 'ExecutionEnvironment','gpu', ... options = trainingOptions('sgdm', ... 'Momentum', 0.9, ... 'MaxEpochs', 300, ... 'ExecutionEnvironment','gpu', ... 'InitialLearnRate', 0.04, ... 'MiniBatchSize', 32, ... 'Shuffle','every-epoch', ... 'Plots','training-progress', ... 'Verbose',false); %% 4. Trenowanie sieci net = trainNetwork(XTrain, YTrain, layers, options); %% 5. Ewaluacja sieci YPred = predict(net, XTest); % przewidywane wartości na danych testowych mseVal = mean((YPred - YTest).^2); % średni błąd kwadratowy fprintf("MSE na zbiorze testowym: %.4f\n", mseVal); %% 6. Wizualizacja wyników figure; plot(XTest, YTest, 'ko', 'DisplayName','Rzeczywiste'); hold on; plot(XTest, YPred, 'r*', 'DisplayName','Predykcja'); legend show; grid on; xlabel('x'); ylabel('y'); title('MLP do regresji: Przewidywanie sin(x)');