6

Tôi muốn sử dụng lại mã từ Tensorflow "MNIST for Pros" CNN example. Hình ảnh của tôi là 388px X 191px, chỉ với 2 lớp đầu ra. Mã ban đầu có thể là found here. Tôi cố gắng để tái sử dụng mã này bằng cách thay đổi đầu vào & đầu ra lớp CHỈ, như hình dưới đây:Mạng chuyển đổi Tensorflow có thể tái sử dụng

lớp đầu vào

x = tf.placeholder("float", shape=[None, 74108]) 

y_ = tf.placeholder("float", shape=[None, 2]) 

x_image = tf.reshape(x, [-1,388,191,1]) 

lớp ra

W_fc2 = weight_variable([1024, 2]) 

b_fc2 = bias_variable([2]) 

Chạy sửa đổi mã cung cấp một stacktrace mơ hồ:

W tensorflow/core/common_runtime/executor.cc:1027] 0x2136510 Compute status: Invalid argument: Input has 14005248 values, which isn't divisible by 3136 
    [[Node: Reshape_4 = Reshape[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](MaxPool_5, Reshape_4/shape)]] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1267, in run 
    _run_using_default_session(self, feed_dict, self.graph, session) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2763, in _run_using_default_session 
    session.run(operation, feed_dict) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 345, in run 
    results = self._do_run(target_list, unique_fetch_targets, feed_dict_string) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 419, in _do_run 
    e.code) 
tensorflow.python.framework.errors.InvalidArgumentError: Input has 14005248 values, which isn't divisible by 3136 
    [[Node: Reshape_4 = Reshape[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](MaxPool_5, Reshape_4/shape)]] 
Caused by op u'Reshape_4', defined at: 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_array_ops.py", line 554, in reshape 
    name=name) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/op_def_library.py", line 633, in apply_op 
    op_def=op_def) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1710, in create_op 
    original_op=self._default_original_op, op_def=op_def) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 988, in __init__ 
    self._traceback = _extract_stack() 
+0

Tôi không nhận được bất kỳ lỗi nào khi thi hành mã của bạn bằng Python 2.7.10, TensorFlow 0.5.0 trên Ubuntu 14.10. – agold

Trả lời

6
tensorflow.python.framework.errors.InvalidArgumentError: Input has 14005248 values, which isn't divisible by 3136 
[[Node: Reshape_4 = Reshape[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](MaxPool_5, Reshape_4/shape)]] 

Nhưng cách bạn thực hiện nó ngăn không cho bạn nhìn thấy những dòng thực tế gây ra vấn đề. Lưu nó vào một tập tin và python <file> nó.

File "<stdin>", line 1, in <module> 

Nhưng câu trả lời là bạn chưa thay đổi kích thước của lớp xoắn và tổng hợp của bạn, vì vậy khi bạn sử dụng để chạy hình ảnh 28x28 qua, cuối cùng họ bị thu hẹp xuống còn một lớp (convolutional_depth) 7x7x. Bây giờ bạn đang chạy hình ảnh khổng lồ thông qua, vì vậy sau khi lớp xoắn đầu tiên và maxpool 2x2, bạn đã có một điều RẤT LỚN bạn đang cố gắng để nuôi, nhưng bạn đang định hình lại để:

h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
h_pool2 = max_pool_2x2(h_conv2) 

W_fc1 = weight_variable([7 * 7 * 64, 1024]) 
b_fc1 = bias_variable([1024]) 

Đầu ra của h_pool2 lớn hơn nhiều với hình ảnh lớn hơn của bạn. Bạn cần thu nhỏ chúng xuống nhiều hơn - có khả năng với nhiều lớp co giãn và maxpooling hơn. Bạn cũng có thể thử tăng kích thước của W_fc1 để phù hợp với kích thước đầu vào đang đến đó. Nó chạy qua hai cực đại 2x2 - mỗi cái co lại kích thước bằng 2 trong kích thước x và y. 28x28x1 -> 14x14x32 -> 7x7x64. Vì vậy, hình ảnh của bạn đang diễn ra từ 388 x 191 -> 194 x 95 -> 97 x 47

Như một cảnh báo, một lớp được kết nối đầy đủ với 97 * 47 = 4559 đầu vào sẽ bị chậm băng.

+0

dga: Cảm ơn sự thấu hiểu. Sẽ thử cách tiếp cận của bạn. – user2849678

+2

Một giải pháp khác là nhận ra rằng ["Không có lớp được kết nối đầy đủ, chỉ có các cuộc cách mạng" --Yann LeCun] (https://www.facebook.com/yann.lecun/posts/10152820758292143). Thay thế các lớp FC bằng các cuộc cách mạng và sử dụng thứ gì đó như "tổng hợp trung bình toàn cầu" để giảm từ bất kỳ kích thước hình ảnh nào sang hình dạng đã biết. – mdaoust

+0

@dga & mdaoust: Rất cám ơn. Tôi đã thử phương pháp được đề xuất bởi dga và nó hoạt động. Tôi vẫn đang tìm kiếm một cách giải thích đơn giản 'Conv Net cho núm vú giả'. Từ giải thích ở trên, tôi nhận được rằng 2x2 maxpool co lại kích thước bằng 2. Tại sao kích thước thứ 3 tăng gấp đôi với mỗi maxpool. – user2849678

Các vấn đề liên quan