TensorFlow ValueError:logits 和标签必须具有相同的形状 ((25, 1) vs (1, 1))

Posted

技术标签:

【中文标题】TensorFlow ValueError:logits 和标签必须具有相同的形状 ((25, 1) vs (1, 1))【英文标题】:TensorFlow ValueError: logits and labels must have the same shape ((25, 1) vs (1, 1)) 【发布时间】:2021-09-19 11:15:56 【问题描述】:

我一直在构建一个包含 25 个特征的分类模型,并且一直在下面收到此错误代码,不确定该错误是来自数据的构建还是模型的构建?也可能是我如何构建数据集张量的问题

ps 对 tensorflow 和堆栈溢出的超级新手

data = np.array(pd.read_csv('DATASET_2018.csv'))




#creating labels 
labels = np.array([]) 

for i in range(len(data)):
    labels = np.append(labels, float(data[i][0]))
    
labels = labels.reshape(623)




#seperating data 
data_set = np.array([])

for i in range(len(data)):
    broken_features =  data[i][1][1:-1].split(',')
    dummy_data = [] 
    for x in broken_features:
        dummy_data.append(float(x))
    data_set = np.append(data_set, dummy_data)
    
data_set = data_set.reshape(623, 25)



#splitting data into testing and training data 

test_data = data_set[int(-len(data_set)*0.20):]
test_labels = labels[int(-len(data_set)*0.20):]

train_data = data_set[:int(-len(data_set)*0.20)]
train_labels = labels[:int(-len(data_set)*0.20)]

train_labels = np.asarray(train_labels).astype('float32').reshape((-1,1))
test_labels = np.asarray(test_labels).astype('float32').reshape((-1,1))




print(train_data.shape, train_labels.shape)


 (499, 25) (499, 1)
    



train_data = tf.random.shuffle(
    train_data, seed=None, name=None
)

data = tf.linalg.normalize(
    train_data, ord='euclidean', axis=None, name=None
)

train_dataset = tf.data.Dataset.from_tensor_slices((data[0], train_labels))

test_data = tf.linalg.normalize(
    test_data, ord='euclidean', axis=None, name=None
)

test_dataset = tf.data.Dataset.from_tensor_slices((test_data[0], test_labels))




def get_compiled_model():
    model = tf.keras.Sequential([
        tf.keras.layers.Dense(25, activation='relu'),
        tf.keras.layers.Dense(10, activation='relu'),
        tf.keras.layers.Dense(1)
    ])
    
    model.compile(optimizer='adam',
                 loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
                 metrics=['accuracy'])
    return model 




model.summary()

Model: "sequential_11"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_35 (Dense)             (25, 25)                  50        
_________________________________________________________________
dense_36 (Dense)             (25, 10)                  260       
_________________________________________________________________
dense_37 (Dense)             (25, 1)                   11        
=================================================================
Total params: 321
Trainable params: 321
Non-trainable params: 0
_________________________________________________________________


model = get_compiled_model()
model.fit(train_dataset, epochs=15)


 ValueError: logits and labels must have the same shape ((25, 1) vs (1, 1))

感谢您的帮助

【问题讨论】:

【参考方案1】:

问题在于您的输入和标签没有批次维度。

一个简单的解决方法是在调用 model.fit 之前添加行

train_dataset = train_dataset.batch(1)
test_dataset = test_dataset.batch(1)

模型希望接收形状为(None, 25) 的数据和形状为(None, 1) 的标签,但它接收的是形状为(25,) 的数据和形状为(1,) 的标签。 计算损失时,Keras 将输出形状 (25, 1) 中的 25 解释为批量大小,类似地,标签形状 (1, 1) 中的第一个 1 解释为不同的批量大小,因此会出现此错误。

没有批量大小,模型的所有计算都是错误的,实际上输出形状不是预期的。它们应该是(25,)(10,)(1,),不考虑批次维度。

【讨论】:

感谢帮助它解决了这个问题,但是现在准确性和损失函数没有提高。纪元 1/15 499/499 [==============================] - 2s 3ms/步 - 损失:0.6938 - 准确度: 0.4970 纪元 2/15 499/499 [==============================] - 1s 2ms/步 - 损失:0.6936 - 精度:0.4970 Epoch 3/15 499/499 [==============================] - 1s 2ms/步 - 损失: 0.6935 - 准确度: 0.4970 Epoch 4/15 499/499 [==============================] - 1s 1ms/step - 损失:0.6935 - 准确度:0.4970 Epoch 5/15 有什么想法吗? 这是一个完全不同的问题,错误可以隐藏在代码的每个部分。我可以向您指出这个非常有用的神经网络调试指南,作者是特斯拉的人工智能总监 Andrej Karpathy karpathy.github.io/2019/04/25/recipe

以上是关于TensorFlow ValueError:logits 和标签必须具有相同的形状 ((25, 1) vs (1, 1))的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow:ValueError:形状必须排名2但排名3

TensorFlow 中的 ValueError

Tensorflow:ValueError:预期的非整数,得到<dtype:'int32'>

TensorFlow 自定义损失 ValueError:“没有为任何变量提供渐变:[....'Layers'....]”

如何修复 tensorflow 中的“ValueError:空训练数据”错误

构建神经网络 [TensorFlow 2.0] 模型子类化 - ValueError/TypeError