- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经研究了很多天的分割问题,在终于找到如何正确读取数据集之后,我遇到了这个问题:
ValueError: Error when checking target: expected activation_1(Softmax) to have 3 dimensions, but got array with shape
(32, 416, 608, 3)
I used the functional API, since I took the FCNN architecture from [here](https://github.com/divamgupta/image-segmentation-keras/blob/master/Models/FCN32.py).
根据我的任务(IMAGE_ORDERING = "channels_last"(TensorFlow backend)) 稍作修改和调整。谁能帮帮我吗?非常感谢。下面的架构是针对 FCNN 的,我尝试实现它是为了分割的目的。这是架构(在调用 model.summary() 之后):
1.
2。
具体报错是:
“导入数据集”功能:
“Fit_Generator 方法调用”:
img_input = Input(shape=(input_height,input_width,3))
#Block 1
x = Convolution2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1', data_format=IMAGE_ORDERING)(img_input)
x = BatchNormalization()(x)
x = Convolution2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2', data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool', data_format=IMAGE_ORDERING)(x)
f1 = x
# Block 2
x = Convolution2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1', data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = Convolution2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2', data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool', data_format=IMAGE_ORDERING )(x)
f2 = x
# Block 3
x = Convolution2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1', data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = Convolution2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2', data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = Convolution2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3', data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool', data_format=IMAGE_ORDERING )(x)
f3 = x
# Block 4
x = Convolution2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1', data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = Convolution2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2',data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = Convolution2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3',data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool', data_format=IMAGE_ORDERING)(x)
f4 = x
# Block 5
x = Convolution2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1', data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = Convolution2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2',data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = Convolution2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3', data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool', data_format=IMAGE_ORDERING)(x)
f5 = x
x = (Convolution2D(4096,(7,7) , activation='relu' , padding='same', data_format=IMAGE_ORDERING))(x)
x = Dropout(0.5)(x)
x = (Convolution2D(4096,(1,1) , activation='relu' , padding='same',data_format=IMAGE_ORDERING))(x)
x = Dropout(0.5)(x)
#First parameter = number of classes+1 (de la background)
x = (Convolution2D(20,(1,1) ,kernel_initializer='he_normal' ,data_format=IMAGE_ORDERING))(x)
x = Convolution2DTranspose(20,kernel_size=(64,64), strides=(32,32),use_bias=False,data_format=IMAGE_ORDERING)(x)
o_shape = Model(img_input,x).output_shape
outputHeight = o_shape[1]
print('Output Height is:', outputHeight)
outputWidth = o_shape[2]
print('Output Width is:', outputWidth)
#https://keras.io/layers/core/#reshape
x = (Reshape((20,outputHeight*outputWidth)))(x)
#https://keras.io/layers/core/#permute
x = (Permute((2, 1)))(x)
print("Output shape before softmax is", o_shape)
x = (Activation('softmax'))(x)
print("Output shape after softmax is", o_shape)
model = Model(inputs = img_input,outputs = x)
model.outputWidth = outputWidth
model.outputHeight = outputHeight
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics =['accuracy'])
最佳答案
FCNN 架构示例中的原始代码使用输入维度 (416, 608)
.而在您的代码中,输入维度是 (192, 192)
(忽略 channel 维度)。现在,如果您仔细观察,这个特定的层
x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool', data_format=IMAGE_ORDERING)(x)
生成维度 (6, 6)
的输出(您可以在 model.summary()
中验证)。
下一个卷积层
o = (Convolution2D(4096,(7,7) , activation='relu' , padding='same', data_format=IMAGE_ORDERING))(o)
使用大小为 (7, 7)
的卷积过滤器,但您的输入已经减小到小于该大小(即 (6, 6)
)。先尝试解决这个问题。
此外,如果您查看 model.summary()
输出,您会注意到它不包含在 block5_pool 层之后定义的层。其中有一个 transposed convolution
层(基本上是对输入进行上采样)。您可能想看看并尝试解决这个问题。
注意:在我的所有维度中,我都忽略了 channel 维度。
编辑下面的详细答案
首先,这是我的 keras.json
文件。它使用 Tensorflow 后端,image_ordering
设置为 channel_last。
{
"floatx": "float32",
"epsilon": 1e-07,
"backend": "tensorflow",
"image_data_format": "channels_last"
}
接下来,我复制粘贴我的确切模型代码。请特别注意以下代码中的内联注释。
from keras.models import *
from keras.layers import *
IMAGE_ORDERING = 'channels_last' # In consistency with the json file
def getFCN32(nb_classes = 20, input_height = 416, input_width = 608):
img_input = Input(shape=(input_height,input_width, 3)) # Expected input will have channel in the last dimension
#Block 1
x = Convolution2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1', data_format=IMAGE_ORDERING)(img_input)
x = BatchNormalization()(x)
x = Convolution2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2', data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool', data_format=IMAGE_ORDERING)(x)
f1 = x
# Block 2
x = Convolution2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1', data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = Convolution2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2', data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool', data_format=IMAGE_ORDERING )(x)
f2 = x
# Block 3
x = Convolution2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1', data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = Convolution2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2', data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = Convolution2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3', data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool', data_format=IMAGE_ORDERING )(x)
f3 = x
# Block 4
x = Convolution2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1', data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = Convolution2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2',data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = Convolution2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3',data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool', data_format=IMAGE_ORDERING)(x)
f4 = x
# Block 5
x = Convolution2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1', data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = Convolution2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2',data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = Convolution2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3', data_format=IMAGE_ORDERING)(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool', data_format=IMAGE_ORDERING)(x)
f5 = x
x = (Convolution2D(4096,(7,7) , activation='relu' , padding='same', data_format=IMAGE_ORDERING))(x)
x = Dropout(0.5)(x)
x = (Convolution2D(4096,(1,1) , activation='relu' , padding='same',data_format=IMAGE_ORDERING))(x)
x = Dropout(0.5)(x)
x = (Convolution2D(20,(1,1) ,kernel_initializer='he_normal' ,data_format=IMAGE_ORDERING))(x)
x = Convolution2DTranspose(20,kernel_size=(64,64), strides=(32,32),use_bias=False,data_format=IMAGE_ORDERING)(x)
o_shape = Model(img_input, x).output_shape
# NOTE: Since this is channel last dimension ordering, the height and width dimensions are along [1] and [2], not [2] and [3]
outputHeight = o_shape[1]
outputWidth = o_shape[2]
x = (Reshape((outputHeight*outputWidth, 20)))(x) # Channel should be along the last dimenion of reshape
# No need of permute layer anymore
print("Output shape before softmax is", o_shape)
x = (Activation('softmax'))(x)
print("Output shape after softmax is", o_shape)
model = Model(inputs = img_input,outputs = x)
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics =['accuracy'])
return model
model = getFCN32(20)
print(model.summary())
接下来,我将提供有关我的 model.summary()
外观的片段。如果你看一下最后几层,它是这样的:
所以这意味着,conv2d_transpose
层产生维度为 (448, 640, 20)
的输出,并在应用 flatten 之前将其输出em>softmax 就可以了。所以输出的维度是(286720, 20)
。同样,您的 target_generator
(在您的情况下为 mask_generator
)也应该生成相似维度的目标。同样,您的 input_generator
也应该生成大小为 [batch size, input_height,input_width, 3]
的输入批处理,如 img_input
中所述你的功能。
希望这能帮助您找到问题的根源并找出合适的解决方案。请查看代码中的细微变化(以及内联注释)以及如何创建您的输入 和目标 批处理。
关于python - Keras(FIT_GENERATOR)- 错误,当检查目标 : expected activation_1 to have 3 dimensions, 但得到形状为 (32, 416, 608, 3) 的数组时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49844360/
我的代码如下所示: unemp n)) stop("wrong embedding dimension") : argument is of length zero Called from: emb
Macports 更新后,我认为更新了 numpy,我收到警告: VisibleDeprecationWarning: boolean index did not match indexed arra
我试图使用 MNIST 数据集实现简单的神经网络,但我不断收到此错误 将 matplotlib.pyplot 导入为 plt import torch from torchvision import
我编写了自己的相机 Activity ,我在FrameLayout中显示照片的实时预览,但是实时图片看起来不自然,有点高,我认为这是因为尺寸FrameLayout 的尺寸与相机的尺寸不匹配。我应该做什
tf.reduce_mean() 函数以 axis 参数中引用的索引的方式对数组元素求和。 在下面的代码中: import tensorflow as tf x = tf.Variable([1, 2
我有一个航类延误数据电子表格,我正在处理一个显示每个机场总延误时间的工作表。我想过滤维度“机场”,即根据每个机场的起飞次数创建机场类别,“小型”、“中型”和“大型”,这是通过计算维度“航类号”计算得出
如何在 3 列 X_train 数据上使用以下代码。错误 "ValueError: query data dimension must match training data dimension" 在
JavaScript:给定一个字符串数组: ['properties.dimensions.length', 'properties.name'] 在散列中使用这些来验证或访问它们(实际上只是想验证
JavaScript:给定一个字符串数组: ['properties.dimensions.length', 'properties.name'] 在散列中使用这些来验证或访问它们(实际上只是想验证
我有以下代码用于整数 vector 的 vector (即整数矩阵..) vector > scores (3, vector(2,0)); cout<
尽管已经有很多关于这个主题的答案,但在下面的例子中没有看到(摘自 https://gist.github.com/lirnli/c16ef186c75588e705d9864fb816a13c on
我有一堆保证有的图片: 最小宽度 = 200 像素 最大宽度 = 250 像素 最小高度 = 150 像素 最大高度 = 175 像素 我想要做的是显示一个由 200 像素 x 150 像素组成的图像
转tensorrt时报错: input: kMAX dimensions in profile 0 are [2,3,128,128] but input has static dimensions
我正在尝试对在 UCI 机器学习数据库中找到的一些文本识别数据进行 k 最近邻预测。 (https://archive.ics.uci.edu/ml/datasets/Letter+Recogniti
如何有效地在更高维空间上追踪等值面 最佳答案 你有一个 N 维的标量成本函数, f(y0, y1, .., yN) ∊ ℝ, y ∊ ℝ 但仅在规则的矩形网格中采样, yk = Ψk + ψk x
我正在尝试根据《Doing Bayesian Data Analysis: A Tutorial with R, JAGS, and Stan (2015)》一书来学习贝叶斯分析。 这本书里有例子。所
LEt x_t = F(x_{t-1}) 是 chaotic regime. 中的一个时间离散动力系统 从初始条件x_0开始,我们可以生成一个时间序列=x_t,其中t =1,2,...,T 表示时间索
当我尝试使用: const {width, height} = Dimensions.get('window'); 在 React Native 组件上,我收到一个以前从未见过的奇怪错误: 找不到变量
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 2 年前。 Improve
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 9 年前。 Improve
我是一名优秀的程序员,十分优秀!