Scikit learn 精度差异大:Conv2D和ConvLSTM2D

Scikit learn 精度差异大:Conv2D和ConvLSTM2D,scikit-learn,keras,Scikit Learn,Keras,我试图比较Conv2D和ConvLSTM2D架构,从低分辨率图像中估计高分辨率图像。但预测显示两种架构之间存在很大差异。是什么导致了这种错误的预测?这是因为架构的实现不正确吗 在ConvLSTM2D的情况下: 将numpy导入为np,scipy.ndimage,matplotlib.pyplot导入为plt 从keras.models导入顺序 从keras.layers导入致密、脱落、激活、展平 从keras.layers导入卷积2D、ConvLSTM2D、MaxPoolig2D、上采样2D 从

我试图比较
Conv2D
ConvLSTM2D
架构,从低分辨率图像中估计高分辨率图像。但预测显示两种架构之间存在很大差异。是什么导致了这种错误的预测?这是因为架构的实现不正确吗

在ConvLSTM2D的情况下:
将numpy导入为np,scipy.ndimage,matplotlib.pyplot导入为plt
从keras.models导入顺序
从keras.layers导入致密、脱落、激活、展平
从keras.layers导入卷积2D、ConvLSTM2D、MaxPoolig2D、上采样2D
从sklearn.metrics导入准确性、混淆矩阵、科恩卡帕分数
从sklearn.preprocessing导入MinMaxScaler、StandardScaler
np.随机种子(123)
原始=np.arange(96)。重塑(8,3,4)
data1=scipy.ndimage.zoom(原始,缩放=(1100100),顺序=1,模式='nearest')#低分辨率
打印(数据1.形状)
#(8, 300, 400)
data2=scipy.ndimage.zoom(原始,缩放=(1100100),顺序=3,模式='nearest')#高分辨率
打印(数据2.形状)
#(8, 300, 400)
X_train=data1.重塑(1,data1.shape[0],data1.shape[1],data1.shape[2],1)
Y_train=data2.重塑(1,data2.形状[0],data2.形状[1],data2.形状[2],1)
模型=顺序()
输入_shape=(data1.shape[0],data1.shape[1],data1.shape[2],1)
add(ConvLSTM2D(16,内核大小=(3,3),激活='sigmoid',填充='same',输入形状=输入形状,返回顺序=True))
add(ConvLSTM2D(1,内核大小=(3,3),activation='sigmoid',padding='same',return_sequences=True))
compile(loss='mse',optimizer='adam')
模型安装(X_系列、Y_系列、,
批次大小=1,时间=10,详细程度=1)
y_预测=模型预测(X_列车)
y_predict=y_predict.reformate(data1.shape[0],data1.shape[1],data1.shape[2])
斜率,截距,r_值,p_值,标准误差=线性回归(数据2[0,:,:]重塑(-1),y_预测[0,:,:]重塑(-1))
打印(r_值**2)
0.26 如果是Conv2D:
X_train=data1.重塑(data1.shape[0],data1.shape[1],data1.shape[2],1)
Y_train=data2.重塑(data2.形状[0],data2.形状[1],data2.形状[2],1)
模型=顺序()
输入_shape=(data1.shape[1],data1.shape[2],1)
添加(卷积2D(64,内核大小=(3,3),激活='sigmoid',填充='same',输入形状=输入形状))
add(卷积2d(1,内核大小=(3,3),activation='sigmoid',padding='same'))
compile(loss='mse',optimizer='adam')
模型安装(X_系列、Y_系列、,
批次大小=1,时间=10,详细程度=1)
y_预测=模型预测(X_列车)
y_predict=y_predict.reformate(data1.shape[0],data1.shape[1],data1.shape[2])
斜率,截距,r_值,p_值,标准误差=线性回归(数据2[0,:,:]重塑(-1),y_预测[0,:,:]重塑(-1))
打印(r_值**2)

0.93两个重要因素可能会严重影响结果:

  • 您有64个Conv2D筛选器和16个ConvLSTM2D筛选器
  • LSTM层试图理解一部“电影”,所有图像按顺序排列,这肯定比处理单个图像更复杂
对于第二点,您可以尝试使用
(8,1300400,1)
的形状。这将消除时间步长(如果我们正确理解,应该使LSTM与Conv2D完全一样工作)。但是作为一个循环层,这是无用的


不幸的是,这是“比较”它们的唯一方法。LSTM层适用于“电影”(图像是按顺序排列的帧),但您的情况似乎并非如此

似乎您没有训练ConvLSTM模型(我找不到model.fit()的任何行),所以您的第一个结果只是来自随机权重。是的,但仍然存在很大的差异,0.26 vs 0.93LSTMs(和ConvLSTM2Ds)通常可以很好地处理
tanh
结束激活(如果不指定任何内容,这是默认值)。尝试从
ConvLSTM2D(…)
调用中删除
activation=“sigmoid”
设置,看看这是否会改善结果。此外,正如@daniel-möller所提到的,帧之间没有时间关系。你们有物理关系吗(他们在捕捉角度、位置上相似吗)?如果是,那么您可以在这里尝试Conv3D图层,看看它们的性能。@ldavid是的,tanh提高了精度,现在两者的精度几乎相同。当场景发生物理变化时,我有时间关系。尽管如此,预测的图像还是不好,我无法改进
ConvLSTM2D
模型来执行超分辨率。这个模型太小了。你需要一个好的模型,很多层,比如搜索一个U型网络。然后,差异问题就解决了,对吗?你认为你的问题得到回答了吗?