私は2D入力用のシンプルな1層のたたみ込みを作成しようとしています。アイデアは、入力画像、カーネル、および出力をコードにすることです。
import tensorflow as tf
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
filename_queue = tf.train.string_input_producer(['/home/ubuntu/test.png'])
reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)
my_img = tf.image.decode_png(value)
init_op = tf.initialize_all_variables()
sess = tf.InteractiveSession()
with sess.as_default():
sess.run(init_op)
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
for i in range(1):
image = my_img.eval()
image = tf.cast(image, tf.float64)
image = tf.expand_dims(image, 0)
K=np.array([[0,1,0],[1,1,1],[0,1,0]]).astype(float)
K = tf.expand_dims(K, 2)
K = tf.expand_dims(K, 0)
conv = tf.nn.conv2d(
image,
K,
strides=[3, 3, 3, 3],
padding="SAME")
そして私はこのエラーを得ています:
Traceback (most recent call last):
File "test4.py", line 35, in <module>
padding="SAME")
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_nn_ops.py", line 396, in conv2d
data_format=data_format, name=name)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.py", line 759, in apply_op
op_def=op_def)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2242, in create_op
set_shapes_for_outputs(ret)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1617, in set_shapes_for_outputs
shapes = shape_func(op)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1568, in call_with_requiring
return call_cpp_shape_fn(op, require_shape_fn=True)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/common_shapes.py", line 610, in call_cpp_shape_fn
debug_python_shape_fn, require_shape_fn)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/common_shapes.py", line 675, in _call_cpp_shape_fn_impl
raise ValueError(err.message)
ValueError: Dimensions must be equal, but are 1 and 3 for 'Conv2D' (op: 'Conv2D') with input shapes: [1,400,400,1], [1,3,3,1].
私の入力は400x400x1で、カーネルは3x3です
conv2d doc に基づく:
shape of input = [batch, in_height, in_width, in_channels]
shape of filter = [filter_height, filter_width, in_channels, out_channels]
入力の最後の次元とフィルターの3番目の次元は、入力チャネルの数を表します。あなたの場合、それらは等しくありません。
You can change the shape of filter to [3, 3, 1, 1].