使用基于 ConvLSTM2D 的 Keras 模型从较低分辨率图像估计高分辨率图像

2024-05-06

我正在尝试使用以下内容ConvLSTM2D从低分辨率图像序列估计高分辨率图像序列的架构:

import numpy as np, scipy.ndimage, matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, ConvLSTM2D, MaxPooling2D, UpSampling2D
from sklearn.metrics import accuracy_score, confusion_matrix, cohen_kappa_score
from sklearn.preprocessing import MinMaxScaler, StandardScaler
np.random.seed(123)

raw = np.arange(96).reshape(8,3,4)
data1 = scipy.ndimage.zoom(raw, zoom=(1,100,100), order=1, mode='nearest') #low res
print (data1.shape)
#(8, 300, 400)

data2 = scipy.ndimage.zoom(raw, zoom=(1,100,100), order=3, mode='nearest') #high res
print (data2.shape)
#(8, 300, 400)

X_train = data1.reshape(data1.shape[0], 1, data1.shape[1], data1.shape[2], 1)
Y_train = data2.reshape(data2.shape[0], 1, data2.shape[1], data2.shape[2], 1)
#(samples,time, rows, cols, channels)

model = Sequential()
input_shape = (data1.shape[0], data1.shape[1], data1.shape[2], 1)
#samples, time, rows, cols, channels
model.add(ConvLSTM2D(16, kernel_size=(3,3), activation='sigmoid',padding='same',input_shape=input_shape))     
model.add(ConvLSTM2D(8, kernel_size=(3,3), activation='sigmoid',padding='same'))

print (model.summary())

model.compile(loss='mean_squared_error',
              optimizer='adam',
              metrics=['accuracy'])

model.fit(X_train, Y_train, 
          batch_size=1, epochs=10, verbose=1)

x,y = model.evaluate(X_train, Y_train, verbose=0)
print (x,y)

该声明将导致以下结果Value error:

ValueError:输入 0 与层 conv_lst_m2d_2 不兼容:预期 ndim=5,发现 ndim=4

我该如何纠正这个问题ValueError?我认为问题出在输入形状上,但无法弄清楚到底出了什么问题。
请注意,输出也应该是图像序列,而不是分类结果。


发生这种情况是因为LSTMs需要时间数据,但你的第一个被声明为many-to-one模型,输出形状张量(batch_size, 300, 400, 16)。即批量图像:

model.add(ConvLSTM2D(16, kernel_size=(3,3), activation='sigmoid',padding='same',input_shape=input_shape))     
model.add(ConvLSTM2D(8, kernel_size=(3,3), activation='sigmoid',padding='same'))

您希望输出是形状张量(batch_size, 8, 300, 400, 16)(即图像序列),因此它们可以被第二个 LSTM 消耗。解决这个问题的方法是添加return_sequences在第一个 LSTM 定义中:

model.add(ConvLSTM2D(16, kernel_size=(3,3), activation='sigmoid',padding='same',input_shape=input_shape,
                     return_sequences=True))
model.add(ConvLSTM2D(8, kernel_size=(3,3), activation='sigmoid',padding='same'))

你提到了分类。如果你缩进的是对整个序列进行分类,那么你在最后需要一个分类器:

model.add(ConvLSTM2D(16, kernel_size=(3,3), activation='sigmoid',padding='same',input_shape=input_shape,
                     return_sequences=True))
model.add(ConvLSTM2D(8, kernel_size=(3,3), activation='sigmoid',padding='same'))
model.add(GlobalAveragePooling2D())
model.add(Dense(10, activation='softmax'))  # output shape: (None, 10)

但如果你想对每个图像进行分类within序列,然后你可以简单地使用分类器重新应用TimeDistributed:

x = Input(shape=(300, 400, 8))
y = GlobalAveragePooling2D()(x)
y = Dense(10, activation='softmax')(y)
classifier = Model(inputs=x, outputs=y)

x = Input(shape=(data1.shape[0], data1.shape[1], data1.shape[2], 1))
y = ConvLSTM2D(16, kernel_size=(3, 3),
               activation='sigmoid',
               padding='same',
               return_sequences=True)(x)
