Keras model.predict从训练标签数组给出不同的形状

时间:2020-07-14 11:48:20

标签: tensorflow

我正在使用以下代码尝试并学习张量流。我已经明确指定了训练和验证Xy数组的形状。

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 个答案:

答案 0 :(得分:2)

Dense Layer的最后Network中需要进行一些小的修正。

由于您要预测Numeric Value,并且由于问题是Regression,因此最后一个致密层应该只有 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