8

심층적 인 컨볼 루션 신경망을 만들어 이미지의 개별 픽셀을 분류했습니다. 내 교육 데이터는 항상 동일한 크기 (32x32x7)이지만 테스트 데이터는 모든 크기가 될 수 있습니다.Tensorflow CNN 트레이닝 이미지는 모두 다른 크기입니다.

Github Repository

현재 내 모델은 같은 크기 이미지에서 작동합니다. 나는 tensorflow mnist tutorial을 광범위하게 사용하여 모델을 구성하는 데 도움이되었습니다. 이 자습서에서는 28x28 이미지 만 사용합니다. 어떤 크기의 이미지를 받아들이도록 다음과 같은 모델을 어떻게 변경하겠습니까?

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]) 

내 모델은 출력 형태를 지정해야 회선을 바꾸어이 상황이 조금 더 복잡하게합니다. 트랜스 포즈 컨볼 루션이 입력과 동일한 크기의 모양을 출력 할 수 있도록 다음 코드 행을 어떻게 조정합니까?

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

불행하게도 (당신은 fold으로 시도 할 수 있지만 질문의 범위 밖이다) Tensorflow 동적 그래프를 구축 할 수있는 방법이 없습니다. 이 두 가지 옵션을 잎 :

  1. 을 버킷 팅 : 당신은 몇 손에 여러 입력 텐서를 만들 크기를 포착하고 런타임에 당신은 바로 양동이 (예 참조)을 선택합니다. 어쨌든 두 번째 옵션이 필요할 것입니다.

  2. Seq2seq with bucketing는 입력 및 출력 이미지의 크기를 조정. 이미지가 모두 동일한 종횡비를 유지한다고 가정하면 추론 전에 이미지의 크기를 조정할 수 있습니다. MNIST가 분류 작업이기 때문에 왜 출력에 관심을 갖는지 잘 모르겠습니다.

어느 쪽이든 같은 방법을 사용할 수 있습니다

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

당신이 회선 네트워크에 FC 네트워크를 사용하는 예제가 아니라 언급 된 mnist 모델 코드입니다. [없음, 784]의 입력 모양은 mnist 크기 (28 x 28)에 대해 제공됩니다. 이 예는 입력 크기가 고정 된 FC 네트워크입니다. 무게와 편견의 수를 입력 모양에 의존하기 때문에 당신이 요구하는 어떤

는 FC 네트워크에서 수 없습니다. 완전 컨볼 루션 (full convolution) 아키텍처를 사용하는 경우 가능합니다. 그래서 제 제안은 가중치와 바이어스가 입력 모양에 의존하지 않도록 완전 컨볼 루션 구조를 사용하는 것입니다.

0

@gidim's answer에 추가하면 Tensorflow에서 이미지의 크기를 조정하고 결과를 사용자의 추론에 직접 제공하는 방법이 있습니다. . 참고 :이 방법은 이미지의 크기를 조절하고 왜곡 시키므로 손실이 증가 할 수 있습니다.

모든 신용 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 
관련 문제