import tensorflow as tf
import numpy as np
from sklearn.model_selection import train_test_split

np.random.seed(4213)

data = np.random.randint(low=1,high=29, size=(500, 160, 160, 10)) 
labels = np.random.randint(low=0,high=5, size=(500, 160, 160)) 
nclass = len(np.unique(labels))
print (nclass)

samples, width, height, nbands = data.shape


X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=0.25, random_state=421)

print (X_train.shape)
print (y_train.shape)

arch = tf.keras.applications.VGG16(input_shape=[width, height, nbands],
                      include_top=False,
                      weights=None)

model = tf.keras.Sequential()
model.add(arch)
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(nclass))

model.compile(optimizer = tf.keras.optimizers.Adam(0.0001),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(),
              metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])
    

model.fit(X_train,
          y_train,                                 
          epochs=3,
          batch_size=32,
          verbose=2)


res = model.predict(X_test)
print(res.shape)

Podczas uruchamiania powyższego kodu dla semantic segmentation otrzymuję wyjątek:

InvalidArgumentError
 Incompatible shapes: [32,160,160] vs. [32]
     [[node Equal (defined at c...:38) ]] [Op:__inference_train_function_1815]


tensorflow.python.framework.errors_impl.InvalidArgumentError
2
thunder 28 lipiec 2020, 10:49

1 odpowiedź

Najlepsza odpowiedź

Twój problem pochodzi z wielkości ostatniej warstwy (aby uniknąć tych błędów, zawsze pożądane jest użycie stałych Python dla {X0}}, WIDTH, HEIGHT i N_CHANNELS i N_CHANNELS i N_CHANNELS i N_CHANNELS i N_CHANNELS X4}}):

Do klasyfikacji obrazu

Powinieneś przypisać jedną etykietę do każdego obrazu. Spróbuj przełączać labels:

import tensorflow as tf
import numpy as np
from sklearn.model_selection import train_test_split

np.random.seed(4213)

N_IMAGES, WIDTH, HEIGHT, N_CHANNELS = (500, 160, 160, 10)
N_CLASSES  = 5

data = np.random.randint(low=1,high=29, size=(N_IMAGES, WIDTH, HEIGHT, N_CHANNELS)) 
labels = np.random.randint(low=0,high=N_CLASSES, size=(N_IMAGES)) 
#...

Dla segmentacji semantycznej

Upewnij się, że Twój klasyfikator (ostatnie warstwy sieci) jest odpowiednio wielkości. W takim przypadku potrzebujesz 1 klasy na piksel:

#...
model = tf.keras.Sequential()
model.add(arch)
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(width * height))
model.add(tf.keras.layers.Reshape([width , height]))
#...

To najprostsze, możesz dostać. Zamiast tego możesz skonfigurować wiele warstw dekonvolution, aby działać jako klasyfikator lub nawet przerzucić architekturę arch i użyć go do wygenerowania wyników klasyfikacji. Ortogohally można wykonać one_hot kodowanie na etykietach, a tym samym rozszerzyć je o współczynnik N_CLASSES, skutecznie pomnożyć liczbę neuronów w ostatniej warstwie.

0
ibarrond 4 sierpień 2020, 11:53