Почему происходит сбой Keras, когда я передаю 1D список в качестве входных данных? - PullRequest
0 голосов
/ 05 января 2019

Я только начинаю работать с Keras, поэтому я подумал, что постараюсь сделать самые простые проблемы регрессии, которые я могу себе представить, как своего рода Hello World.

Я пытаюсь обучить модель, которая выводит двойные входные данные. Я предполагаю, что сеть с двумя узлами (1 вход 1 выход) без функции активации должна сделать свое дело. Вес должен просто сходиться к 2.

Это мой код:

layers = keras.layers

# Feed forward structure
model = keras.Sequential()

model.add(layers.Dense(1))

model.add(layers.Dense(1))

model.compile(optimizer=tf.train.AdamOptimizer(0.01),
              loss='mae',
              metrics=['mae'])


train_data = np.asarray([x for x in range(100)])
train_labels = np.asarray([x * 2 for x in train_data])


model.fit(train_data, train_labels, epochs=50, batch_size=32)

Однако, когда я передаю ему одномерный массив, он вылетает со следующей ошибкой:

ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`.

Если я затем добавлю лишнюю скобку к train_data, она скомпилируется (не сходясь):

train_data = np.asarray([[x for x in range(100)]])

Epoch 50/50

1/1 [==============================] - 0s 705us/step - loss: 50.0463 - mean_absolute_error: 50.0463

1 Ответ

0 голосов
/ 05 января 2019

Если вы даете модели одно число, каждая входная выборка должна иметь форму (1,). Следовательно, все 100 входных выборок будут иметь форму (100,1). Поэтому вам необходимо привести формы входных данных и меток в соответствие с тем, что ожидается:

train_data = train_data.reshape(100,1)  # 100 samples of shape 1

# you may not need to do the following necessarily
train_labels = train_labels.reshape(100,1)  # 100 labels of shape 1

# alternative way using np.expand_dims
train_data = np.expand_dims(train_data, axis=-1)

Примечания:

  1. Ваша модель имеет два слоя Dense. С предоставленным вами описанием, я думаю, вы просто хотите модель с одним плотным слоем, который имеет одну единицу (то есть удалите один из плотных слоев).

  2. Когда вы помещаете свои данные в другой список, например:

    train_data = np.asarray([[x for x in range(100)]])
    

    это будет двумерный массив формы (1,100), что означает один образец формы (100,), что не то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...