스크립트의 함수 정의는 파일의 끝에 표시되어야 합니다. "preprocessMiniBatch" 함수 정의 뒤에 있는 모든 명령문을 첫 번째 로컬 함수 정의 앞으로 이동하십시오.
    7 views (last 30 days)
  
       Show older comments
    
GNN CODE에서 output image size를 변경하기 위해 다음과같은 아래에 imds 코드 부터 실행을 진행하면 
mbq = minibatchqueue(augimds, ...
    MiniBatchSize=miniBatchSize, ...
    PartialMiniBatch="discard", ...
    MiniBatchFcn=@preprocessMiniBatch, ...
    MiniBatchFormat="SSCB");
해당 내용에서 다음과 같은 문제가 발생됩니다.
[스크립트의 함수 정의는 파일의 끝에 표시되어야 합니다.
"preprocessMiniBatch" 함수 정의 뒤에 있는 모든 명령문을 첫 번째 로컬 함수 정의 앞으로 이동하십시오.] 
이를 해결 할수 있는 방법이 있나요?
imds = imageDatastore("C:\Users\COMPUTER\Documents\MATLAB\lololo", IncludeSubfolders=true);
augmenter = imageDataAugmenter('RandXReflection', true);
augimds = augmentedImageDatastore([128 128], imds, 'DataAugmentation', augmenter);
numLatentInputs = 100;
projectionSize = [8 8 512]; % 조정된 값
filterSize = 5;
numFilters = 64;
layersGenerator = [
    featureInputLayer(numLatentInputs, 'InputSize', [1 1 1 numLatentInputs])
    projectAndReshapeLayer(projectionSize)
    transposedConv2dLayer(filterSize, 4*numFilters, 'Name', 'tconv1')
    batchNormalizationLayer('Name', 'bn1')
    reluLayer('Name', 'relu1')
    transposedConv2dLayer(filterSize, 2*numFilters, 'Stride', 2, 'Cropping', 'same', 'Name', 'tconv2')
    batchNormalizationLayer('Name', 'bn2')
    reluLayer('Name', 'relu2')
    transposedConv2dLayer(filterSize, numFilters, 'Stride', 2, 'Cropping', 'same', 'Name', 'tconv3')
    batchNormalizationLayer('Name', 'bn3')
    reluLayer('Name', 'relu3')
    transposedConv2dLayer(filterSize, 3, 'Stride', 2, 'Cropping', 'same', 'Name', 'tconv4')
    tanhLayer('Name', 'tanh')];
netG = dlnetwork(layersGenerator);
dropoutProb = 0.5;
numFilters = 64;
scale = 0.2;
inputSize = [128 128 3]; % 이미지 크기 변경
filterSize = 5;
layersDiscriminator = [
    imageInputLayer(inputSize, Normalization="none")
    dropoutLayer(dropoutProb)
    convolution2dLayer(filterSize, numFilters, Stride=2, Padding="same")
    leakyReluLayer(scale)
    convolution2dLayer(filterSize, 2*numFilters, Stride=2, Padding="same")
    batchNormalizationLayer
    leakyReluLayer(scale)
    convolution2dLayer(filterSize, 4*numFilters, Stride=2, Padding="same")
    batchNormalizationLayer
    leakyReluLayer(scale)
    convolution2dLayer(filterSize, 8*numFilters, Stride=2, Padding="same")
    batchNormalizationLayer
    leakyReluLayer(scale)
    convolution2dLayer(4, 1)
    sigmoidLayer];
netD = dlnetwork(layersDiscriminator);
dropoutProb = 0.5;
numFilters = 64;
scale = 0.2;
inputSize = [512 512 3];
filterSize = 5;
layersDiscriminator = [
    imageInputLayer(inputSize,Normalization="none")
    dropoutLayer(dropoutProb)
    convolution2dLayer(filterSize,numFilters,Stride=2,Padding="same")
    leakyReluLayer(scale)
    convolution2dLayer(filterSize,2*numFilters,Stride=2,Padding="same")
    batchNormalizationLayer
    leakyReluLayer(scale)
    convolution2dLayer(filterSize,4*numFilters,Stride=2,Padding="same")
    batchNormalizationLayer
    leakyReluLayer(scale)
    convolution2dLayer(filterSize,8*numFilters,Stride=2,Padding="same")
    batchNormalizationLayer
    leakyReluLayer(scale)
    convolution2dLayer(4,1)
    sigmoidLayer];
netD = dlnetwork(layersDiscriminator);
numEpochs = 100;
miniBatchSize = 128;
learnRate = 0.0002;
gradientDecayFactor = 0.5;
squaredGradientDecayFactor = 0.999;
flipProb = 0.35;
validationFrequency = 100;
augimds.MiniBatchSize = miniBatchSize;
function X = preprocessMiniBatch(data)
    % Concatenate mini-batch
    X = cat(4, data{:});
    % Rescale the images in the range [-1 1].
    X = rescale(X, -1, 1, 'InputMin', 0, 'InputMax', 255);
end
mbq = minibatchqueue(augimds, ...
    MiniBatchSize=miniBatchSize, ...
    PartialMiniBatch="discard", ...
    MiniBatchFcn=@preprocessMiniBatch, ...
    MiniBatchFormat="SSCB");
