- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 python 中实现二维卷积。
我有一个尺寸为 (m, 64, 64, 3) 的输入图像集,其中 m 是图像的数量。
我想对高度和宽度使用过滤器大小 f=8 和 stride=8,并使用相同的填充,以便保留输入宽度和高度 (64, 64)。
使用公式 [n' = floor((n-f+2*pad)/stride + 1)] 并把 n'=64, n=64, stride=8, f=8, 我得到 垫=224 ,这是不合理的大。
比如我取m的时候,图像的数量,为1080,估计是内存错误导致系统崩溃。
但是当我使用 Keras 库和以下代码时,它运行良好。
X = keras.layers.Conv2D(filters=32, kernel_size=(8, 8), strides=(8, 8), padding='same')(X)
这是我在 python 中的 Conv2D 实现:
import numpy as np
# A.shape = (1080, 64, 64, 3)
# W.shape = (8, 8, 3, 32)
# b.shape = (32,)
def conv_fwd(A, W, b, pad=0, stride=1):
pad_A = np.pad(A, ((0, 0), (pad, pad), (pad, pad), (0, 0)), mode='constant')
(m, w, h, nc) = A.shape
(fw, fh, ncc, ncn) = W.shape
if nc != ncc:
raise Exception('Number of channels in kernel and input do not match')
wn = int((w-fw+2*pad)/stride + 1)
hn = int((h-fh+2*pad)/stride + 1)
A_n = np.zeros((m, wn, hn, ncn))
W = W.reshape(fw*fh*ncc, ncn)
for i in range(wn):
for j in range(hn):
A_n[:, i, j] = pad_A[:, i*stride:i*stride+fw, j*stride:j*stride+fh].reshape(m, fw*fh*nc).dot(W) + b
return A_n
所以我假设在 keras 中计算填充有不同的过程。我试图寻找源代码,但找不到。它是如何工作的?
最佳答案
在公式中,n' = floor((n-f+2*pad)/stride + 1
您已服用 n' == n == 64
.
那是不正确的。 n' is equal to n
仅当 Stride is equal to 1
的值但在这里,Stride
大于 1 ( 8
)。
这就是您获得高值(value) Padding
的原因.
现在,您的目标是找到 Padding
的值,我有一个解决方案/解决方法(可能不是很优化)。
最初,使用 Padding = Same
构建模型, 如下所示:
import tensorflow as tf
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(filters = 64, strides = (2,2), kernel_size = (3,3),
input_shape = (64,64,3), padding = 'same'))
print(model.summary())
模型总结
Padding = Same
如下图所示:
Model: "sequential_12"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_25 (Conv2D) (None, 32, 32, 64) 1792
=================================================================
Total params: 1,792
Trainable params: 1,792
Non-trainable params: 0
如果我们观察 Shape
的Image
,从 (64,64)
减少至 (32,32)
即使 Padding == Same
.
Padding = Valid
构建模型, 如下所示:
import tensorflow as tf
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(filters = 64, strides = (2,2), kernel_size = (3,3),
input_shape = (64,64,3), padding = 'valid'))
print(model.summary())
上述模型的摘要如下所示:
Model: "sequential_11"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_24 (Conv2D) (None, 31, 31, 64) 1792
=================================================================
Total params: 1,792
Trainable params: 1,792
Non-trainable params: 0
如果我们观察,
Shape
的
Convolutional Layer
是
(None,31,31,64)
.
Padding
可以通过公式得到,
Height with SAME Padding - Height with VALID Padding
或者
Width with SAME Padding - Width with VALID Padding
即,
32 - 31 = 1
.
Input Shape
=
(64, 64,3)
,
Filter Size = 8
,
Strides = 8
是
1 IE。,
Input
是
用 1 行和 1 列零填充 .
关于python - 当步幅大于 1 时,SAME 填充如何在卷积神经网络中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62859668/
我不太确定为什么较大字符串(“cat”和“dog”)的答案不一致。我正在用链接列表和模板的使用做一些事情。我的好奇心促使我修改模板和函数重载。如果有人能解释发生了什么,我将不胜感激。谢谢你。 #inc
目前我必须编写这样的查询 SELECT * FROM table WHERE value1 > 5000 OR value2 > 5000 OR value3 > 5000 OR value4 > 5
我想创建一个如下所示的查询,但我不确定如何正确编码, 我希望它在开始时间的 1 小时内返回所有预订,这是我想出的: SELECT BookingId, StartTime FROM Booking W
这个问题已经有答案了: How to check if a number is between two values? (12 个回答) 已关闭 6 年前。 我目前正在 Codecademy 上学习
我想验证用户输入。如果用户输入的数字大于 3,则应抛出错误“Too high”,如果小于 0.15,则应抛出“Too low”错误。如果它在 3 到 0.15 之间,那么它应该显示“好的”。 我的代码
我有一个拖动脚本,我在其中拖动 div.slider,我正在跟踪 div.slider 的“左”值,并在它大于 68 时让它淡出,但问题是它当它达到 6 而不是 68 时淡出。如果我将数字更改为 85
是否有一种常见的模式如何在数据库(postgresql)中存储这样的条件,然后以简单的方式从数据库中获取这些数据,并在前端将其与我们在前端的值 SE 进行比较(以获得正确的“值” "): condit
如何大于/小于内部工作 如果我将 5 与 100 与 5 与 2,147,483,647 (Integer.MAX_VALUE) 进行比较,性能会受到多大影响 5 < 100 and 5 < Inte
当我运行此查询时它有效 SELECT sum( amount ) AS balance FROM balance WHERE amount >= 100 但是当我想过滤用户 ID 时,它返回 NULL
我有下表: account(id, balance, bank_branch) 我想选择账户余额大于其 bank_branch 平均余额的所有账户 我试过了 Select id from accoun
你们有没有人知道如何搜索所有大于指定数字的数字? 例如:所有单据编号>65 我试过这样:documentNumber: [65 TO *] 但我收到异常,因为 lucene 期望解析一个没有 * 的数
我正在使用 Prolog 算法,并且有一个生成抽象语法树的程序,例如 plus(num(1),num(2))这只是 1+2 .这是通过使用 DCG 来完成的。在这个例子中 plus(num(1),nu
是否使用 Sin(720) 或 Cos(1440)(以度为单位的角度)? 无论是在计算机编程中还是在任何其他情况下? 一般来说,是否有任何角度的 Sin/Cosine/Tan 使用 大于360? 在物
我发现了一些与此相关的问题,但没有一个真正回答了我的问题。 我有一个像这样的表格文件: 2 10610 0 0 0 0.0105292 2 10649 0 0 0
我是 Prolog 的新手,我正在尝试解决这个练习: Define a predicate greater_than/2 that takes two numerals in the notation
我想选择具有出现次数的不同键,此查询似乎有效: SELECT ItemMetaData.KEY, ItemMetaData.VALUE, count(*) FROM ItemMetaData GROU
我需要存储和使用大于 ULLONG_MAX 的数值。 我需要对这些值进行算术运算,所以我认为存储为 char** 不是一个选项。 在这些情况下,有没有办法动态创建额外的 long 前缀? 谢谢大家。根
我是 Prolog 的新手,我正在尝试解决这个练习: Define a predicate greater_than/2 that takes two numerals in the notation
处理已知大小但大于 64 位的位掩码(即执行所有位操作)的最有效的数据结构是什么? 字节[]? 大整数?完全是别的东西吗? 需要与 Java 7 兼容,并且对于诸如此类的事情应该很快(或者至少与合理预
编辑:抱歉进行了许多编辑。我自己都忘记写了什么了。 我使用 JPanel,将 BoxLayout 作为 JFrame 的根面板。我向此根面板添加了另外两个面板:带有 FlowLayou 的 Butto
我是一名优秀的程序员,十分优秀!