Keras model.predict дает другую форму из массива обучающих меток - PullRequest
1 голос
/ 14 июля 2020

Я использую следующий код, чтобы попытаться изучить тензорный поток. Я четко указал формы массивов X и y для обучения и проверки.

import numpy as np
import tensorflow as tf

f = lambda x: 2*x
Xtrain = np.random.rand(400,1)
ytrain = f(Xtrain)
Xval = np.random.rand(200,1)
yval = f(Xval)

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(10, activation='relu'),
    tf.keras.layers.Dense(10, activation='relu'),
    tf.keras.layers.Dense(10, activation='relu'),
    tf.keras.layers.Dense(10, activation='relu')
])

model.compile(optimizer='adam',
              loss=tf.keras.losses.MeanSquaredError()
             )

model.fit(Xtrain, ytrain, epochs=50, verbose=0)

Когда я запускаю yval.shape, model.predict(Xval).shape, я получаю результат ((200, 1), (200, 10)). Я не могу понять, откуда берутся эти дополнительные 9 измерений. Даже прогноз Xval должен иметь форму (200, 1).

1 Ответ

2 голосов
/ 17 июля 2020

Требуется небольшая корректировка в последнем Dense Layer вашего Network.

Поскольку вы хотите предсказать Numeric Value, а проблема - Regression, Last Dense Слой должен иметь только 1 Neuron/Unit, а Activation Function в Last Dense Layer должен быть linear.

Итак, замена кода

tf.keras.layers.Dense(10, activation='relu')

на

tf.keras.layers.Dense(1, activation='linear')

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

Полный рабочий код, чей model.predict(Xval).shape будет (200,1), как показано ниже:

import numpy as np
import tensorflow as tf

f = lambda x: 2*x
Xtrain = np.random.rand(400,1)
ytrain = f(Xtrain)
Xval = np.random.rand(200,1)
yval = f(Xval)

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(10, activation='relu'),
    tf.keras.layers.Dense(10, activation='relu'),
    tf.keras.layers.Dense(10, activation='relu'),
    tf.keras.layers.Dense(1, activation='linear')
])

model.compile(optimizer='adam',
              loss=tf.keras.losses.MeanSquaredError()
             )

model.fit(Xtrain, ytrain, epochs=50, verbose=0)

Мы можем иметь несколько Units/Neurons (равное количеству classes) в Last Dense Layer, если проблема Classification и каждый выход представляет Probability, соответствующий каждому Class.

...