【问题标题】:'ValueError: logits and labels must have the same shape ((None, 2) vs (None, 1))''ValueError:logits 和标签必须具有相同的形状 ((None, 2) vs (None, 1))'
【发布时间】:2021-10-28 06:47:10
【问题描述】:

我在 tensorflow 中有一个具有 6 个隐藏层的卷积神经网络,现在我有两个用于分类的类,但在最后一个密集层(softmax 激活函数)。因为我有两个类,所以输出层需要两个神经元,但是每当我放两个时,我就会得到错误:

' ValueError: logits 和 labels 必须具有相同的形状 ((None, 2) vs (None, 1))'

但是,它适用于一个神经元。

这是我创建模型的代码:

import tensorflow as tf
import tensorflow.keras as keras
import os
import math
import cv2
import numpy as np
from tensorflow.keras import regularizers
from tensorflow.keras.models import Sequential


train_imgdata=[]
train_classes=[]
test_imgdata=[]
test_classes=[]


TYPE={"Dataset/Train", "Dataset/Validate"}
Category={"Glaucoma", "Non-Glaucoma"}







def GetData():
    for n, tpe in enumerate(TYPE):
        if n==0:
            for i, cat in enumerate(Category):
                clss=i
                OGpath=os.path.join(tpe,cat)
                print (OGpath)
                for file in os.listdir(OGpath):
                    filepath=os.path.join (OGpath, file)
                    image=cv2.imread(filepath)
                    image_resized=cv2.resize(image,(1700,1300))
                    train_imgdata.append(image_resized)
                    train_classes.append(clss)

        else:
            
            for i, cat in enumerate(Category):
                clss=i
                OGpath=os.path.join(tpe,cat)
                print (OGpath)
                for file in os.listdir(OGpath):
                    filepath=os.path.join (OGpath, file)
                    image=cv2.imread(filepath)
                    image_resized=cv2.resize(image,(1700,1300))
                    test_imgdata.append(image_resized)
                    test_classes.append(clss)
                    

            
def plot_history (training):
    axs[0].plot(training.history["accuracy"], label="train accuracy")
    axs[0].plot(training.history["val_accuracy"], label="validation accuracy")
    axs[0].set_ylabel("Accuracy")
    axs[0].setlegend(loc="lower right")
    axs[0].set.set_title("Accuracy_eval")
        
        
   
        
        
        
        
        
def CreateModel(InShape):

    model = tf.keras.models.Sequential() 

 

    # 1st conv layer 

    model.add(keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(1300, 1700,3), kernel_regularizer=regularizers.l2(0.01))) 

    model.add(keras.layers.MaxPooling2D((3, 3), strides=(2, 2), padding='same')) 
    model.add(keras.layers.Dropout(0.3)) 
    

 

    # 2nd conv layer 

    model.add(keras.layers.Conv2D(64, (3, 3), activation='relu')) 

    model.add(keras.layers.MaxPooling2D((3, 3), strides=(2, 2), padding='same')) 
    model.add(keras.layers.Dropout(0.3)) 
 

 

    # 3rd conv layer 

    model.add(keras.layers.Conv2D(128, (2, 2), activation='relu')) 

    model.add(keras.layers.MaxPooling2D((2, 2), strides=(2, 2), padding='same')) 
    model.add(keras.layers.Dropout(0.3)) 
 

 

    # flatten output and feed it into dense layer 

    model.add(keras.layers.Flatten()) 

    model.add(keras.layers.Dense(64, activation='relu')) 

    model.add(keras.layers.Dropout(0.3)) 

 

    # output layer 

    model.add(keras.layers.Dense(2, activation='sigmoid')) 

 

    return model 

 

 

 

 
    

    
if __name__=="__main__":
    
    
    GetData()
    real_train_imgdata=np.array(train_imgdata)
    
    real_train_classes=np.array(train_classes)
    
    real_test_imgdata=np.array(test_imgdata)
    
    real_test_classes=np.array(test_classes)
    
        
    inputshape=(real_train_imgdata.shape[1], real_train_imgdata.shape[2], real_train_imgdata.shape[3])
    
    
    
    model=CreateModel(inputshape)
    
    optimiser= keras.optimizers.Adam (learning_rate=0.001)
    
    model.compile(optimizer=optimiser,
                 loss="binary_crossentropy",
                 metrics=["accuracy"])
    model.summary()
    
    
    model.fit(real_train_imgdata, real_train_classes, validation_data=(real_test_imgdata, real_test_classes), batch_size=3, epochs=30)

【问题讨论】:

    标签: tensorflow keras jupyter-notebook tensorflow2.0


    【解决方案1】:

    您对 train_classes/test_classes 值使用单个标量,它只是类别索引(0 或 1),但您的模型分别预测两个类别中的每一个的可能性。您可以更改为使用模型的单个输出(如果“青光眼”则为 0,如果“非青光眼”则为 1,反之亦然)或使用两个值的数组([1, 0] 或 [0, 1] ) 用于传递给 model.fit() 的目标值。第二种方法是所谓的“单热编码”的一个简单示例。

    【讨论】:

    • 但是它是如何在输出中只使用一个神经元来计算两个类的可能性的,它只是计算一个神经元的概率并找出另一个?此外,在这种情况下使用 one-hot 编码比在另一种情况下有什么好处?最后,我认为我的模型通过使用输出层中最可能的选项只创建了一个输出,它不是/它实际上在做什么。附言很抱歉所有问题,非常感谢您的回复。
    • 您使用的测试数据似乎是二元分类,“青光眼”或“非青光眼”。如果是这种情况,您只需要一个输出,假设使用“青光眼”案例作为 1,以便输出值可以被认为是特定样本来自“青光眼”类的概率。对于二元分类问题,使用两个输出而不是一个输出可能没有任何好处。如果您添加更多类别(例如“开角型青光眼”、“闭角型青光眼”和“正常眼压型青光眼”),则需要切换到多个输出。
    猜你喜欢
    • 2021-07-27
    • 2021-07-28
    • 2020-12-02
    • 2021-03-23
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 2023-04-08
    相关资源
    最近更新 更多