我已经为此坚持了一个多星期。我正在建立一个应该从Schack-Hartmann传感器估算波前模式的网络。非常具体的一点是,基本上是在254x254图片中看到一堆点,并且必须从中估计以0为中心的64个参数。
我的网络如下:
model = Sequential()
model.add(Conv2D (32,(5, 5),activation="relu",input_shape=[256,256,1]))
model.add(MaxPooling2D(pool_size=(3, 3)))
model.add(Conv2D (32,(5, 5),activation="relu"))
model.add(MaxPooling2D(pool_size=(3, 3)))
model.add(Conv2D (64,(3, 3),activation="relu"))
model.add(Conv2D (64,(3, 3),activation="relu"))
model.add(Conv2D (64,(3, 3),activation="relu"))
model.add(MaxPooling2D(pool_size=(3, 3)))
model.add(Flatten())
model.add(Dense (512, activation="relu" ))
model.add(Dropout(0.02))
model.add(Dense (512, activation="relu" ))
model.add(Dropout(0.02))
model.add(Dense(y_train.shape[1], activation="linear"))
损失函数减少几次迭代,然后停滞,精度约为0.09。 为了解决这个问题,我尝试过更改体系结构,更改损失函数,更改激活函数,以不同方式规范化数据以及更改批处理大小。没有任何帮助。
有人知道我可以尝试什么吗?
答案 0 :(得分:1)
这似乎是一个非常棘手的问题:以带点的图像形式进行一些输入并将其转换为64个参数的向量。 我对网络表现不佳并不感到惊讶。另外,我假设64个参数是-1到1的实数(因为您的陈述“网络...必须从中估计以0为中心的64个参数”)。在这种情况下,这不是分类问题,准确性作为度量标准没有意义。尝试改为监视RMSE或AE。同样,确保标签是您想要的。您是否要将图像中出现的波前划分为不同的类别,还是要为图像中的每个波前分配实值参数?在前者中,标签将是一个单向矢量,而在后者中,标签将是64个实数。
您可以尝试一些操作:
首先,删除遗漏并训练数据的一小部分,以确保模型可以拟合该小部分(即100%精度或0.0 RMSE)。如果模型无法执行此操作,则需要尝试其他方法(可能是非CNN方法)。
将目标缩放为介于0到1之间的实数,并将输出激活更改为S型。这可能会为网络提供一个更好的起点,因为其输出必须在0到1之间。对最后一层使用线性激活可使网络自由地预测任何实数,并增加NN必须拥有的空间。搜索以做出良好的预测。
相应地,将二元互熵用作具有S型输出的损失函数,然后查看模型的作用。
您可以看到一个模型是否可以预测64位长度向量的单个元素,并为每个参数训练一个模型。这在计算上将是昂贵的,但是如果可行,它将起作用。
祝你好运。