Ошибка значения TensorFlow: логиты и метки должны иметь одинаковую форму ((25, 1) против (1, 1))

#python #pandas #numpy #tensorflow #keras

Вопрос:

Я строил модель классификации с 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 выходную форму (25, 1) как размер партии, а первую 1 в форме метки (1, 1) -как другой размер партии, поэтому она выдает эту ошибку.

Все вычисления модели неверны без размера пакета, на самом деле выходные формы не являются ожидаемыми. Они должны быть (25,) , (10,) и (1,) без учета измерения пакета.

Комментарии:

1. Спасибо за помощь, она исправила эту проблему, однако теперь функция точности и потерь не улучшается. Эпоха 1/15 499/499 [==============================] — 2 с 3 мс/шаг — потеря: 0,6938 — точность: 0,4970 Эпоха 2/15 499/499 [==============================] — 1 с 2 мс/шаг — потеря: 0,6936 — точность: 0,4970 Эпоха 3/15 499/499 [==============================] — 1 с 2 мс/шаг — потеря: 0,6935 — точность: 0,4970 Эпоха 4/15 499/499 [==============================] — 1 с 1 мс/шаг — потеря: 0,6935 — точность: 0,4970 Эпоха 5/15 Есть идеи?

2. Это совершенно другая проблема, и ошибка может быть скрыта в каждой части кода. Я могу просто указать вам на это очень полезное руководство по отладке нейронных сетей, написанное Андреем Карпати, директором по ИИ Tesla karpathy.github.io/2019/04/25/recipe