我正在研究具有常规矩阵格式的风力涡轮机数据集:[ row:datetime , column:features]
但我想用卷积来捕捉每个特征的进展,就像在 LSTM 中完成的那样。因此,我生成了一个具有以下维度的新数据集:
[datetime, 15 timesteps,128 features] :每个原始日期时间行现在有 15 个寄存器(t-0,t-1,...,t-14)用于每个特征。
我的计划是使用大小为 1x5 的内核和 5 的步长分别对每个特征(通道)的时间步长维度进行卷积。从 128 个特征中获取每个 DateTime(batch)、长度为 5 的 3 个过滤器,输出形状为(无,3,128)。
然后我将最大池化应用于前一个第二维 (3) 结果,以获得“最重要的复杂时间步长”,期望输出大小:(None,1,128)
最后我连接了一个用于二元分类的密集层。
目前的网络架构在 keras 中实现如下:
model.add( Conv1D(padding = 'valid',filters = nfeatures,strides = 5,kernel_size = 5,
activation = 'relu',input_shape = (timesteps,nfeatures)) )
model.add( MaxPooling1D() )
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
Run Code Online (Sandbox Code Playgroud)
问题是当我检查第一层 (conv1d) 的权重时,权重具有以下维度:[5,128,128] 和偏差 [128]。
预期的权重格式是:[5,1,128] 为什么是 5x128x128?,我只需要每个功能/通道的 5 个权重(内核大小)。
谢谢!
convolution deep-learning conv-neural-network keras tensorflow
我想自己用C++实现2D卷积函数,而不使用filter2D()。我试图迭代输入图像和内核的所有像素,然后为 dst 的每个像素分配新值。但是,我收到了这个错误。
线程 1:EXC_BAD_ACCESS(代码=1,地址=0x0)
我发现这个错误告诉我正在访问 nullptr,但我无法解决问题。这是我的 C++ 代码。
cv::Mat_<float> spatialConvolution(const cv::Mat_<float>& src, const cv::Mat_<float>& kernel)
{
// declare variables
Mat_<float> dst;
Mat_<float> flipped_kernel;
float tmp = 0.0;
// flip kernel
flip(kernel, flipped_kernel, -1);
// multiply and integrate
// input rows
for(int i=0;i<src.rows;i++){
// input columns
for(int j=0;j<src.cols;j++){
// kernel rows
for(int k=0;k<flipped_kernel.rows;k++){
// kernel columns
for(int l=0;l<flipped_kernel.cols;l++){
tmp += src.at<float>(i,j) * flipped_kernel.at<float>(k,l);
}
}
dst.at<float>(i,j) = tmp;
}
}
return dst.clone();
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用卷积层对灰度(单层)图像(存储为 numpy 数组)进行卷积。这是代码:
conv1 = torch.nn.Conv2d(in_channels = 1, out_channels = 1, kernel_size = 33)
tensor1 = torch.from_numpy(img_gray)
out_2d_np = conv1(tensor1)
out_2d_np = np.asarray(out_2d_np)
Run Code Online (Sandbox Code Playgroud)
我希望我的内核为 33x33,并且输出层的数量应等于输入层的数量,当图像的 RGB 通道相加时,输入层的数量为 1。运行时out_2d_np = conv1(tensor1)会产生以下运行时错误:
RuntimeError: 预期 4 维输入为 4 维权重 1 1 33 33,但得到了大小为 [246, 248] 的 2 维输入
我知道如何解决这个问题吗?我特别想使用torch.nn.Conv2d()类/函数。
预先感谢您的任何帮助!
我想了解 MATLAB 的imfilter函数是如何工作的。
im = imread("cameraman.tif");
% Kernel for sharpening the image
kernel = [
0 -1 0;
-1 5 -1;
0 -1 0];
im2 = zeros(size(im));
for y = 1 : size(im,1) - 3
for x = 1 : size(im,2) - 3
sum = 0;
for ky = 1:3
for kx = 1:3
xx = x + kx - 1;
yy = y + ky - 1;
sum = sum + im(yy,xx)*kernel(ky,kx);
end
end
im2(y,x) = sum; …Run Code Online (Sandbox Code Playgroud) 我有两个版本的相同算法.它最初是卷积,但我修改它以减少它以检查我的瓶颈在哪里(注意每个循环只有一次访问全局内存):
__global__
void convolve (unsigned char * Md, float * Kd, unsigned char * Rd, int width, int height, int kernel_size, int tile_width, int channels){
int row = blockIdx.y*tile_width + threadIdx.y;
int col = blockIdx.x*tile_width + threadIdx.x;
int sum = 0;
int pixel;
int local_pixel;
int working_pixel;
int row_offset = (kernel_size/2)*(width+kernel_size-1);
int col_offset = kernel_size/2;
for(int color=0; color<channels; color++){
pixel = color*width*height + row*width + col;
local_pixel = color*(width+kernel_size-1)*(height+kernel_size-1) + row*(width+kernel_size-1) + col + row_offset + col_offset;
if(row < height …Run Code Online (Sandbox Code Playgroud) 我试图通过向cifar10.py添加一些代码来编辑我自己的模型,这就是问题所在.
在cifar10.py中,[tutorial] [1]说:
练习:推理的输出是非标准化的logits.尝试使用tf.nn.softmax()编辑网络体系结构以返回规范化预测.
所以我直接输入"local4"的输出tf.nn.softmax().这给了我缩放的 logits,这意味着所有logits的总和是1.
但是在loss函数中,cifar10.py代码使用:
tf.nn.sparse_softmax_cross_entropy_with_logits()
Run Code Online (Sandbox Code Playgroud)
和这个功能的描述说
警告:此操作需要未缩放的日志,因为它在内部执行logmax以提高效率.不要使用softmax的输出调用此op,因为它会产生不正确的结果.
此外,根据描述,作为上述函数的输入的logits必须具有[batch_size,num_classes]的形状,并且它意味着logits应该是未缩放的softmax,如示例代码计算unnormalized softmaxlogit,如下所示.
# softmax, i.e. softmax(WX + b)
with tf.variable_scope('softmax_linear') as scope:
weights = _variable_with_weight_decay('weights', [192, NUM_CLASSES],
stddev=1/192.0, wd=0.0)
biases = _variable_on_cpu('biases', [NUM_CLASSES],
tf.constant_initializer(0.0))
softmax_linear = tf.add(tf.matmul(local4, weights), biases, name=scope.name)
_activation_summary(softmax_linear)
Run Code Online (Sandbox Code Playgroud)
这是否意味着我不必tf.nn.softmax在代码中使用?
读完这个主题后,我并不完全理解:神经网络中的“卷积”是否可以与简单的下采样或“锐化”功能相媲美?
你能把这个词分解成一个简单易懂的形象/类比吗?
编辑:在第一个答案之后改写:池化可以理解为权重矩阵的下采样吗?
machine-learning convolution neural-network deep-learning conv-neural-network
我是卷积神经网络的新手,我正在学习 3D 卷积。我能理解的是,2D 卷积为我们提供了 XY 维度中低级特征之间的关系,而 3D 卷积有助于检测所有 3 维中的低级特征和它们之间的关系。
考虑使用 2D 卷积层来识别手写数字的 CNN。如果一个数字,比如 5,用不同的颜色书写:
严格的 2D CNN 是否会表现不佳(因为它们在 z 维度上属于不同的通道)?
另外,是否有使用 3D 卷积的实用的知名神经网络?
我有一个Java方法fill0s(),它将一个较小的矩阵输入到一个较大的矩阵中,据说填充了0:
public class PoolingFunctions {
// Fill needed spaces with 0
public static Double[][] fill0s(Double[][] image, int filter_size){
int columns_remaining = filter_size - (image[0].length%filter_size);
int rows_remaining = filter_size - (image.length%filter_size);
// CREATE A MATRIX: HERE LIES THE PROBLEM: //////////////////////////////
Double [][] blank_matrix = new Double [(image.length)+columns_remaining][(image[0].length)+rows_remaining];
for (int i = 0; i<image.length; i++) {
for (int j = 0; j<image[i].length; j++) {
blank_matrix[i][j] = image[i][j];
}
}
return blank_matrix;
}
}
Run Code Online (Sandbox Code Playgroud)
并在调用此方法后:
public class MainPooling{
public static void …Run Code Online (Sandbox Code Playgroud)