mxnet: как отлаживать модели с несовпадающими формами - PullRequest
1 голос
/ 26 апреля 2019

Я пытаюсь изменить модель, которую я нашел в Интернете (https://github.com/apache/incubator-mxnet/tree/master/example/multivariate_time_series), пока я работаю, чтобы узнать mxnet. Я пытаюсь построить модель, которая использует сеть CNN и RNN параллельно, а затем использует выходы обоих для прогнозирования временного ряда. Однако я сталкиваюсь с этой ошибкой

RuntimeError: ошибка simple_bind. Аргументы: данные: (128, 96, 20) softmax_label: (128, 20) Ошибка в операторе concat1: [15:44:09] src / operator / nn / concat.cc: 66: проверка не удалась: shape_assign (& (* in_shape) [i], dshape) Несовместимая форма ввода: ожидается [128,0], получено [128,96,300]

Это код, так как я пытался его изменить:

def rnn_cnn_model(iter_train, q, filter_list, num_filter, dropout, seasonal_period, time_interval):


# Choose cells for recurrent layers: each cell will take the output of the previous cell in the list
rcells = [mx.rnn.GRUCell(num_hidden=args.recurrent_state_size)]
skiprcells = [mx.rnn.LSTMCell(num_hidden=args.recurrent_state_size)]


input_feature_shape = iter_train.provide_data[0][1]
X = mx.symbol.Variable(iter_train.provide_data[0].name)
Y = mx.sym.Variable(iter_train.provide_label[0].name)

# reshape data before applying convolutional layer (takes 4D shape incase you ever work with images)
rnn_input = mx.sym.reshape(data=X, shape=(0, q, -1))

###############
# RNN Component
###############
stacked_rnn_cells = mx.rnn.SequentialRNNCell()
for i, recurrent_cell in enumerate(rcells):
    stacked_rnn_cells.add(recurrent_cell)
    stacked_rnn_cells.add(mx.rnn.DropoutCell(dropout))
outputs, states = stacked_rnn_cells.unroll(length=q, inputs=rnn_input, merge_outputs=False)
rnn_features = outputs[-1] #only take value from final unrolled cell for use later

input_feature_shape = iter_train.provide_data[0][1]
X = mx.symbol.Variable(iter_train.provide_data[0].name)
Y = mx.sym.Variable(iter_train.provide_label[0].name)

# reshape data before applying convolutional layer (takes 4D shape incase you ever work with images)
conv_input = mx.sym.reshape(data=X, shape=(0, 1, q, -1))

###############
# CNN Component
###############
outputs = []
for i, filter_size in enumerate(filter_list):
    # pad input array to ensure number output rows = number input rows after applying kernel
    padi = mx.sym.pad(data=conv_input, mode="constant", constant_value=0,
                      pad_width=(0, 0, 0, 0, filter_size - 1, 0, 0, 0))
    convi = mx.sym.Convolution(data=padi, kernel=(filter_size, input_feature_shape[2]), num_filter=num_filter)
    acti = mx.sym.Activation(data=convi, act_type='relu')
    trans = mx.sym.reshape(mx.sym.transpose(data=acti, axes=(0, 2, 1, 3)), shape=(0, 0, 0))
    outputs.append(trans)
cnn_features = mx.sym.Concat(*outputs, dim=2)
cnn_reg_features = mx.sym.Dropout(cnn_features, p=dropout)
c_features = mx.sym.reshape(data = cnn_reg_features, shape = (-1))
print(type(c_features))
######################
# Prediction Component
######################

print(rnn_features.infer_shape())   
neural_components = mx.sym.concat(*[rnn_features, c_features], dim=1)
neural_output = mx.sym.FullyConnected(data=neural_components, num_hidden=input_feature_shape[2])
model_output = neural_output
loss_grad = mx.sym.LinearRegressionOutput(data=model_output, label=Y)
return loss_grad, [v.name for v in iter_train.provide_data], [v.name for v in iter_train.provide_label]

и я считаю, что в этой строке кода происходит сбой

neural_components = mx.sym.concat(*[rnn_features, c_features], dim=1)

Вот то, что я пытался привести в соответствие мои размеры:

  • c_features = mx.sym.reshape(data = cnn_reg_features, shape = (-1))
  • c_features = cnn_reg_features[-1]
  • c_features = cnn_reg_features[:, -1, :]

Я также пытался взглянуть на проблемы с git и Google, но все, что я вижу, - это совет infer_shape. Я попытался применить это к c_features, но вывод был неясен для меня

data: ()
gru_i2h_weight: ()
gru_i2h_bias: ()

В принципе, я хотел бы знать на каждом этапе, как строится этот график, какова форма символа. Я привык к этой возможности в Tensorflow, которая упрощает построение и отладку графиков, когда кто-то сбился с пути при неправильном изменении формы или просто для того, чтобы понять, как работает модель, глядя на ее размерность. Разве нет эквивалентной возможности в mxnet?

Учитывая, что data_iter вводится при создании symbols, я думаю, что предполагаемая форма должна быть доступна. В конечном итоге мои вопросы таковы: (1) как я могу увидеть эту форму символа, когда он использует данные в итераторе и должен знать все формы? (2) общие рекомендации по отладке в такой ситуации?

Спасибо.

...