我正在尝试设计一个神经网络,用于从包含高斯噪声的数据集数组中预测平滑基础函数的数组。我已经创建了包含10000个数组的训练和数据集。现在我试图预测实际函数的数组值,但似乎失败了,准确率也不高。有人可以指导我如何进一步改进我的模型以获得更好的准确率并能够预测良好的数据吗?我的代码如下:
用于生成测试和训练数据的代码:
noisy_data = []pure_data =[]time = np.arange(1,100)for i in tqdm(range(10000)): array = [] noise = np.random.normal(0,1/10,99) for j in range(1,100): array.append( np.log(j)) array = np.array(array) pure_data.append(array) noisy_data.append(array+noise) pure_data=np.array(pure_data)noisy_data=np.array(noisy_data) print(noisy_data.shape)print(pure_data.shape)training_size=6000x_train = noisy_data[:training_size]y_train = pure_data[:training_size]x_test = noisy_data[training_size:]y_test = pure_data[training_size:]print(x_train.shape)
我的模型:
model = tf.keras.models.Sequential()model.add(tf.keras.layers.Flatten(input_shape=(99,)))model.add(tf.keras.layers.Dense(768, activation=tf.nn.relu))model.add(tf.keras.layers.Dense(768, activation=tf.nn.relu))model.add(tf.keras.layers.Dense(99, activation=tf.nn.softmax))model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])model.fit(x_train, y_train, epochs = 20)
低准确率的结果:
Epoch 1/20125/125 [==============================] - 2s 16ms/step - loss: 947533.1875 - accuracy: 0.0000e+00Epoch 2/20125/125 [==============================] - 2s 15ms/step - loss: 9756863.0000 - accuracy: 0.0000e+00Epoch 3/20125/125 [==============================] - 2s 16ms/step - loss: 30837548.0000 - accuracy: 0.0000e+00Epoch 4/20125/125 [==============================] - 2s 15ms/step - loss: 63707028.0000 - accuracy: 0.0000e+00Epoch 5/20125/125 [==============================] - 2s 16ms/step - loss: 107545128.0000 - accuracy: 0.0000e+00Epoch 6/20125/125 [==============================] - 1s 12ms/step - loss: 161612192.0000 - accuracy: 0.0000e+00Epoch 7/20125/125 [==============================] - 1s 12ms/step - loss: 225245360.0000 - accuracy: 0.0000e+00Epoch 8/20125/125 [==============================] - 1s 12ms/step - loss: 297850816.0000 - accuracy: 0.0000e+00Epoch 9/20125/125 [==============================] - 1s 12ms/step - loss: 378894176.0000 - accuracy: 0.0000e+00Epoch 10/20125/125 [==============================] - 1s 12ms/step - loss: 467893216.0000 - accuracy: 0.0000e+00Epoch 11/20125/125 [==============================] - 2s 17ms/step - loss: 564412672.0000 - accuracy: 0.0000e+00Epoch 12/20125/125 [==============================] - 2s 15ms/step - loss: 668056384.0000 - accuracy: 0.0000e+00Epoch 13/20125/125 [==============================] - 2s 13ms/step - loss: 778468480.0000 - accuracy: 0.0000e+00Epoch 14/20125/125 [==============================] - 2s 18ms/step - loss: 895323840.0000 - accuracy: 0.0000e+00Epoch 15/20125/125 [==============================] - 2s 13ms/step - loss: 1018332672.0000 - accuracy: 0.0000e+00Epoch 16/20125/125 [==============================] - 1s 11ms/step - loss: 1147227136.0000 - accuracy: 0.0000e+00Epoch 17/20125/125 [==============================] - 2s 12ms/step - loss: 1281768448.0000 - accuracy: 0.0000e+00Epoch 18/20125/125 [==============================] - 2s 14ms/step - loss: 1421732608.0000 - accuracy: 0.0000e+00Epoch 19/20125/125 [==============================] - 1s 11ms/step - loss: 1566927744.0000 - accuracy: 0.0000e+00Epoch 20/20125/125 [==============================] - 1s 10ms/step - loss: 1717172480.0000 - accuracy: 0.0000e+00
我使用的预测代码:
model.predict([noisy_data[0]])
这会抛出以下错误:
WARNING:tensorflow:Model was constructed with shape (None, 99) for input Tensor("flatten_5_input:0", shape=(None, 99), dtype=float32), but it was called on an input with incompatible shape (None, 1).ValueError: Input 0 of layer dense_15 is incompatible with the layer: expected axis -1 of input shape to have value 99 but received input with shape [None, 1]
回答:
查看你的y
数据:
y_train[0]array([0. , 0.69314718, 1.09861229, 1.38629436, 1.60943791, 1.79175947, 1.94591015, 2.07944154, 2.19722458, 2.30258509, 2.39789527, 2.48490665, 2.56494936, 2.63905733, 2.7080502 , 2.77258872, 2.83321334, 2.89037176, 2.94443898, 2.99573227, 3.04452244, 3.09104245, 3.13549422, 3.17805383, 3.21887582, 3.25809654, 3.29583687, 3.33220451, 3.36729583, 3.40119738, 3.4339872 , 3.4657359 , 3.49650756, 3.52636052, 3.55534806, 3.58351894, 3.61091791, 3.63758616, 3.66356165, 3.68887945, 3.71357207, 3.73766962, 3.76120012, 3.78418963, 3.80666249, 3.8286414 , 3.8501476 , 3.87120101, 3.8918203 , 3.91202301, 3.93182563, 3.95124372, 3.97029191, 3.98898405, 4.00733319, 4.02535169, 4.04305127, 4.06044301, 4.07753744, 4.09434456, 4.11087386, 4.12713439, 4.14313473, 4.15888308, 4.17438727, 4.18965474, 4.20469262, 4.21950771, 4.2341065 , 4.24849524, 4.26267988, 4.27666612, 4.29045944, 4.30406509, 4.31748811, 4.33073334, 4.34380542, 4.35670883, 4.36944785, 4.38202663, 4.39444915, 4.40671925, 4.41884061, 4.4308168 , 4.44265126, 4.4543473 , 4.46590812, 4.47733681, 4.48863637, 4.49980967, 4.51085951, 4.52178858, 4.53259949, 4.54329478, 4.55387689, 4.56434819, 4.57471098, 4.58496748, 4.59511985])
看起来你处在一个回归设置中,而不是分类问题。
因此,你需要将模型的最后一层改为
model.add(tf.keras.layers.Dense(99)) # 默认线性激活
并编译为
model.compile(optimizer = 'adam', loss = 'mse')
(注意,在回归问题中准确率是没有意义的)。
通过这些更改,现在为5个周期拟合你的模型会得到合理的损失值:
model.fit(x_train, y_train, epochs = 5)Epoch 1/5188/188 [==============================] - 0s 2ms/step - loss: 0.2120Epoch 2/5188/188 [==============================] - 0s 2ms/step - loss: 4.0999e-04Epoch 3/5188/188 [==============================] - 0s 2ms/step - loss: 4.1783e-04Epoch 4/5188/188 [==============================] - 0s 2ms/step - loss: 4.2255e-04Epoch 5/5188/188 [==============================] - 0s 2ms/step - loss: 4.9760e-04
显然,你不需要20个周期。
为了预测单个值,你需要按以下方式重塑它们:
model.predict(np.array(noisy_data[0]).reshape(1,-1))# 结果:array([[-0.02887887, 0.67635924, 1.1042297 , 1.4030693 , 1.5970025 , 1.8026372 , 1.9588575 , 2.0648997 , 2.202754 , 2.3088624 , 2.400107 , 2.4935524 , 2.560785 , 2.658005 , 2.714249 , 2.7735658 , 2.8429594 , 2.8860366 , 2.9135942 , 2.991392 , 3.0119512 , 3.1059306 , 3.1467025 , 3.1484323 , 3.2273414 , 3.2722526 , 3.2814353 , 3.3600745 , 3.3591018 , 3.3908122 , 3.4431438 , 3.4897916 , 3.5229044 , 3.542718 , 3.5617661 , 3.5660467 , 3.622283 , 3.614976 , 3.6565022 , 3.6963918 , 3.7061958 , 3.7615037 , 3.7564514 , 3.7682133 , 3.8250954 , 3.831929 , 3.86098 , 3.8959084 , 3.8967183 , 3.9016035 , 3.9568343 , 3.9597993 , 4.0028276 , 3.9931173 , 3.9887471 , 4.0221996 , 4.021959 , 4.048805 , 4.069759 , 4.104507 , 4.1473804 , 4.167117 , 4.1388593 , 4.148655 , 4.175832 , 4.1865892 , 4.2039223 , 4.2558513 , 4.237947 , 4.257041 , 4.2507076 , 4.2826586 , 4.2916007 , 4.2920256 , 4.304987 , 4.3153067 , 4.3575797 , 4.347109 , 4.3662906 , 4.396843 , 4.36556 , 4.3965526 , 4.421436 , 4.433974 , 4.424191 , 4.4379086 , 4.442377 , 4.4937015 , 4.468969 , 4.506153 , 4.515915 , 4.524729 , 4.53225 , 4.5434146 , 4.561402 , 4.582401 , 4.5856013 , 4.544302 , 4.6128435 ]], dtype=float32)