Ошибка TensorFlow: ValueError («Формы% s и% s несовместимы»% (self, other)) - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь классифицировать изображения печатных плат на две категории (defected и undefected), используя categorical cross-entropy в качестве функции потерь. Код для того же приведен ниже:

import numpy as np
import matplotlib.pyplot as plt

import tensorflow
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint


from keras.applications.resnet50 import preprocess_input
from keras.preprocessing.image import ImageDataGenerator

from sklearn.model_selection import train_test_split

def create_compiled_model():
  model = Sequential()
  model.add(ResNet50(include_top=False, weights=RESNET50_WEIGHTS, input_shape=(IMAGE_SIZE, IMAGE_SIZE, 3), pooling=RESNET50_POOLING_AVERAGE))
  model.add(Dense(NUM_CLASSES, activation=DENSE_LAYER_ACTIVATION))
  model.layers[0].trainable = False

  sgd = SGD(lr = 0.01, decay = 1e-6, momentum = 0.9, nesterov = True)
  model.compile(optimizer = sgd, loss = OBJECTIVE_FUNCTION, metrics = LOSS_METRICS)

  return model

def data_splitor():
  x = np.load("/content/data/xtrain.npy")
  y = np.load("/content/data/ytrain.npy")

  # Getting the Test and Train splits
  x_train, x_test, y_train, y_test = train_test_split(x, y, test_size= TRAIN_TEST_SPLIT, shuffle= True)

  # Getting the Train and Validation splits
  x__train, x__valid, y__train, y__valid = train_test_split(x_train, y_train, test_size= TRAIN_TEST_SPLIT, shuffle= True)

  return x__train, x__valid, x_test, y__train, y__valid, y_test

def data_generator(x, y, batch_size, seed=None, shuffle=True):
  data_generator = ImageDataGenerator(horizontal_flip=True, vertical_flip=True, rotation_range=180, brightness_range=[0.3, 1.0], preprocessing_function=preprocess_input)
  generator = data_generator.flow(x_train, y_train, batch_size= batch_size, seed= seed, shuffle=shuffle)
  return generator

def run_program():
  x_train, x_valid, x_test, y_train, y_valid, y_test = data_splitor()
  train_generator = data_generator(x_train, y_train, BATCH_SIZE_TRAINING)
  validation_generator = data_generator(x_valid, y_valid, BATCH_SIZE_VALIDATION)

  cb_early_stopper = EarlyStopping(monitor = 'val_loss', patience = EARLY_STOP_PATIENCE)
  cb_checkpointer = ModelCheckpoint(filepath = '/content/model/best.hdf5', monitor = 'val_loss', save_best_only = True, mode = 'auto')

  model = create_compiled_model()

  fit_history = model.fit_generator(
        train_generator,
        steps_per_epoch=STEPS_PER_EPOCH_TRAINING,
        epochs = NUM_EPOCHS,
        validation_data=validation_generator,
        validation_steps=STEPS_PER_EPOCH_VALIDATION,
        callbacks=[cb_checkpointer, cb_early_stopper]
  )

  plt.figure(1, figsize = (15,8)) 

  plt.subplot(221)
  plt.plot(fit_history.history['acc'])  
  plt.plot(fit_history.history['val_acc'])  
  plt.title('model accuracy')  
  plt.ylabel('accuracy')  
  plt.xlabel('epoch')  
  plt.legend(['train', 'valid']) 

  plt.subplot(222)  
  plt.plot(fit_history.history['loss'])  
  plt.plot(fit_history.history['val_loss'])  
  plt.title('model loss')  
  plt.ylabel('loss')  
  plt.xlabel('epoch')  
  plt.legend(['train', 'valid']) 

  plt.show()


  # Testing
  test_generator = data_generator(x_test, y_test, BATCH_SIZE_TESTING, 123, False)
  test_generator.reset()

  model.load_weights("/content/model/best.hdf5")
  pred = model.predict_generator(test_generator, steps = len(test_generator), verbose = 1)

  predicted_class_indices = np.argmax(pred, axis = 1)


# Running the program
try:
  with tensorflow.device('/device:GPU:0'):
    run_program()
except RuntimeError as e:
  print(e)

И после выполнения этого я получаю ошибку ValueError, показанную ниже:

ValueError: in user code:

    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:571 train_function  *
        outputs = self.distribute_strategy.run(
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:951 run  **
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2290 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2649 _call_for_each_replica
        return fn(*args, **kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:533 train_step  **
        y, y_pred, sample_weight, regularization_losses=self.losses)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/compile_utils.py:204 __call__
        loss_value = loss_obj(y_t, y_p, sample_weight=sw)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/losses.py:143 __call__
        losses = self.call(y_true, y_pred)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/losses.py:246 call
        return self.fn(y_true, y_pred, **self._fn_kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/losses.py:1527 categorical_crossentropy
        return K.categorical_crossentropy(y_true, y_pred, from_logits=from_logits)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/backend.py:4561 categorical_crossentropy
        target.shape.assert_is_compatible_with(output.shape)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/tensor_shape.py:1117 assert_is_compatible_with
        raise ValueError("Shapes %s and %s are incompatible" % (self, other))

    ValueError: Shapes (None, 1) and (None, 2) are incompatible

Я уже посмотрел на это , это и это , но не удалось устранить ошибку.

Я очень признателен за помощь в исправлении этого.

Спасибо, Правин

Вот полный трекбек ... ссылка

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Ваша обратная ссылка не работает. Однако попробуйте заменить категориальную кросс-энтропию бинарной кросс-энтропией, поскольку у вас есть только два класса.

0 голосов
/ 27 апреля 2020

Кажется, что ваши данные y_train имеют форму (Нет, 1), в то время как ваша сеть ожидает (Нет, 2). Есть два варианта решения этой проблемы:

1) Измените выход вашей модели на 1 единицу и измените потери на двоичную кроссентропию

или

2) Измените ваши данные y_train на категориальные , См. this

Если вы можете опубликовать здесь свою модель.summary () и формы набора данных, это поможет нам помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...