Ошибка при использовании сверточных слоев на процессоре - PullRequest
0 голосов
/ 29 февраля 2020

Можно ли использовать сверточные слои кера без поддержки графического процессора? Я получаю ошибки, когда использую его на Colab, а время выполнения - None. Мой код выглядит следующим образом:

model = tf.keras.Sequential()
model.add(layers.Conv1D(1,5, name='conv1', padding="same", activation='relu',data_format="channels_first", input_shape=(1,2048)))
# model.add(layers.LSTM(5, activation='tanh'))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(num_classes, activation='softmax'))
#model.summary()
model.compile(loss=tf.keras.losses.categorical_crossentropy,
              optimizer=tf.keras.optimizers.SGD(lr=0.001, momentum=0.9),
              metrics=['accuracy'])

x_train = train_value
y_train = train_label
x_test = test_value
y_test = test_label
print(np.shape(x_train)) #shape of x train is (4459, 1, 2048)
print(np.shape(x_test)) #shape of test is (1340,1,2048)

history = model.fit(x_train, y_train,
          batch_size=100,
          epochs=30, 
          verbose=1,
          validation_data=(x_test, y_test)

          )

Он работает нормально на GPU, но выдает следующую ошибку на CPU:

InvalidArgumentError: Conv2DCustomBackpropFilterOp поддерживает только NHW C. [[{{обучение узла / SGD / градиенты / градиенты / conv1 / conv1d_grad / Conv2DBackpropFilter}}]]

UnimplementedError: Операция Conv2D в настоящее время поддерживает только тензорный формат NHWC на ​​ЦП. Операция получила формат: NCHW [[{{node conv1_1 / conv1d}}]] *

Я выяснила, что проблема в формате входных данных. Мои входные данные являются векторами размера (1,2048). Подскажите, пожалуйста, как мне преобразовать эти векторы в формат NHW C? Я был бы очень признателен, если бы кто-то смог прояснить это для меня. Заранее спасибо.

1 Ответ

1 голос
/ 29 февраля 2020

Per документация Keras

data_format: Строка, один из "channel_last" (по умолчанию) или "channel_first". Порядок размеров на входах. «channel_last» соответствует входам с формой (пакет, шаги, каналы) (формат по умолчанию для временных данных в Керасе), в то время как «channel_first» соответствует входам с формой (пакет, каналы, шаги)

Сейчас Keras в TensorFlow, по-видимому, реализует Conv1D в терминах оператора Conv2D - в основном формируя «изображение» с 1 строкой, W столбцами, а затем ваши C «каналы». Вот почему вы получаете сообщения об ошибках о формах изображения, когда у вас нет данных изображения.

В документах над "каналами" указано количество элементов данных за шаг по времени (например, возможно, у вас есть 5 показаний датчика на каждом шаг по времени, чтобы у вас было 5 каналов). Из ваших ответов выше я полагаю, что вы передаете тензоры в форме (n, 1, 2048), где n - размер вашей партии. Так, с channels_last TensorFlow считает, что это означает, что у вас есть n примеров в вашем пакете, каждый с длиной последовательности элементов данных 1 и 2048 на шаг по времени - это только один временной шаг с 2048 элементами данных на наблюдение (например, 2048 показаний датчика, взятых на каждом временном шаге), в этом случае свертка не будет выполнять свертку - она ​​будет эквивалентна одному плотному слою, принимающему все 2048 чисел в качестве ввода.

Я думаю в действительности у вас есть только один элемент данных на шаг по времени, и у вас есть 2048 шагов по времени Это объясняет, почему передача channels_first повышает вашу точность - теперь TensorFlow понимает, что ваши данные представляют 1 выборку элементов данных 2048 раз, и это может привести к свертке этих данных.

Чтобы исправить, вы можете просто tf.reshape(t, (1, 2048, 1)) - и удалите channels_first (этот код предполагает, что вы делаете пакеты размером 1, а ваш тензор называется t). Теперь он находится в формате (n, s, 1), где n - размер пакета (1 здесь), s - количество временных шагов (2048), а 1 указывает одну точку данных на один временной шаг. Теперь вы можете запустить ту же модель на GPU или CPU.

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