Почему Keras вызывает ошибку формы в последнем плотном слое?

Я построил простую NN, чтобы отличать целые числа от десятичных, мои входные данные представляют собой одномерный массив, а окончательный результат должен быть вероятностью целого числа. Сначала мне это удалось, когда последний слой (имя: вывод) имел 1 единицу. Но это вызвало ValueError, когда я изменил последний плотный слой на две единицы, потому что я хотел вывести обе вероятности числа x как целое и десятичное число.

from tensorflow.python.keras.models import Sequential,load_model
from tensorflow.python.keras.utils import np_utils
from tensorflow.python.keras.layers import Dense
from tensorflow.python.keras.layers import Activation
from tensorflow import keras
import numpy as np
import tensorflow as tf
from sklearn.utils import shuffle
def train():
    t=[]
    a=[]
    for i in range (0,8000):    #generate some training data
        ran=np.random.randint(2)
        if(ran==0):
            y=np.random.uniform(-100,100)
            t.append(y)
            a.append(0)
        else:
            y=np.random.randint(1000)
            t.append(y)
            a.append(1)
    t=np.asarray(t)
    a=np.asarray(a)
    pt=t.reshape(-1,1)  #reshape for fit()
    pa=a.reshape(-1,1)
    pt,pa=shuffle(pt,pa)
   

    model=Sequential()
    dense=Dense(units=32,input_shape=(1,),activation='relu')
    dense2=Dense(units=64,activation='relu')
    output=Dense(units=2,activation='softmax')   # HERE is the problem
    
    model.add(dense)
    model.add(dense2)
    model.add(output)
    model.summary()
    
    model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
    model.fit(pt,pa,validation_split=0.02,batch_size=10, epochs=50, verbose=2)
    model.save('integer_predictor.h5')

train()

ValueError: Ошибка при проверке цели: ожидалось, что плотности_2 будут иметь форму (2,), но получили массив с формой (1,)


person Gam    schedule 29.07.2020    source источник
comment
Можете ли вы также добавить операторы импорта для библиотек, которые вы использовали?   -  person Akshay Sehgal    schedule 29.07.2020
comment
Спасибо за напоминание!   -  person Gam    schedule 29.07.2020
comment
Проверьте мой ответ. это решает вашу ошибку?   -  person Akshay Sehgal    schedule 29.07.2020


Ответы (1)


Это должно решить вашу проблему

model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])

Поскольку у вас есть 2 выхода, вы не можете использовать двоичную cross_entropy, поскольку это проблема классификации 2 классов. Кроме того, когда ваши входные данные не закодированы в горячем режиме, вам понадобится sparse_categorical_crossentropy. Если у вас есть одна горячая функция, то categorical_crossentropy будет работать с выходами › 1.

Прочитайте это, чтобы получить больше информации об этом.

person Akshay Sehgal    schedule 29.07.2020
comment
Это работает, спасибо. Но хотя у меня есть два выхода, это все еще классификация 2? (не уверен в этом), почему бинарная cross_entropy не работает? - person Gam; 29.07.2020
comment
да, это потому, что вы сейчас пытаетесь предсказать вероятность для 2 разных классов. В зависимости от активации (которой в данном случае является softmax) он будет возвращать 2 значения 0-1 для каждого из 2 выходов. Если вы выполняете бинарную классификацию, то вы просто используете один выход 0-1, который говорит вам, нажал ли клиент на добавление (1) или нет (0). С двумя выходами это похоже на то, нажмет ли клиент на 1-е добавление или на второе - person Akshay Sehgal; 29.07.2020