trailingAvgG = [];
trailingAvgSqG = [];
trailingAvg = [];
trailingAvgSqD = [];
numValidationImages = 5;
ZValidation = randn(numLatentInputs,numValidationImages,"single");
ZValidation = dlarray(ZValidation,"CB");
if canUseGPU
    ZValidation = gpuArray(ZValidation);
end
f = figure;
f.Position(3) = 2*f.Position(3);
imageAxes = subplot(1,2,1);
scoreAxes = subplot(1,2,2);
C = colororder;
lineScoreG = animatedline(scoreAxes,Color=C(1,:));
lineScoreD = animatedline(scoreAxes,Color=C(2,:));
legend("Generator","Discriminator");
ylim([0 1])
xlabel("Iteration")
ylabel("Score")
grid on
iteration = 0;
start = tic;
% Loop over epochs.
for epoch = 1:numEpochs
    % Reset and shuffle datastore.
    shuffle(mbq);
    % Loop over mini-batches.
    while hasdata(mbq)
        iteration = iteration + 1;
        % Read mini-batch of data.
        X = next(mbq);
        % Generate latent inputs for the generator network. Convert to
        % dlarray and specify the format "CB" (channel, batch). If a GPU is
        % available, then convert latent inputs to gpuArray.
        Z = randn(numLatentInputs, miniBatchSize, 'single');
        Z = dlarray(Z, 'CB');
        if canUseGPU
            Z = gpuArray(Z);
        end
        % Evaluate the gradients of the loss with respect to the learnable
        % parameters, the generator state, and the network scores using
        % dlfeval and the modelLoss function.
        [lossG, lossD, gradientsG, gradientsD, stateG, scoreG, scoreD] = ...
            dlfeval(@modelLoss, netG, netD, X, Z, flipProb);
        netG.State = stateG;
        % Update the discriminator network parameters.
        [netD, trailingAvg, trailingAvgSqD] = adamupdate(netD, gradientsD, ...
            trailingAvg, trailingAvgSqD, iteration, ...
            learnRate, gradientDecayFactor, squaredGradientDecayFactor);
        % Update the generator network parameters.
        [netG, trailingAvgG, trailingAvgSqG] = adamupdate(netG, gradientsG, ...
            trailingAvgG, trailingAvgSqG, iteration, ...
            learnRate, gradientDecayFactor, squaredGradientDecayFactor);
        % Every validationFrequency iterations, display batch of generated
        % images using the held-out generator input.
        if mod(iteration, validationFrequency) == 0 || iteration == 1
            % Generate images using the held-out generator input.
            XGeneratedValidation = predict(netG, ZValidation);
            % Tile and rescale the images in the range [0 1].
            I = imtile(extractdata(XGeneratedValidation));
            I = rescale(I);
            % Display the images.
            subplot(1, 2, 1);
            image(imageAxes, I)
            xticklabels([]);
            yticklabels([]);
            title("Generated Images");
        end
        % Update the scores plot.
        subplot(1, 2, 2)
        lossG = double(extractdata(lossG));
        addpoints(lineScoreG, iteration, lossG);
        lossD = double(extractdata(lossD));
        addpoints(lineScoreD, iteration, lossD);
        % Update the title with training progress information.
        D = duration(0, 0, toc(start), 'Format', 'hh:mm:ss');
        title(...
            "Epoch: " + epoch + ", " + ...
            "Iteration: " + iteration + ", " + ...
            "Elapsed: " + string(D))
        drawnow
    end
end
% 나머지 코드...
numObservations = 5;
ZNew = randn(numLatentInputs, numObservations, "single");
ZNew = dlarray(ZNew, "CB");
if canUseGPU
    ZNew = gpuArray(ZNew);
end
XGeneratedNew = predict(netG, ZNew);
I = imtile(extractdata(XGeneratedNew));
I = rescale(I);
figure
image(I)
axis off
title("Generated Images")
numImagesToSave = 1; % 저장할 이미지 개수
outputFolder = 'C:\Users\COMPUTER\Documents\MATLAB\pixgan\rpgan'; % 이미지를 저장할 폴더 경로
% 새 폴더 생성
if ~exist(outputFolder, 'dir')
    mkdir(outputFolder);
end
% 생성된 이미지를 개별로 저장
for i = 1:numImagesToSave
    generatedImage = extractdata(XGeneratedNew(:, :, :, i));
    % 이미지 스케일 조정 및 uint8로 변환
    generatedImage = uint8(255 * mat2gray(generatedImage));
    imwrite(generatedImage, fullfile(outputFolder, strcat('generated_image_', num2str(i), '.jpg')));
end
0 Comments
Accepted Answer
  lazymatlab
      
 on 14 Dec 2023
        함수는 스크립트 중간에 정의될 수 없습니다.
코드 중 아래 부분을 스크립트 맨 뒤로 옮기고 실행해보세요.
function X = preprocessMiniBatch(data)
    % Concatenate mini-batch
    X = cat(4, data{:});
    % Rescale the images in the range [-1 1].
    X = rescale(X, -1, 1, 'InputMin', 0, 'InputMax', 255);
end
0 Comments
More Answers (0)
See Also
Categories
				Find more on Operations in Help Center and File Exchange
			
	Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