y = ConvLSTM2D(8, kernel_size=(3, 3),
               activation='sigmoid',
               padding='same',
               return_sequences=True)(y)
y = TimeDistributed(classifier)(y)  # output shape: (None, 8, 10)

model = Model(inputs=x, outputs=y)

最后,看一下 keras 存储库中的示例。有一个适合一个使用 ConvLSTM2D 的生成模型 https://github.com/keras-team/keras/blob/master/examples/conv_lstm.py.


编辑:从 data1 估计 data2...

如果这次我做对了X_train应该是 8 个 (300, 400, 1) 图像堆栈的 1 个样本,而不是 1 个形状 (300, 400, 1) 图像堆栈的 8 个样本。
如果这是真的,那么:

X_train = data1.reshape(data1.shape[0], 1, data1.shape[1], data1.shape[2], 1)
Y_train = data2.reshape(data2.shape[0], 1, data2.shape[1], data2.shape[2], 1)

应更新为:

X_train = data1.reshape(1, data1.shape[0], data1.shape[1], data1.shape[2], 1)
Y_train = data2.reshape(1, data2.shape[0], data2.shape[1], data2.shape[2], 1)

Also, accuracy当你的损失是 MSE 时,通常没有意义。您可以使用其他指标,例如mae.

现在您只需要更新模型以返回序列并在最后一层中有一个单元(因为您尝试估计的图像具有单个通道):

model = Sequential()
input_shape = (data1.shape[0], data1.shape[1], data1.shape[2], 1)
model.add(ConvLSTM2D(16, kernel_size=(3, 3), activation='sigmoid', padding='same',
                     input_shape=input_shape,
                     return_sequences=True))
model.add(ConvLSTM2D(1, kernel_size=(3, 3), activation='sigmoid', padding='same',
                     return_sequences=True))

model.compile(loss='mse', optimizer='adam')

在那之后,model.fit(X_train, Y_train, ...)将正常开始训练:

Using TensorFlow backend.
(8, 300, 400)
(8, 300, 400)
Epoch 1/10

1/1 [==============================] - 5s 5s/step - loss: 2993.8701
Epoch 2/10

1/1 [==============================] - 5s 5s/step - loss: 2992.4492
Epoch 3/10

1/1 [==============================] - 5s 5s/step - loss: 2991.4536
Epoch 4/10

1/1 [==============================] - 5s 5s/step - loss: 2989.8523
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用基于 ConvLSTM2D 的 Keras 模型从较低分辨率图像估计高分辨率图像 的相关文章

