размер отрицательного размера на kears Conv1D - PullRequest
0 голосов
/ 28 июня 2018

Я использую модель API Keras, чтобы применить 1D-свертку к входному 1d-вектору размера 20. Мне нужно пять ядер размером 3 каждое. Вход будет иметь форму (None, 1,20) (переменное число 1D векторов размером 20).

input = Input(shape=(1, 20))
conv = Conv1D(filters=5, kernel_size=3, activation=keras.activations.relu, input_shape=(None,20, 1))(input)
dense =dense(1)(conv)
model = Model(inputs=input, outputs=dense)

model.compile(loss=nn.customLoss, optimizer='adam')

history = model.fit(train_X, train_labels, batch_size=50,
                    epochs=15, validation_split=0.2)

Сводка модели -

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, None, 20)          0         
_________________________________________________________________
conv1d_1 (Conv1D)            (None, None, 5)           305       
_________________________________________________________________
dense_1 (Dense)              (None, None, 1)           6         
=================================================================
Total params: 311
Trainable params: 311
Non-trainable params: 0

train_x имеет форму (None, 1, 20), train_labels имеет форму (None, 1).

Ошибка происходит из слоя свертки -

    Caused by op 'conv1d_1/convolution/Conv2D', defined at:
  File "/home/user/Desktop/hack/imlhack2018/conv_nn.py", line 72, in <module>
    main()
  File "/home/user/Desktop/hack/imlhack2018/conv_nn.py", line 42, in main
    conv = Conv1D(filters=5, kernel_size=3, activation=keras.activations.relu, input_shape=(None,20, 1))(input)
  File "/home/user/anaconda3/lib/python3.6/site-packages/keras/engine/topology.py", line 596, in __call__
    output = self.call(inputs, **kwargs)
  File "/home/user/anaconda3/lib/python3.6/site-packages/keras/layers/convolutional.py", line 156, in call
    dilation_rate=self.dilation_rate[0])
  File "/home/user/anaconda3/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py", line 3116, in conv1d
    data_format=tf_data_format)
  File "/home/user/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/nn_ops.py", line 670, in convolution
    op=op)
  File "/home/user/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/nn_ops.py", line 338, in with_space_to_batch
    return op(input, num_spatial_dims, padding)
  File "/home/user/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/nn_ops.py", line 662, in op
    name=name)
  File "/home/user/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/nn_ops.py", line 116, in _non_atrous_convolution
    name=scope)
  File "/home/user/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/nn_ops.py", line 2010, in conv1d
    data_format=data_format)
  File "/home/user/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/gen_nn_ops.py", line 399, in conv2d
    data_format=data_format, name=name)
  File "/home/user/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 767, in apply_op
    op_def=op_def)
  File "/home/user/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 2506, in create_op
    original_op=self._default_original_op, op_def=op_def)
  File "/home/user/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1269, in __init__
    self._traceback = _extract_stack()

InvalidArgumentError (see above for traceback): computed output size would be negative
     [[Node: conv1d_1/convolution/Conv2D = Conv2D[T=DT_FLOAT, data_format="NHWC", padding="VALID", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true, _device="/job:localhost/replica:0/task:0/cpu:0"](conv1d_1/convolution/ExpandDims, conv1d_1/convolution/ExpandDims_1)]]

Когда я добавляю padding="same" к сверточному слою, кажется, что все работает нормально. В чем причина такого поведения?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

В официальных документах writes написано «При использовании этого слоя в качестве первого слоя в модели укажите аргумент input_shape (кортеж целых чисел или None, не включает ось пакета)». Я запутался в том, почему он объявил форму ввода conv1D после того, как он имел на входном слое

0 голосов
/ 28 июня 2018

Ваша форма ввода (1, 20), которая интерпретируется как массив шириной 20 каналов. Вы, вероятно, хотите противоположное, то есть ширина 20 и 1 канал. Поскольку ваш массив имеет один элемент, выполнение свертки без заполнения SAME приведет к отрицательному измерению, что приведет к ошибке.

Обратите внимание, что свертка всегда выполняется для пространственных измерений, которые для Conv1D являются вторыми и последними измерениями в массиве фигур. Последнее измерение представляет каналы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...