Как определить форму ввода в кератах? - PullRequest
1 голос
/ 12 июня 2019

Мне трудно найти, где моя ошибка при построении моделей глубокого обучения, но у меня обычно возникают проблемы при настройке формы ввода входного слоя.

Это моя модель:

model = Sequential([
Dense(32, activation='relu', input_shape=(1461, 75)),
Dense(32, activation='relu'),
Dense(ytrain.size),])

Возвращается следующая ошибка:

 ValueError: Error when checking input: expected dense_1_input to have 3

 dimensions, but got array with shape (1461, 75)

Массив - это тренировочный набор из конкуренции цен на жилье, и мой набор данных содержит 75 столбцов и 1461 ряд. Мой массив двухмерный, так почему же ожидаются три измерения? Я попытался добавить избыточное третье измерение 1 или сгладить массив перед первым плотным слоем, но ошибка просто становится:

ValueError: Input 0 is incompatible with layer flatten_1: expected 

min_ndim=3, found ndim=2

Как определить, какой должен быть входной размер и почему ожидаемые размеры кажутся такими произвольными?

Для справки, я прикрепил остальную часть своего кода:

xtrain = pd.read_csv("pricetrain.csv")
test = pd.read_csv("pricetest.csv")
xtrain.fillna(xtrain.mean(), inplace=True)
xtrain.drop(["Alley"], axis=1, inplace=True)
xtrain.drop(["PoolQC"], axis=1, inplace=True)
xtrain.drop(["Fence"], axis=1, inplace=True)
xtrain.drop(["MiscFeature"], axis=1, inplace=True)
xtrain.drop(["PoolArea"], axis=1, inplace=True)
columns = list(xtrain)
for i in columns:
    if xtrain[i].dtypes == 'object':
        xtrain[i] = pd.Categorical(pd.factorize(xtrain[i])[0])
from sklearn import preprocessing

le = preprocessing.LabelEncoder()
for i in columns:
    if xtrain[i].dtypes == 'object':
        xtrain[i] = le.fit_transform(xtrain[i])
ytrain = xtrain["SalePrice"]
xtrain.drop(["SalePrice"], axis=1, inplace=True)
ytrain = ytrain.values
xtrain = xtrain.values
ytrain.astype("float32")

size = xtrain.size
print(ytrain)
model = Sequential(
    [Flatten(),
     Dense(32, activation='relu', input_shape=(109575,)),
     Dense(32, activation='relu'),
     Dense(ytrain.size),
     ])
model.compile(loss='mse', optimizer='adam')
model.fit(xtrain, ytrain, epochs=10, verbose=1)

Любой совет был бы невероятно полезен!

Спасибо.

1 Ответ

1 голос
/ 12 июня 2019

0-е измерение (образец-ось) определяется batch_size тренировки.Вы опускаете его при определении формы ввода.Это имеет смысл, поскольку в противном случае ваша модель будет зависеть от количества выборок в наборе данных.

То же самое касается вывода.Кажется, вы прогнозируете только одно значение для каждого примера ("SalePrice").Таким образом, выходной слой имеет форму 1.

model = Sequential([
    Dense(32, activation='relu', input_shape=(75, )),
    Dense(32, activation='relu'),
    Dense(1),
])
...