随机推荐

  • Visual Studio Code,调试子进程不起作用

    我有这个确切的问题 https github com Microsoft vscode cpptools issues 511 https github com Microsoft vscode cpptools issues 511 但那
  • html画布绘图显示出来

    我确信这个问题在我还找不到答案之前就已经被问过 我想通过在顶部绘制另一个白色矩形来擦除黑色矩形的一部分 但是许多原始黑色矩形显示出来 就像正在平均一样 canvas document getElementById canvas contex
  • Ansible 和硬件检查

    我必须使用 ansible 检查 Linux 机器上的不同硬件和配置元素 我完全不确定如何做到这一点 RAM 磁盘空间 DNS CPU 我知道我几乎可以找到我想要的所有事实都在 ansible 中 但我不明白如何使用它 例如 我必须检查 R
  • 如何从 coxme 包中的 lmekin 对象中提取 p 值

    我希望能够查看 coxme 包生成的 lmekin 对象的 p 值 eg model lmekin formula height score sex age 1 IID data phenotype df varlist kinship m
  • weak_ptr、make_shared 和内存释放

    一个控制块shared ptr当至少有一个时保持存活weak ptr展示 如果共享指针是用以下命令创建的make shared这意味着对象的整个内存都保持分配状态 对象本身被正确破坏 但由于对象的控制块和内存被分配在一个块中 如make s
  • 如何在Python中每次运行脚本时增加变量?

    我有一个 Python 脚本 我想在每次运行时增加一个全局变量 这可能吗 使用外部文件很容易做到这一点 您可以创建一个函数来为您执行此操作 这样您就可以根据需要将多个文件用于多个变量 尽管在这种情况下您可能想要研究某种序列化并将所有内容存储
  • 在 ionic 3 应用程序中找不到命名空间“google”

    在我尝试在项目中使用 google 变量后 任何人都可以帮我解决这个错误 我进入了 ionic 3 应用程序 npm install save types google maps 将以下内容添加到我的 package json 中 type
  • winpdb 不适用于 python 3.3

    我无法让 rpdb2 与 python 3 3 一起运行 但根据多个来源 这应该是可能的 rpdb2 d myscript py A password should be set to secure debugger client serv
  • 是否有中欧通用的 TimeZoneInfo?

    是否有针对中欧的通用 TimeZoneInfo 将 CET 和 CEST 纳入考虑 我有一个应用程序正在执行以下操作 TimeZoneInfo tzi TimeZoneInfo FindSystemTimeZoneById Central
  • 通过pip安装lxml时出错:需要Microsoft Visual C++ 14.0

    我使用的是 Windows 10 机器 最近从 python 2 7 迁移到 3 5 当尝试通过 pip 安装 lxml 时 它会停止并抛出此错误消息 构建 lxml etree 扩展错误 需要 Microsoft Visual C 14
  • 在Python子目录中创建文件?

    在我的 Python 脚本中 我需要在子目录中创建一个新文件而不更改目录 并且需要从当前目录不断编辑该文件 My code os mkdir datetime dst for ip in open list txt with open ip
  • 使用加权概率和值查找数组中的项目

    上周我正在做的一个简单程序遇到了一些问题 这里有人帮助了我 现在我遇到了另一个问题 我目前有这个代码 var findItem function desiredItem var items item rusty nail probabili
  • Mac OS X 文件关联有效,但文件图标未更改

    我使用 Qt 5 3 2 开发了一个 Mac 应用程序 该应用程序处理具有特定扩展名的文件 比方说 xyz 我创建了一个名为 XYZ icns 的图标文件 并将其添加到我的应用程序包资源文件夹中 MyApp app Contents Res
  • 在自动触发的默认侦听器之前触发 Hibernate 自定义事件侦听器

    我创建了一个自定义 Hibernate 事件监听器 扩展了 org hibernate event PreInsertEventListener 自定义侦听器会重写 onPreInsert 方法 并在使用 DAO 将 联系人 实体保存到数据
  • 如何在android中动态添加项目到listview

    有谁能够帮助我 我正在尝试在 Android 中创建一个 ListView 并且我正在尝试使用代码 不使用 XML 将项目加载到其中 这是我到目前为止的代码 tweetList ListView this findViewById R id
  • 猪如何过滤不同的对(对)

    我是猪的新手 我有一个 Pig 脚本 它在两个元素之间生成制表符分隔的对 每行一对 例如 John Paul Tom Nik Mark Bill Tom Nik Paul John 我需要过滤掉重复的组合 如果我使用 DISTINCT 我会
  • 如何在列表视图中每行右侧显示 4 个图标

    我想在列表视图的每一行右侧设置 3 个图标 我正在制作购物应用程序 我希望在列表视图中用户选择任何产品时 这样他 她可以以 3 种方式查看产品 就像用户选择图标一样1 这样用户可以在网格视图中看到产品 如果用户选择图标 2 这样用户可以在图
  • Visual Studio 2017 ASP.Net 发布独立的 Dot Net Core 应用程序

    我在 Visual Studio 2017 中有一个 Net Core ASP Net 应用程序 我正在尝试对该应用程序进行独立部署 如果我从 CLI 运行以下命令 它会完全按照我想要的方式工作并生成 exe dotnet publish
  • 将 H264 视频转换为原始 YUV 格式

    是否可以使用 ffmpeg 从 H264 编码视频创建原始 YUV 视频 我想用 matlab 打开视频并逐帧访问 Luma Cb 和 Cr 分量 是的 您可以 您只需指定像素格式即可 要获取格式的完整列表 ffmpeg pix fmts
  • 使用基于 ConvLSTM2D 的 Keras 模型从较低分辨率图像估计高分辨率图像

    我正在尝试使用以下内容ConvLSTM2D从低分辨率图像序列估计高分辨率图像序列的架构 import numpy as np scipy ndimage matplotlib pyplot as plt from keras models