Как исправить «ValueError: требуется инициализатор для переменной conv2d / kernel of», когда используются opencv и tenorflow - PullRequest
0 голосов
/ 13 мая 2018

Я пишу программу, которая должна использовать tenorflow и opencv для выполнять распознавание языка жестов с использованием сверточных нейронных сетей. Я использовал примерный код для классификатора MNIST, который можно найти здесь и Я попытался изменить это таким образом, чтобы я мог использовать OpenCV для загрузки обучения изображения, а затем захват камеры в качестве входа для CNN. Сейчас у меня проблема с обучением модели, которая проявляет себя в ошибке:

ValueError: Требуется инициализатор для переменной conv2d / kernel of

Весь журнал ошибок можно найти здесь

Используемые версии каркасов:

  • Tensorflow r 1.7.1
  • OpenCV 4.0.0
  • Python 3.6.5
  • Numpy 1.14.2

Код, который должен подготовить данные обучения для сети, можно увидеть в первом фрагменте кода. Он просто читает кучу фотографий JPG с разными жесты рук, изменяют размеры этих изображений и помещают их в массив numy

def prepareTrainingData(trainingLetterMaxId, training_image_size):
    training_images = []
    training_labels = []
    for letter in training_letters:
        for i in range(0, trainingLetterMaxId):
            read_image = cv2.imread('/home/radkye/Documents/ASLRecognizer/images/'
            + letter + '/' + letter + '_' + str(i) + '.jpg', 0)
            resized = np.array(cv2.resize(read_image, (training_image_size, training_image_size)))
            flattened = resized.ravel()
            image = tf.cast(flattened, tf.float32)
            training_images.append(image)
            net_output = np.zeros(len(training_letters))
            net_output[letters_to_indices_map[letter]] = 1
            training_labels.append(net_output)

    result = np.array(training_images)
    labels_result = np.array(training_labels)
    return result, labels_result

training_data, training_labels = prepareTrainingData(100, 60)
train_labels_int = np.asarray(training_labels, dtype=np.int32)

mnist_classifier = tf.estimator.Estimator(
    model_fn=cnn.cnn_model_fn,
    model_dir="/home/radkye/Documents/studia/ASLRecognizer_AutoTestVersion/asl_cnn_model")

tensors_to_log = {"probabilities": "softmax_tensor"}
logging_hook = tf.train.LoggingTensorHook(
    tensors=tensors_to_log, every_n_iter=50)

train_input_fn = tf.estimator.inputs.numpy_input_fn(
    x={"x": training_data},
    y=train_labels_int,
    batch_size=3600,
    num_epochs=None,
    shuffle=True)

mnist_classifier.train(
    input_fn=train_input_fn,
    steps=20000,
    hooks=[logging_hook])

cnn_model_fn определяется как:

def cnn_model_fn(features, labels, mode):

    input_layer = tf.reshape(features["x"], [-1, 60, 60, 1])

    conv1 = tf.layers.conv2d(
        inputs=input_layer,
        filters=64,
        kernel_size=[5, 5],
        padding="same",
        activation=tf.nn.relu)

    pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)

    conv2 = tf.layers.conv2d(
        inputs=pool1,
        filters=64,
        kernel_size=[5, 5],
        padding="same",
        activation=tf.nn.relu)

    pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)
    pool2_flat = tf.reshape(pool2, [-1, 12 * 12 * 64])
    dense = tf.layers.dense(inputs=pool2_flat, units=1024, activation=tf.nn.relu)

    dropout = tf.layers.dropout(
        inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)

    logits = tf.layers.dense(inputs=dropout, units=24)

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

В противном случае, возможно, у кого-то есть учебник или пример, где opencv используется вместе с tenorflow для создания CNN. Мне не удалось найти что-то Мне нужно таким образом.

Я был бы очень признателен за любую помощь. Заранее спасибо.

1 Ответ

0 голосов
/ 13 мая 2018

[-1, 12 * 12 * 64] - учитывая слои padding и maxpool, это должно быть [-1, 15 * 15 * 64], потому что 60/2/2 = 15

Тем не менее, я не уверен, что это настоящая или единственная проблема,потому что у меня нет способа воспроизвести вашу проблему.

...