0

我正在尝试创建一个模型来返回五个数字序列的平均值,但是当我尝试运行我的 Vanilla LSTM 模型时会返回巨大的损失和空值(损失:0.4943 - acc:0.0000e+00)。

我不知道问题是在重塑还是在我创建的序列中

def generate_data (n_samples, n_features):
    output = []
    target = []
    for j in range (0, n_features):
        lista = [] 
        for i in range (0, n_samples):
            n = random.uniform(0,1)
            lista.append(n)
        output.append(lista)
        aux = np.average(lista)
        target.append((aux))
    return np.array(output), np.array(target)

重塑部分

X_train = X_train.reshape(X_train.shape[0],  X_train.shape[1],  1)
X_val = X_val.reshape(  X_val.shape[0],  X_val.shape[1],1)

y_train = y_train.reshape(y_train.shape[0],1)
y_val = y_val.reshape( y_val.shape[0],1)

和模型

# define model
vanilla = Sequential()
vanilla.add(LSTM(10, input_shape =(X_train.shape[1:]))) # (5,1)
vanilla.add(Dense(1, activation='softmax'))
# compile the model
vanilla.compile(loss= 'mae' , optimizer= 'adam', metrics = ['acc'])
print(vanilla.summary())
4

1 回答 1

0

问题是您在最后的 Dense 层中使用了 softmax 激活函数,它将所有神经元归一化为 0 和 1 之间。因为输出中只有 1 个神经元,输出将始终为 1,因此您的损失将总是很高。

要解决此问题,您可能应该使用线性激活(不会修改神经元的值),因为您正在执行回归任务。您可以通过更改此行来做到这一点

vanilla.add(Dense(1, activation='softmax'))

对此

vanilla.add(Dense(1, activation='linear'))

或这个

vanilla.add(Dense(1))

因为默认情况下激活是线性的。

于 2021-01-08T01:05:50.773 回答