尝试实现一个非常简单的训练模型,以使用张量流keras预测两个数字的总和。 我尝试过单密层。 我也尝试不更改任何时代。 我也尝试将优化器也更改为线性。 但是没有什么办法可以使我获得最佳的准确性。
下面是到目前为止我尝试过的代码以及得到的输出。
导入
import numpy as np
import tensorflow as tf
from random import randrange
生成培训数据
trainingInput = [[i, i + randrange(5000)] for i in range(1, 5000)]
trainingOutput = [(input [0] + input [1]) for input in trainingInput ]
testInput = [[5, 5], [1, 9], [2, 5], [6, 3], [1, 4]]
testOutput = [10, 10, 7, 9, 5]
构建模型
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(2,)))
model.add(tf.keras.layers.Dense(64, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(64, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(1))
编译模型
model.compile(optimizer='adam', loss=tf.keras.losses.mae, metrics=['mae'])
培训
model.fit(trainData, trainOutput, batch_size=5, epochs=50)
最终评估和预测
test_loss, test_acc = model.evaluate(testData, testOutput)
print("Test Accuracy : ", test_acc)
a = np.array([[3, 3000], [4, 5], [1,10], [2,10],[5,9], [4,10], [1,15]])
print(model.predict(a))
输出
[[2994.769 ]
[ 8.959281]
[ 10.961123]
[ 11.956481]
[ 13.944955]
[ 13.947194]
[ 15.949196]]
有人可以帮助我改善我的训练模型和准确性吗?预先感谢。
答案 0 :(得分:0)
你只需要一个较小的学习率——这样梯度就不会“跳跃”太多——意味着对权重进行更精细的调整。我还添加了一个简单的线性激活和一些反例,使模型更通用:
trainingInput = np.array([[randrange(5000)-2500, randrange(5000)-2500] for i in range(1, 50000)])
trainingOutput = np.array([(input [0] + input [1]) for input in trainingInput ])
inp = Input(shape=(2,), name='inp')
out = Dense(1, activation='linear',name='out')(inp)
model_sum=Model(inp,out)
opt = tf.keras.optimizers.Adam(learning_rate=0.0001)
model_sum.compile(loss='mean_absolute_error', optimizer=opt, metrics=['mae'])
model_sum.fit(trainingInput, trainingOutput, batch_size=100, epochs=50,verbose=2)
a = np.array([[3, 3000], [4, 5], [1,10], [2,10],[5,9], [4,10], [1,15]])
print(model_sum.predict(a))
输出:
Epoch 45/50
- 0s - loss: 0.0166 - mae: 0.0166
Epoch 46/50
- 0s - loss: 0.0184 - mae: 0.0184
Epoch 47/50
- 0s - loss: 0.0164 - mae: 0.0164
Epoch 48/50
- 0s - loss: 0.0151 - mae: 0.0151
Epoch 49/50
- 0s - loss: 0.0161 - mae: 0.0161
Epoch 50/50
- 0s - loss: 0.0161 - mae: 0.0161
[[3002.9626 ]
[ 8.99987 ]
[ 10.999748]
[ 11.999768]
[ 13.999842]
[ 13.999809]
[ 15.999686]]
您还可以使用较低的学习率(10 倍)再次编译模型,并使其越来越准确。不要再次构建模型 - 只是优化器定义、编译和拟合:
opt = tf.keras.optimizers.Adam(learning_rate=0.000001)
model_sum.compile(loss='mean_absolute_error', optimizer=opt, metrics=['mae'])
model_sum.fit(trainingInput, trainingOutput, batch_size=100, epochs=50,verbose=2)
a = np.array([[3, 3000], [4, 5], [1,10], [2,10],[5,9], [4,10], [1,15]])
print(model_sum.predict(a))
Epoch 47/50
- 0s - loss: 9.9272e-11 - mae: 9.9272e-11
Epoch 48/50
- 0s - loss: 1.5182e-10 - mae: 1.5182e-10
Epoch 49/50
- 0s - loss: 1.5532e-10 - mae: 1.5532e-10
Epoch 50/50
- 0s - loss: 4.5265e-10 - mae: 4.5265e-10
[[3003.]
[ 9.]
[ 11.]
[ 12.]
[ 14.]
[ 14.]
[ 16.]]