8

मैंने एक छवि में व्यक्तिगत पिक्सेल वर्गीकृत करने के लिए एक गहरी कनवॉल्यूशन तंत्रिका नेटवर्क बनाया है। मेरा प्रशिक्षण डेटा हमेशा एक ही आकार (32x32x7) होगा, लेकिन मेरा परीक्षण डेटा किसी भी आकार का हो सकता है।टेन्सफोर्लो सीएनएन प्रशिक्षण छवियां सभी अलग-अलग आकार हैं

Github Repository

वर्तमान में, अपने मॉडल केवल छवियों है कि एक ही आकार के होते हैं पर काम करेंगे। मैंने अपने मॉडल को बनाने में मदद करने के लिए बड़े पैमाने पर tensorflow mnist tutorial का उपयोग किया है। इस ट्यूटोरियल में, हम केवल 28x28 छवियों का उपयोग करते हैं। किसी भी आकार की छवियों को स्वीकार करने के लिए निम्नलिखित mnist मॉडल कैसे बदला जाएगा?

x = tf.placeholder(tf.float32, shape=[None, 784]) 
y_ = tf.placeholder(tf.float32, shape=[None, 10]) 
W = tf.Variable(tf.zeros([784,10])) 
b = tf.Variable(tf.zeros([10])) 
x_image = tf.reshape(x, [-1, 28, 28, 1]) 

बातें थोड़ा और अधिक जटिल बनाने के लिए, अपने मॉडल convolutions जहां उत्पादन आकार निर्दिष्ट करने की आवश्यकता है स्थानांतरित किया है। मैं कोड की निम्न पंक्ति को कैसे समायोजित करूं ताकि ट्रांसपोज़र कनवॉल्यूशन इनपुट के समान आकार के आकार को आउटपुट करेगा।

DeConnv1 = tf.nn.conv3d_transpose(layer1, filter = w, output_shape = [1,32,32,7,1], strides = [1,2,2,2,1], padding = 'SAME')  
+0

आम तौर पर, आपको प्रशिक्षण और अनुमान दोनों के लिए अपनी वर्गीकरण प्रणाली में डेटा प्राप्त करने के लिए उसी पाइपलाइन का उपयोग करना चाहिए। आप 32x32x7 छवियों को कैसे उत्पन्न करते हैं? अपने कार्य के बावजूद अपनी वर्गीकरण प्रणाली में डेटा प्राप्त करने के लिए उसी तकनीक का उपयोग करें। – RagingRoosevelt

उत्तर

4

दुर्भाग्य से Tensorflow में गतिशील रेखांकन निर्माण करने के लिए (आप fold साथ की कोशिश कर सकते हैं, लेकिन यह सवाल के दायरे से बाहर है) कोई रास्ता नहीं है। यह दो विकल्पों के साथ आप छोड़ देता है:

  1. बकेटिंग: आप कुछ हाथ में एकाधिक इनपुट tensors बनाने उठाया आकार और उसके बाद क्रम में आप सही बाल्टी (उदाहरण देखें) चुनें। किसी भी तरह से आपको शायद दूसरे विकल्प की आवश्यकता होगी। Seq2seq with bucketing

  2. इनपुट और आउटपुट छवियों का आकार बदलें। छवियों को मानते हुए सभी एक ही पहलू राशन को बनाए रखते हैं, आप अनुमान से पहले छवि का आकार बदलने का प्रयास कर सकते हैं। सुनिश्चित नहीं है कि आप आउटपुट के बारे में क्यों ख्याल रखते हैं क्योंकि एमएनआईएसटी एक वर्गीकरण कार्य है।

किसी भी तरह से आप एक ही दृष्टिकोण का उपयोग कर सकते हैं:

from PIL import Image 

basewidth = 28 # MNIST image width 
img = Image.open('your_input_img.jpg') 
wpercent = (basewidth/float(img.size[0])) 
hsize = int((float(img.size[1])*float(wpercent))) 
img = img.resize((basewidth,hsize), Image.ANTIALIAS) 

# Save image or feed directly to tensorflow 
img.save('feed_to_tf.jpg') 
+0

न्यूनतम डेटा के बारे में मैंने जो भी कहा, उसे भूलना, मैं अपने कार्य के लिए परिवर्तनीय आकार के इनपुट के बारे में कैसे जाउंगा?पेपर में, यह उल्लेख किया गया है कि वे deconvolutions का उपयोग करें ताकि किसी भी आकार का इनपुट संभव हो। हालांकि, जब मैं अपने प्रश्न में देखा गया एक deconvolution का उपयोग करता हूं, तो मुझे आउटपुट आकार निर्दिष्ट करने की आवश्यकता होती है। –

0

mnist मॉडल कोड है जो आप का उल्लेख घुमाव के नेटवर्क के लिए एफसी नेटवर्क का उपयोग कर एक उदाहरण है और नहीं। [नो, 784] का इनपुट आकार मिनिस्ट आकार (28 x 28) के लिए दिया जाता है। उदाहरण एक एफसी नेटवर्क है जिसने इनपुट आकार तय किया है।

जो आप पूछ रहे हैं वह एफसी नेटवर्क में संभव नहीं है क्योंकि वजन और पूर्वाग्रहों की संख्या इनपुट आकार पर निर्भर होती है। यदि आप पूरी तरह से दृढ़ संकल्प वास्तुकला का उपयोग कर रहे हैं तो यह संभव है। तो मेरा सुझाव है कि पूरी तरह से संकल्प आर्किटेक्चर का उपयोग करना ताकि वजन और पूर्वाग्रह इनपुट आकार

0

@gidim's answer में जोड़ रहे हैं, तो यहां बताया गया है कि आप टेन्सफोर्लो में छवियों का आकार कैसे बदल सकते हैं और परिणामों को सीधे अपने अनुमान में फ़ीड कर सकते हैं । नोट: यह विधि छवि को स्केल और विकृत करती है, जो आपके नुकसान को बढ़ा सकती है।

सभी क्रेडिट Prasad Pai's article on Data Augmentation पर जाते हैं।

import tensorflow as tf 
import numpy as np 
from PIL import Image 

IMAGE_SIZE = 32 
CHANNELS = 1 

def tf_resize_images(X_img_file_paths): 
    X_data = [] 
    tf.reset_default_graph() 
    X = tf.placeholder(tf.float32, (None, None, CHANNELS)) 
    tf_img = tf.image.resize_images(X, (IMAGE_SIZE, IMAGE_SIZE), 
            tf.image.ResizeMethod.NEAREST_NEIGHBOR) 
    with tf.Session() as sess: 
     sess.run(tf.global_variables_initializer()) 

     # Each image is resized individually as different image may be of different size. 
     for index, file_path in enumerate(X_img_file_paths): 
      img = Image.open(file_path) 
      resized_img = sess.run(tf_img, feed_dict = {X: img}) 
      X_data.append(resized_img) 

    X_data = np.array(X_data, dtype = np.float32) # Convert to numpy 
    return X_data 
संबंधित मुद्दे