我想编写一个使用Keras进行识别的NN程序。
我已使用2组数据进行训练:
toyX = [1, 2, 3, 4, 5, 6, 7, 8]
toyX2 = [18, 17, 16, 15, 14, 13, 12, 11].
[用toyX
然后用toyX2
训练后,model.predict(toyX)
的输出是[[0.56053144 1.0758346 1.7890009 ]]
。但是,它应该是[6, 11, 14]
。
我应该添加更多图层还是更改参数以改善预测?我应该更改哪些参数?
请帮助我解决此问题。
from keras.models import Sequential
from keras.optimizers import Adam
from keras.layers import Conv1D, MaxPooling1D
from keras.layers import Dense, Flatten
from keras.layers import Dropout
import numpy as np
model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(8, 1)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
#model.add(Dense(3, activation='softmax'))
model.add(Dense(3))
#model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
print(model.summary())
toyX = np.array([1, 2, 3, 4, 5, 6, 7, 8]).reshape(1, 8, 1)
toyX2 = np.array([18, 17, 16, 15, 14, 13, 12, 11]).reshape(1, 8, 1)
#print (toyX.shape)
toyY = np.array([6, 11, 14]).reshape(1, 3)
#print (toyY.shape)
toyY2 = np.array([1, 2, 3]).reshape(1, 3) # if flatten is active
model.fit(toyX, toyY, epochs = 1000, verbose = 0)
model.fit(toyX2, toyY2, epochs = 1000, verbose = 0)
print (model.predict(toyX))
这种现象称为神经网络的灾难性遗忘。
您可以阅读以下文章:https://arxiv.org/pdf/1708.02072.pdf
您的toyX
和toyX2
具有完全不同的分布。当您用ToyX2重新训练模型1000个时间段时,您的模型完全忘记了从toyX
到toyY
的映射。
如果您想确保先前训练的知识能够保留下来,或者只是将两者结合再训练,就应该只以很少的学习率训练很少的时期。