Ошибка при проверке ввода: ожидалось, что flatten_input будет иметь 4 измерения, но получил массив с формой (404, 13) - PullRequest
0 голосов
/ 04 августа 2020
import tensorflow as tf

from tensorflow import keras

import numpy as np

import matplotlib.pyplot as plt

data = keras.datasets.boston_housing

(x_train , y_train) , (x_test , y_test) = data.load_data()

model = keras.Sequential([

    keras.layers.Flatten(input_shape=(28 , 28 )),

    keras.layers.Dense(128 , activation="relu"),

    keras.layers.Dense(10 , activation="softmax")
])

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

model.fit(x_train , y_train ,epochs=5 )

test_loss , test_acc = model.evaluate(x_test , y_test)

print("tested acc: ", test_acc)

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Flatten используется для создания 2-мерных данных, таких как изображение, поэтому в основном вы конвертируете 2-й список в 1-й список, поэтому вы должны изменить Flatten на Input.

Вторая ошибка - объявление формы ввода .

input_shape=(28 , 28 )

Вы заявили 28x28, но я предполагаю, что вы хотели иметь 28 образцов с 28 функциями. И это постоянно. Чтобы сделать это правильно, вы определяете форму ввода как гибкую, она будет соответствовать любому количеству образцов в обучении и прогнозировании. Все, что вам нужно сделать, я передаю, сколько функций имеет один образец

input_shape=(28, )

Вот как он должен выглядеть

model = keras.Sequential([

    keras.layers.Input(input_shape=(28, )),

    keras.layers.Dense(128 , activation="relu"),

    keras.layers.Dense(10 , activation="softmax")
])
0 голосов
/ 04 августа 2020

Слой Flatten предназначен для преобразования тензоров 3D + в 2D. Я предполагаю, что эта модель была разработана для двоичного MNIST, который имеет другую форму ввода, и вы пытались использовать ее в другом наборе данных. В наборе данных Boston Housing Dataset уже есть 2D-ввод, поэтому здесь нет смысла. Вы можете выполнить этот запуск, изменив форму ввода, но это не имеет смысла:

keras.layers.Flatten(input_shape=(13,)),

Все, что вам нужно сделать, это удалить его, и он будет работать нормально. Затем вам придется изменить функцию потерь, метрики и окончательную функцию активации, потому что вы имеете дело с проблемой регрессии. Окончательный исправленный код:

import tensorflow as tf

from tensorflow import keras

import numpy as np

import matplotlib.pyplot as plt

data = keras.datasets.boston_housing

(x_train , y_train) , (x_test , y_test) = data.load_data()

model = keras.Sequential([

    keras.layers.Dense(128 , activation="relu"),

    keras.layers.Dense(1)
])

model.compile(optimizer="adam" , loss="mae")

model.fit(x_train , y_train ,epochs=5 )

test_loss = model.evaluate(x_test , y_test)

print("test loss: ", test_loss)
 32/102 [========>.....................] - ETA: 0s - loss: 5.9563
102/102 [==============================] - 0s 682us/sample - loss: 6.7218

test loss:  6.721758244084377
...