вычисление градиентов keras завершается ошибкой «Недопустимый индекс из измерения: 3, 0, C»

#python #tensorflow #keras

#python #тензорный поток #keras

Вопрос:

Когда я пытаюсь вычислить градиент X w.r.t Y (на самом деле не имеет значения, что такое X или Y) в сети со слоем conv1d, я получаю сообщение «Недопустимый индекс из измерения: 3, 0, C», и процесс завершается.

Минимальный рабочий пример:

 import numpy as np

from tensorflow.python.keras import models
from tensorflow.python.keras import layers
from tensorflow.python.keras import backend as K

inp = layers.Input(shape=(10, 20,))
conv = layers.Conv1D(filters=10, kernel_size=2)(inp)
pool = layers.GlobalMaxPool1D()(conv)
output = layers.Dense(1, activation="sigmoid")(pool)

m = models.Model(inp, output)

m.summary()

m.compile(optimizer="adam", loss="binary_crossentropy")
 

Кажется, работает:

 m.fit(x=np.random.randn(100, 10, 20), y=np.random.randn(100))
 

Это нарушает:

 loss = K.mean(m.output)
grads = K.gradients(loss, m.input)[0]
f = K.function([m.input], [grads])
print(f([np.random.randn(10, 20)]))
 

Мои версии python, keras, tf:

 import tensorflow as tf
import sys
from tensorflow.python import keras

print(tf.__version__)
print(keras.__version__)
print(sys.version)

1.12.0
2.1.6-tf
3.6.7 |Anaconda, Inc.| (default, Oct 23 2018, 14:01:38) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]
 

На самом деле не имеет значения, для чего я вычисляю градиент по отношению к чему .. Сообщение об ошибке

 2019-04-19 17:00:58.249788: F ./tensorflow/core/util/tensor_format.h:420] Check failed: index >= 0 amp;amp; index < dimension_attributes.size() Invalid index from the dimension: 3, 0, C
 

Я вижу, что это связано со слоем conv 1d на основе сообщения об ошибке, но я не совсем понимаю, чего мне здесь не хватает. Спасибо за любые подсказки.

Комментарии:

1. Я не могу воспроизвести ваш вопрос. Моя ошибка возврата Invalid argument: transpose expects a vector of size 3. But input(1) is a vector of size 4 включена tensorflow=1.12.0 и keras=2.1.6-tf включена .

Ответ №1:

Краткий ответ: несовместимость форм, измените вызов на: f([np.random.randn(1, 10, 20)]) .

Длинный ответ: поскольку вы установили форму ввода как (10, 20,) , это означает, что каждый входной образец имеет форму (10,20) . Однако вы также должны отметить, что модели Keras ожидают пакет образцов в качестве входных данных. Следовательно, в этом случае ожидается массив с 3 измерениями, где первое измерение указывает на размер пакета. Поскольку вы хотите предоставить модели один образец, входной массив должен иметь форму (1, 10, 20) . Поэтому вы должны соответствующим образом изменить форму в randn функции:

 f([np.random.randn(1, 10, 20)])
                   ^
                   |
                   |
              batch dimension