python - 用于预测粒子角度变化的 Keras 神经网络无法正确预测
问题描述
我已经建立了一个 keras 回归模型来预测单个粒子在提供有关该粒子的数据时的角度变化。为了获取数据,我创建了一个程序来模拟 n 个粒子之间的布朗运动。除了随机角度噪声外,根据粒子之间的距离,它们会引起彼此角度的变化。
我的代码如何工作并不太重要,但本质上它会输出一个数组,其中包含所有粒子相对于单个粒子的 x、y 坐标、所有粒子的 theta 值以及所有粒子与单个粒子之间的距离。在每个时间步都可以找到所有这些参数。我用来训练网络的每个“图像”都是某个时间点的所有这些参数。所以总的来说,输入变量是x,y,angle,distance,输出变量是目标粒子的theta变化
对于我的神经网络,我首先将所有数据标准化为介于 -1 和 1 之间,然后对其进行整形以输入 NN:
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
## NORMALIZE IMAGES ##########################################################
# all images and labels imported, so obviously wont run without data. This is
# designed for running data with m iterations, n particles, 4 parameters
# (size of test data array is [m,n,4]).
L = 5
# length of 'box' that houses particles
n = 10
# number of particles
train_images[:,:,0:2] = train_images[:,:,0:2]/L
# normalise [x,y] from -L:L to -1:1.
train_images[:,:,2:3] = train_images[:,:,2:3]/(2*np.pi)
# normalise theta value from -2pi:2pi to -1:1
train_images[:,:,3:4] = (train_images[:,:,3:4]/(L*np.sqrt(2))*2)-1
# normalise distance value from 0:sqrt(2)L to -1:1
test_images[:,:,0:2] = test_images[:,:,0:2]/L
test_images[:,:,2:3] = test_images[:,:,2:3]/(2*np.pi)
test_images[:,:,3:4] = (test_images[:,:,3:4]/(L*np.sqrt(2))*2)-1
## FLATTEN IMAGES ############################################################
train_images = train_images.reshape((-1, 4*(n-1)))
# reshape so each input is a single dimension
# 4*(n-1) due to 4 parameters, adn n-1 particles (since one is redundant info)
test_images = test_images.reshape((-1, 4*(n-1)))
## BUILDING THE MODEL ########################################################
model = Sequential([
Dense(64, activation='tanh', input_shape=(4*(n-1),)),
Dense(16, activation='tanh'),
Dropout(0.25),
Dense(1, activation='tanh'),
])
## COMPILING THE MODEL #######################################################
model.compile(
optimizer='adam',
loss='mean_squared_error',
#metrics=['mean_squared_error'],
)
## TRAINING THE MODEL ########################################################
history = model.fit(
train_images, # training data
train_labels, # training targets
epochs=10,
batch_size=32,
#validation_data=(test_images, test_labels),
shuffle=True,
validation_split=0.2,
)
我为不同的层使用了多种激活类型(relu、sigmoid、tanh ...),但似乎没有一个能给我正确的结果。我的数据的真实值(粒子角度的变化)是从大约 0.02 到 -0.02 的值,但我得到的值要小得多,并且往往主要是一个符号(正/负)。
我目前正在使用损失函数“平均绝对误差”,因为我希望最小化真实值和预测值之间的差异。我注意到这样做时,仅在一个时期之后,损失已经非常小:
Epoch 1/10
12495/12495 [==============================] - 13s 1ms/step - loss: 0.0010 - val_loss: 3.3794e-05
Epoch 2/10
12495/12495 [==============================] - 13s 1ms/step - loss: 3.4491e-05 - val_loss: 3.3769e-05
Epoch 3/10
12495/12495 [==============================] - 13s 1ms/step - loss: 3.4391e-05 - val_loss: 3.3883e-05
Epoch 4/10
12495/12495 [==============================] - 13s 1ms/step - loss: 3.4251e-05 - val_loss: 3.4755e-05
Epoch 5/10
12495/12495 [==============================] - 13s 1ms/step - loss: 3.4183e-05 - val_loss: 3.4273e-05
Epoch 6/10
12495/12495 [==============================] - 13s 1ms/step - loss: 3.4175e-05 - val_loss: 3.3770e-05
Epoch 7/10
12495/12495 [==============================] - 13s 1ms/step - loss: 3.4160e-05 - val_loss: 3.3646e-05
Epoch 8/10
12495/12495 [==============================] - 13s 1ms/step - loss: 3.4131e-05 - val_loss: 3.3629e-05
Epoch 9/10
12495/12495 [==============================] - 14s 1ms/step - loss: 3.4145e-05 - val_loss: 3.3581e-05
Epoch 10/10
12495/12495 [==============================] - 13s 1ms/step - loss: 3.4148e-05 - val_loss: 3.4647e-05
这是我从中得到的结果示例:
Prediction: 4.8542774e-05
Actual: 0.006994473448353978
为了得到这些结果,我做了什么明显的错误吗?抱歉,如果我没有提供足够的信息。
解决方案
It is a regression problem,last layer does not have activation. Decrease the number of unit frim 32 to 16 in 1 st layer as this will prevent overfiting
推荐阅读
- python - 如何提取数组中映射的值列表?
- javascript - 有没有办法简化这个 JavaScript 代码?
- wordpress - 同时注册两个不同的wordpress
- php - PHP APCU 操作是原子的吗
- c - C 套接字发送和接收
- docusignapi - Docusign PHP 添加多个签名选项卡
- javascript - React Native 在单独的方法文件中更改 Redux 状态
- sql - 计算最大并发用户会话数
- .net - 我是否定义了自己的端点来支持 CORS OPTIONS 请求
- arrays - 我怎样才能打开一个 GenericArray
成相同长度的数组?