Я хотел бы использовать агента DQN, в котором у меня есть несколько непрерывных состояний (или наблюдений) и два сигнала действия, каждый с тремя возможными значениями, всего 9 комбинаций. Например, посмотрите следующие строки, чтобы понять, что я имею в виду:
a = [-2,0,2];
b = [-3,0,3];
[A,B] = meshgrid(a,b);
actions = reshape(cat(2,A',B'),[],2);
Если я хочу создать отдельные действия, мне нужно преобразовать матрицу в ячейку и запустить команду:
actionInfo = rlFiniteSetSpec(num2cell(actions,2));
actionInfo.Name = 'actions';
Кроме того, в DQN у вас есть критик, состоящий из глубокой нейронной сети. Я создал критика следующим образом:
% Create a DNN for the critic:
hiddenLayerSize = 48;
observationPath = [
imageInputLayer([numObs 1 1],'Normalization','none',...
'Name','observation')
fullyConnectedLayer(hiddenLayerSize,'Name','CriticStateFC1')
reluLayer('Name','CriticReLu1')
fullyConnectedLayer(hiddenLayerSize,'Name','CriticStateFC2')
additionLayer(2,'Name','add')
reluLayer('Name','CriticCommonReLu1')
fullyConnectedLayer(hiddenLayerSize,'Name','CriticCommonFC1')
reluLayer('Name','CriticCommonReLu2')
fullyConnectedLayer(1,'Name','CriticOutput')];
actionPath = [
imageInputLayer([value 1 1],'Normalization','none','Name','action')
fullyConnectedLayer(hiddenLayerSize,'Name','CriticActionFC1')];
% Create the layerGraph:
criticNetwork = layerGraph(observationPath);
criticNetwork = addLayers(criticNetwork,actionPath);
% Connect actionPath to obervationPath:
criticNetwork = connectLayers(criticNetwork,'CriticActionFC1','add/in2');
% Specify options for the critic representation:
criticOpts = rlRepresentationOptions('LearnRate',1e-03,...
'GradientThreshold',1,'UseDevice','gpu');
% Create the critic representation using the specified DNN and options:
critic = rlRepresentation(criticNetwork,observationInfo,actionInfo,...
'Observation',{'observation'},'Action',{'action'},criticOpts);
% Set the desired options for the agent:
agentOptions = rlDQNAgentOptions(...
'SampleTime',dt,...
'UseDoubleDQN',true,...
'TargetSmoothFactor',1e-3,...
'DiscountFactor',0.99,...
'ExperienceBufferLength',1e7,...
'MiniBatchSize',128);
Моя проблема - первый слой ввода изображения в путь действия imageInputLayer([value 1 1],'Normalization','none','Name','action')
. Я пробовал значения 1, 2, 9 и 18 для value
, но все это приводит к ошибке при запуске
agent = rlDQNAgent(critic,agentOptions);
Это потому, что actionInfo
имеет ячейку из 9 элементов, каждый с двойным вектором измерений [1,2]
, тогда как imageInputLayer
ожидает измерения [value,1,1]
.
Итак, как мне настроить агента DQN в MATLAB с двумя основными дискретными сигналами действия, каждый из которых имеет три возможных значения? Агент работает в среде Simulink. Следовательно, я не уверен, как блоки усиления Simulink отреагируют на два выхода.
Нужно ли возвращать один вектор индексов и использовать отдельную функцию для сопоставления их с правильной матрицей?
Заранее большое спасибо за помощь!