我一直在尝试创建一个Keras模型来寻找我的数值数据集中的模式。我多次更改了损失函数和优化器,但损失没有变化。我还移除和添加了层,并更改了层中的神经元数量,但损失依然没有变化。
模型是这样的:
from keras.models import Sequentialfrom keras.layers import Denseimport numpynumpy.random.seed(7)dataset = numpy.loadtxt("data.csv", delimiter=",")X = dataset[:, :-1]Y = dataset[:, -1]print(X)# create modelmodel = Sequential()model.add(Dense(18, input_dim=18, activation='tanh'))model.add(Dense(36, activation='relu'))model.add(Dense(72, activation='relu'))model.add(Dense(72, activation='relu'))model.add(Dense(32, activation='relu'))model.add(Dense(16, activation='relu'))model.add(Dense(1, activation='softmax'))# Compile modelmodel.compile(loss='mean_squared_error', optimizer='adam')# Fit the modelmodel.fit(X, Y, epochs=100, batch_size=35)# save modelmodel.save('tried.h5')
我还更改了epochs和batch size,但对损失没有影响。
以下是日志:
Using TensorFlow backend.Printing X Data [[1.19539070e+01 1.72686310e+01 2.24426384e+01 ... 1.73570000e-04 4.35710000e-04 9.55710000e-04] [1.20239086e+01 1.45762539e+01 2.13278122e+01 ... 1.78570000e-04 4.06430000e-04 9.17860000e-04] [2.30696812e+01 1.82697601e+01 2.13278122e+01 ... 1.15000000e-04 3.75710000e-04 9.17860000e-04] ... [2.83583431e+01 2.38079319e+01 2.81154442e+01 ... 1.13570000e-04 3.20710000e-04 6.65000000e-04] [4.34185066e+01 2.17990398e+01 2.81154442e+01 ... 1.12860000e-04 3.37140000e-04 6.65000000e-04] [5.71823807e+01 2.19225960e+01 3.02071724e+01 ... 6.42900000e-05 3.56430000e-04 6.45000000e-04]]Epoch 1/100342420/342420 [==============================] - 15s 45us/step - loss: 0.4945Epoch 2/100342420/342420 [==============================] - 15s 44us/step - loss: 0.4945Epoch 3/100342420/342420 [==============================] - 15s 43us/step - loss: 0.4945Epoch 4/100342420/342420 [==============================] - 15s 44us/step - loss: 0.4945Epoch 5/100342420/342420 [==============================] - 15s 44us/step - loss: 0.4945Epoch 6/100342420/342420 [==============================] - 15s 44us/step - loss: 0.4945Epoch 7/100342420/342420 [==============================] - 14s 42us/step - loss: 0.4945Epoch 8/100234500/342420 [===================>..........] - ETA: 4s - loss: 0.4946
数据确实存在一定的模式,模型应该能够捕捉到这些模式。
谁能推荐一些更改,以便模型能够真正适应数据,或者指出任何错误?
谢谢!
回答:
单类分类器
你编写的代码最后是一个仅针对单类的分类器,即模型的最后一层
model.add(Dense(1, activation='softmax'))
只有一个神经元,并且使用了softmax函数,这将确保该层所有神经元的总和等于1;通常用于分类器,以便将输出解释为各类的概率。
因此,无论权重如何,这个网络对所有输入的输出始终为1.0。
也许你应该考虑使用sigmoid、relu甚至是线性激活函数,这取决于你的Y值的数值分布。