Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TensorFlow错误:ValueError(“形状%s和%s不兼容”(自身、其他))_Python_Tensorflow_Machine Learning_Keras_Deep Learning - Fatal编程技术网

Python TensorFlow错误:ValueError(“形状%s和%s不兼容”(自身、其他))

Python TensorFlow错误:ValueError(“形状%s和%s不兼容”(自身、其他)),python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我试图使用分类交叉熵作为损失函数,将PCB图像分为两类(缺陷和未缺陷)。其代码如下所示: 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 D

我试图使用
分类交叉熵
作为损失函数,将PCB图像分为两类(
缺陷
未缺陷
)。其代码如下所示:

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
我已经看过了,但无法解决错误

我真的很感谢你帮我解决这个问题

谢谢你,普拉文


这是完整的回溯

您的回溯链接不起作用。
但是,尝试用二进制交叉熵替换分类交叉熵,因为您只有两个类。

您的回溯链接不起作用。
但是,请尝试用二进制交叉熵替换分类交叉熵,因为您只有两个类。

似乎您的y_序列数据具有形状(无,1),而您的网络预期为(无,2)。有两个选项可以解决此问题:

1) 将模型输出更改为1个单位,并将损耗更改为二进制交叉熵

2) 将您的列车数据更改为“分类”。看


如果您可以在此处发布您的model.summary()和数据集形状,它将帮助我们帮助您。

您的y_train数据似乎具有形状(无,1),而您的网络正在期待(无,2)。有两个选项可以解决此问题:

1) 将模型输出更改为1个单位,并将损耗更改为二进制交叉熵

2) 将您的列车数据更改为“分类”。看


如果你能在这里发布你的model.summary()和你的数据集形状,它将帮助我们帮助你。

我也有同样的问题,但相反,我使用从TFRecord文件解码为int64格式的标签,将我的损失函数从“Category CrossEntropy”更改为“SparseCategoricCrossEntropy”,解决了这个问题。

我也有同样的问题,但是,相反,我使用从TFRecord文件解码为int64格式的标签,将丢失函数从“Category CrossEntropy”更改为“SparseCategoricalCrossentropy”,解决了这个问题。

我遇到了类似的问题,上述解决方案不起作用。出现此错误的主要原因是,我们无法在X_序列和Y_序列之间建立数据的1:1映射。这意味着Y列的形状应为(无顺序,无等级)

范例-

假设我的数据集有2000行和5个特性。其中1个序列=100行数据。 所以在改造x_之前,火车会是这样的

X_train.shape = (2000,5)
在输入LSTM之前,我们应该将其重塑为3D(通常),因此

另一方面,我们的Y_列车将在最初启动。(如果是2D,则通过展平将其更改为1D)

因此,在输入LSTM之前,我们应该改变Y_列的形状,如

Y_train.shape =(20, 5)
20将与列车集进行1:1映射,而5将与分类模型的最后一个密集层进行映射,我们应该使用分类交叉熵

另外请注意,Y_系列应为2D形状。那么,我们如何将它重新塑造成那样呢

  • 检查列车数据的显示方式

  • 如果在字符串中,请使用一个热表示

  • 如果每个类都是整数,则转换为category()

  • 更改为“分类”后,请再次转乘Y_列车

  • 如果类号和列数相等,则使用以下代码将行数减少到20(如X_列)


  • 这应该行得通。您还应该以类似的方式更改Y_测试。

    我遇到了类似的问题,上述解决方案不起作用。出现此错误的主要原因是,我们无法在X_序列和Y_序列之间建立数据的1:1映射。这意味着Y列的形状应为(无顺序,无等级)

    范例-

    假设我的数据集有2000行和5个特性。其中1个序列=100行数据。 所以在改造x_之前,火车会是这样的

    X_train.shape = (2000,5)
    
    在输入LSTM之前,我们应该将其重塑为3D(通常),因此

    另一方面,我们的Y_列车将在最初启动。(如果是2D,则通过展平将其更改为1D)

    因此,在输入LSTM之前,我们应该改变Y_列的形状,如

    Y_train.shape =(20, 5)
    
    20将与列车集进行1:1映射,而5将与分类模型的最后一个密集层进行映射,我们应该使用分类交叉熵

    另外请注意,Y_系列应为2D形状。那么,我们如何将它重新塑造成那样呢

  • 检查列车数据的显示方式

  • 如果在字符串中,请使用一个热表示

  • 如果每个类都是整数,则转换为category()

  • 更改为“分类”后,请再次转乘Y_列车

  • 如果类号和列数相等,则使用以下代码将行数减少到20(如X_列)


  • 这应该行得通。您也应该以类似的方式更改Y_测试。

    感谢您查看问题:)我已经尝试了
    二进制交叉熵
    ,但没有任何区别。@PraveenRaj您找到了解决方法吗?,请分享谢谢你看这个问题:)我试过
    二进制交叉熵
    ,但没有任何区别。@PraveenRaj你找到了什么解决办法吗?请分享非常感谢。将y_列更改为分类数据解决了我的错误。非常感谢。将y_序列更改为分类数据解决了我的错误。您能解释一下为什么这会有帮助吗?我也为我的花瓣笔记本做了同样的事。。。成功了!来自tensorflow官方文档:
    当有两个或更多标签类时,使用此交叉熵度量。我们希望标签以整数形式提供。如果要使用一个热表示提供标签,请使用CategoricalCrossentropy度量。对于y#u pred和单个floati,每个功能都应该有#类浮点值
    
    for eachRowTemp in range(df_Y_Labels.__len__()):
       if(eachRowTemp%20 == 1):    
          Y_Label_Array.append(df_Y_Labels.loc[eachRowTemp])
     Y_Label = np.asarray(Y_Label_Array)