2016-02-27 6 views
9
import tensorflow as tf 
import numpy as np 
import os 
from PIL import Image 
cur_dir = os.getcwd() 

def modify_image(image): 
    #resized = tf.image.resize_images(image, 180, 180, 3) 
    image.set_shape([32,32,3]) 
    flipped_images = tf.image.flip_up_down(image) 
    return flipped_images 

def read_image(filename_queue): 
    reader = tf.WholeFileReader() 
    key,value = reader.read(filename_queue) 
    image = tf.image.decode_jpeg(value) 
    return key,image 

def inputs(): 
filenames = ['standard_1.jpg', 'standard_2.jpg' ] 
filename_queue = tf.train.string_input_producer(filenames) 
filename,read_input = read_image(filename_queue) 
reshaped_image = modify_image(read_input) 
reshaped_image = tf.cast(reshaped_image, tf.float32) 
label=tf.constant([1]) 
return reshaped_image,label 

def weight_variable(shape): 
initial = tf.truncated_normal(shape, stddev=0.1) 
return tf.Variable(initial) 

def bias_variable(shape): 
initial = tf.constant(0.1, shape=shape) 
return tf.Variable(initial) 

def conv2d(x, W): 
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 

def max_pool_2x2(x): 
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], 
        strides=[1, 2, 2, 1], padding='SAME') 

x = tf.placeholder(tf.float32, shape=[None,32,32,3]) 
y_ = tf.placeholder(tf.float32, shape=[None, 1]) 
image,label=inputs() 
image=tf.reshape(image,[-1,32,32,3]) 
label=tf.reshape(label,[-1,1]) 
image_batch=tf.train.batch([image],batch_size=2) 
label_batch=tf.train.batch([label],batch_size=2) 

W_conv1 = weight_variable([5, 5, 3, 32]) 
b_conv1 = bias_variable([32]) 

image_4d=x_image = tf.reshape(image, [-1,32,32,3]) 

h_conv1 = tf.nn.relu(conv2d(image_4d, W_conv1) + b_conv1) 
h_pool1 = max_pool_2x2(h_conv1) 

W_conv2 = weight_variable([5, 5, 32, 64]) 
b_conv2 = bias_variable([64]) 

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

W_fc1 = weight_variable([8 * 8 * 64, 1024]) 
b_fc1 = bias_variable([1024]) 
h_pool2_flat = tf.reshape(h_pool2, [-1, 8*8*64]) 
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) 
keep_prob = tf.placeholder(tf.float32) 
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) 

W_fc2 = weight_variable([1024, 2]) 
b_fc2 = bias_variable([2]) 

y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) 
cross_entropy= -tf.reduce_sum(tf.cast(image_batch[1],tf.float32)*tf.log(y_conv)) 
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) 

init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 

for i in range(20000): 
sess.run(train_step,feed_dict={x:image_batch[0:1],y_:label_batch[0:1]}) 

मैं [32x32x3] छवियों के आयाम के अपने ही छवियों पर tensorflow convolutional मॉडल को चलाने के लिए कोशिश कर रहा हूँ। छवियों को ठीक से पढ़ा जा रहा है और प्रशिक्षण के दौरान प्लेसहोल्डर को सौंपा जा रहा है। Train_step op चलाने के दौरान समस्या उत्पन्न होती है। जब मैं ग्राफ निष्पादित करता हूं तो मुझे निम्न त्रुटि मिलती है।Tensorflow त्रुटि "आकार Tensorshape() रैंक 1 होना चाहिए"

TensorShape([Dimension(2), Dimension(1), Dimension(32), Dimension(32), Dimension(3)]) must have rank 1 

लेकिन जब मैं उदाहरण here देखते हैं, छवियों [batch_size, ऊंचाई, चौड़ाई, गहराई] केवल tensors के रूप में कर रहे हैं। और यह उदाहरण ठीक काम करता है। क्या मुझे कुछ याद आ रही है?

+4

यह सवाल अभी भी उपयोगी होने के लिए प्रबंधन करता है, लेकिन होता है * रास्ता * अधिक कोड से समस्या का प्रदर्शन करने के लिए आवश्यक है - और यह अब सिर्फ विफल रही है टुकड़ा करने की क्रिया आपरेशन करने के लिए इसे नीचे ट्रिम करने के लिए मुश्किल है क्योंकि जवाब पतों की अन्य बिट्स प्रश्न के लिए अप्रासंगिक पोस्ट कोड पूछा गया। अगली बार अपने कोड को कम से कम उदाहरण पर ट्रिम करें; इसे पुनरुत्पादित करने के लिए 8 लाइनों की आवश्यकता नहीं थी, अकेले 80 चलो। –

उत्तर

13

मुझे लगता है कि त्रुटि इस लाइन से आ रही है: आकार [2, 1, 32, 32, 3], जहां 2 tf.train.batch() करने के लिए batch_size तर्क है साथ,

cross_entropy= -tf.reduce_sum(tf.cast(image_batch[1],tf.float32)*tf.log(y_conv)) 

image_batch 5 डी टेन्सर है, और 1 पहले से जोड़ा गया image = tf.reshape(image, [-1, 32, 32, 3])। (एनबी यह रीशेप अनावश्यक है, क्योंकि tf.train.batch() पहले से ही बैच आयाम जोड़ता है, और आप पूर्व को रीशेप के प्रभाव को समाप्त करते हैं जब आप बाद में image_4d बनाते हैं)।

टेंसरफ्लो में, स्लाइसिंग ऑपरेशन (यानी image_batch[1]) न्यूमपी की तुलना में थोड़ा कम लचीला है। स्लाइस में निर्दिष्ट आयामों की संख्या टेंसर के रैंक के बराबर होनी चाहिए: यानी आपको काम करने के लिए सभी पांच आयाम निर्दिष्ट करना होगा। image_batch का 4-डी टुकड़ा प्राप्त करने के लिए आप image_batch[1, :, :, :, :] निर्दिष्ट कर सकते हैं।

मैं अपने कार्यक्रम में कुछ अन्य मुद्दों पर ध्यान, तथापि:

  1. cross_entropy गणना अजीब लगता है। आम तौर पर यह एक अनुमानित लेबल का उपयोग करता है और छवि डेटा के विपरीत, ज्ञात लेबल पर इसकी तुलना करता है।

  2. प्रशिक्षण चरण पर फ़ीड का कोई असर नहीं पड़ता है, क्योंकि प्लेसहोल्डर्स x और y_ आपके प्रोग्राम में अप्रयुक्त हैं। इसके अलावा, आप tf.Tensor (वास्तव में, image_batch का अवैध टुकड़ा) खिला रहे हैं, इसलिए जब आप उस कथन को निष्पादित करेंगे तो यह असफल हो जाएगा। यदि आप भोजन का उपयोग करना चाहते हैं, तो आपको इनपुट डेटा रखने वाले न्यूम्पी एरे में फ़ीड करना चाहिए।

  3. आप उपयोग कर खिला नहीं कर रहे हैं — अर्थात के रूप में अपने कार्यक्रम में दिखाया गया — आप कॉल करना tf.train.start_queue_runners() आरंभ करने के लिए की आवश्यकता होगी tf.WholeFileReader का उपयोग कर। अन्यथा आपका प्रोग्राम लटकाएगा, इनपुट की प्रतीक्षा करेगा।

संबंधित मुद्दे