如何使用opencv和Tensorflow时修复"ValueError: An initializer for variable conv2d/kernel of is required"



我正在编写一个程序,它应该使用tensorflow和opencv来 使用卷积神经网络执行手语识别。 我使用了 MNIST 分类器的考试代码,可以在这里找到 我试图以这样一种方式更改它,以便我可以使用 opencv 来加载训练 图像,然后相机捕获作为CNN的输入。 现在,我在训练显示自己的模型时遇到了问题 在错误中:

值错误:需要变量 conv2d/内核的初始值设定项

完整的错误日志可以在这里找到

正在使用的框架版本:

  • 张量流 r 1.7.1
  • OpenCV 4.0.0
  • 蟒蛇 3.6.5
  • 数字 1.14.2

可以看到应该为网络准备训练数据的代码 在第一个代码片段中。它只是阅读一堆不同的jpg照片 手势,调整这些图像的大小并将其放入 Numpy 数组中

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与tensorflow一起使用来创建CNN。我没有设法找到东西 我需要这种方式。

我将非常感谢任何形式的帮助。 提前谢谢你。

[-1, 12 * 12 * 64]- 给定填充层和最大池层,这应该是[-1, 15 * 15 * 64],因为 60/2/2 = 15

也就是说,我不确定这是实际问题还是唯一的问题,因为我没有办法重现您的问题。

最新更新