ошибка "неизвестного узла" в сверточной нейронной сети Кераса - PullRequest
0 голосов
/ 13 июня 2019

У меня есть следующая (2D) сверточная нейронная сеть в Керасе для классификации изображений с двоичными метками:

model = keras.Sequential()
model.add(Conv2D(32, kernel_size=5, activation='relu', input_shape=(128, 128, 1)))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(64, kernel_size=5, activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Flatten())
model.add(Dense(1024, activation="relu"))
model.add(Dense(2, activation="softmax"))

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

Для обучения у меня много (.jpeg) файлов изображений, но слишком многозагрузить все сразу.Поэтому я использую следующий генератор (и предварительную обработку):

def load_preprocess(path):
    img = img_to_array(load_img(path, target_size=(128, 128)))
    output = rgb_to_grayscale(img)
    output = tf.reshape(output, (-1,128, 128, 1))
    return output

def image_generator(paths, labels, batch_size=32):
    while True:
        for i in range(0, len(paths), batch_size):
            images = [load_preprocess(path) for path in paths[i:i+batch_size]]
            target = labels[i:i+batch_size]

            yield(images, target)

Я попытался обучить сеть, используя

model.fit_generator(image_generator(train_paths, train_labels), steps_per_epoch=int(np.ceil(len(train_paths)/32)), epochs=1)

Здесь train_paths - это список путей, а train_labels - это двоичный массив с недействительнымидва столбца.

Однако, это дает мне следующую ошибку:

InvalidArgumentError: Requested tensor connection from unknown node: "conv2d_input:0".

Что вызывает эту ошибку и как ее решить?Я попытался погуглить, но не нашел ни одного хита.

1 Ответ

0 голосов
/ 13 июня 2019

Я нашел ошибку: изображения являются тензорами и должны быть преобразованы в массивы. Я делаю это следующим образом:

def image_generator(paths, labels, batch_size=32):
    sess = tf.Session()
    while True:
        for i in range(0, len(paths), batch_size):
            with sess.as_default():
                images = [load_preprocess(path).eval() for path in paths[i:i+batch_size]]
            target = labels[i:i+batch_size]

            yield(np.array(images), target)
...