2016-08-16 13 views
0

私は回転と各入力ボリュームのサイズを変えてデータを増強するニューラルネットワークに取り組んでいます。3次元可変サイズのリストを4Dの配列にナンプリ変換する

私はバックアップして、ネットワークへの入力は3Dボリュームです。私は可変サイズの3Dボリュームを生成し、入力ボリュームが一定になるように各ボリュームを0でパッドします。 hereに、パディングに問題があったかどうかを確認してください(解決済み)。

私は可変サイズの3Dボリュームを生成し、それをリストに追加してから、リストをnumpyの配列に変換します。この時点で、パディングが4Dタプルに変換することは意味がないので、発生していません...この時点で

input_augmented_matrix = [] 
label_augmented_matrix = [] 
for i in range(n_volumes): 
    if i % 50 == 0: 
     print ("Augmenting step #" + str(i)) 
    slice_index = randint(0,n_input) 
    z_max = randint(5,n_input) 
    z_rand = randint(3,5) 
    z_min = z_max - z_rand 
    x_max = randint(75, n_input_x) 
    x_rand = randint(60, 75) 
    x_min = x_max - x_rand 
    y_max = randint(75, n_input_y) 
    y_rand = randint(60, 75) 
    y_min = y_max - y_rand 
    random_rotation = randint(1,4) * 90 
    for j in range(2): 
     temp_volume = np.empty((z_rand, x_rand, y_rand)) 
     k = 0 
     for z in range(z_min, z_max): 
      l = 0 
      for x in range(x_min, x_max): 
       m = 0 
       for y in range(y_min, y_max): 
        if j == 0: 
         #input volume 
         try: 
          temp_volume[k][l][m] = input_matrix[z][x][y] 
         except: 
          pdb.set_trace() 
        else: 
         #ground truth volume 
         temp_volume[k][l][m] = label_matrix[z][x][y] 
        m = m + 1 
       l = l + 1 
      k = k + 1 
     temp_volume = np.asarray(temp_volume) 
     temp_volume = np.rot90(temp_volume,random_rotation) 
     if j == 0: 
      input_augmented_matrix.append(temp_volume) 
     else: 
      label_augmented_matrix.append(temp_volume) 

input_augmented_matrix = np.asarray(input_augmented_matrix) 
label_augmented_matrix = np.asarray(label_augmented_matrix) 

input_augmented_matrixの寸法は、次のコードで(N,)

そしてIパッドです。 ..

for i in range(n_volumes): 
    print("Padding volume #" + str(i)) 
    input_augmented_matrix[i] = np.lib.pad(input_augmented_matrix[i], ((0,n_input_z - int(input_augmented_matrix[i][:,0,0].shape[0])), 
               (0,n_input_x - int(input_augmented_matrix[i][0,:,0].shape[0])), 
               (0,n_input_y - int(input_augmented_matrix[i][0,0,:].shape[0]))), 
           'constant', constant_values=0) 
    label_augmented_matrix[i] = np.lib.pad(label_augmented_matrix[i], ((0,n_input_z - int(label_augmented_matrix[i][:,0,0].shape[0])), 
               (0,n_input_x - int(label_augmented_matrix[i][0,:,0].shape[0])), 
               (0,n_input_y - int(label_augmented_matrix[i][0,0,:].shape[0]))), 
           'constant', constant_values=0) 

この時点で、寸法は、リストのすべての要素が一定であっても、まだ(N,)です。たとえば、input_augmented_matrix[0] = input_augmented_matrix[1]

現在、私はループスルーして新しい配列を作成していますが、時間がかかりすぎて、これを自動化する方法が好きです。私は次のコードでそれを行います...

input_4d = np.empty((n_volumes, n_input_z, n_input_x, n_input_y)) 
label_4d = np.empty((n_volumes, n_input_z, n_input_x, n_input_y)) 
for i in range(n_volumes): 
    print("Converting to 4D tuple #" + str(i)) 
    for j in range(n_input_z): 
     for k in range(n_input_x): 
      for l in range(n_input_y): 
       input_4d[i][j][k][l] = input_augmented_matrix[i][j][k][l] 
       label_4d[i][j][k][l] = label_augmented_matrix[i][j][k][l] 

これを行うには、よりクリーンで高速な方法がありますか?

答えて

1

私はこの部分

k = 0 
for z in range(z_min, z_max): 
    l = 0 
    for x in range(x_min, x_max): 
     m = 0 
     for y in range(y_min, y_max): 
      if j == 0: 
       #input volume 
       try: 
        temp_volume[k][l][m] = input_matrix[z][x][y] 
       except: 
        pdb.set_trace() 
      else: 
       #ground truth volume 
       temp_volume[k][l][m] = label_matrix[z][x][y] 
      m = m + 1 
     l = l + 1 
    k = k + 1 

を理解できるようにあなたがちょうどここ

input_augmented_matrix[i] = np.lib.pad(
    input_augmented_matrix[i], 
    ((0,n_input_z - int(input_augmented_matrix[i][:,0,0].shape[0])), 
    (0,n_input_x - int(input_augmented_matrix[i][0,:,0].shape[0])), 
    (0,n_input_y - int(input_augmented_matrix[i][0,0,:].shape[0]))), 
    'constant', constant_values=0) 
0この

temp_input = input_matrix[z_min:z_max, x_min:x_max, y_min:y_max] 
temp_label = label_matrix[z_min:z_max, x_min:x_max, y_min:y_max] 

、その後

temp_input = np.rot90(temp_input, random_rotation) 
temp_label = np.rot90(temp_label, random_rotation) 

input_augmented_matrix.append(temp_input) 
label_augmented_matrix.append(temp_label) 

をしたいですshapeプロパティは、私は今あなたがNumPyの魔法のインデックスを使用して、コードの最後の部分をリファクタリングする準備が整いまし推測すべての次元

ia_shape = input_augmented_matrix[i].shape 
input_augmented_matrix[i] = np.lib.pad(
    input_augmented_matrix[i], 
    ((0, n_input_z - ia_shape[0]), 
    (0, n_input_x - ia_shape[1])), 
    (0, n_input_y - ia_shape[2]))), 
    'constant', 
    constant_values=0) 

によって配列のあなたのサイズを与えるので、これを行うことが

良いです。

私の一般的な提案:ループのあなたのカスケードのようなインデントを避けるために、コードの繰り返し部分のため

  • 使用機能。
  • ネストされたループがたくさん必要な場合は、再帰について考えてください。
  • NumPyの機能を探検してください。documentation:彼らは本当にエキサイティングです;たとえば、indexingはこのタスクに役立ちます。
  • PyLintFlake8パッケージを使用してコードの品質を検査します。

自分でニューラルネットワークを作成したいのですか、あるいは単にパターン認識タスクを解決したいですか? SciPyライブラリには、必要なものが含まれており、それはNumPyに基づいています。

+0

助けてくれてありがとう!これははるかに優れています:)これはテンソルフローネットワークのデータクラスです –

+0

@KendallWeihe大歓迎です!それはあなたの問題を解決するか、私は何かを逃したのですか? – Charlie

関連する問題