如果您对“Flatten”在Keras中的作用是什么?和keras.flatten感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解“Flatten”在Keras中的作用是什么?的各种细节,并对k
如果您对“Flatten”在 Keras 中的作用是什么?和keras.flatten感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解“Flatten”在 Keras 中的作用是什么?的各种细节,并对keras.flatten进行深入的分析,此外还有关于altKey Mouse Event在JavaScript中的作用是什么?、BEGIN块在Perl中的作用是什么?、C ++中extern“ C”的作用是什么?、C++ lambda 表达式在代码重用中的作用是什么?的实用技巧。
本文目录一览:- “Flatten”在 Keras 中的作用是什么?(keras.flatten)
- altKey Mouse Event在JavaScript中的作用是什么?
- BEGIN块在Perl中的作用是什么?
- C ++中extern“ C”的作用是什么?
- C++ lambda 表达式在代码重用中的作用是什么?
“Flatten”在 Keras 中的作用是什么?(keras.flatten)
我试图了解该Flatten
功能在 Keras 中的作用。下面是我的代码,它是一个简单的两层网络。它接收形状为 (3, 2) 的二维数据,输出形状为
(1, 4) 的一维数据:
model = Sequential()model.add(Dense(16, input_shape=(3, 2)))model.add(Activation(''relu''))model.add(Flatten())model.add(Dense(4))model.compile(loss=''mean_squared_error'', optimizer=''SGD'')x = np.array([[[1, 2], [3, 4], [5, 6]]])y = model.predict(x)print y.shape
这打印出y
具有形状 (1, 4)。但是,如果我删除这Flatten
条线,那么它会打印出y
形状为 (1, 3, 4)。
我不明白这一点。根据我对神经网络的理解,这个model.add(Dense(16, input_shape=(3,2)))
函数是创建一个隐藏的全连接层,有 16 个节点。这些节点中的每一个都连接到每个 3x2 输入元素。因此,第一层输出的 16
个节点已经是“平坦的”。因此,第一层的输出形状应该是 (1, 16)。然后,第二层将其作为输入,输出形状为 (1, 4) 的数据。
因此,如果第一层的输出已经是“平坦的”并且形状为 (1, 16),我为什么需要进一步将其展平?
答案1
小编典典如果你阅读 Keras 文档条目Dense
,你会看到这个调用:
Dense(16, input_shape=(5,3))
将产生一个Dense
具有 3 个输入和 16 个输出的网络,它们将独立应用于 5 个步骤中的每一个。因此,如果D(x)
将 3 维向量转换为 16
维向量,您将从层得到的输出将是一系列向量:[D(x[0,:]), D(x[1,:]),..., D(x[4,:])]
带有 shape (5,16)
。为了获得您指定的行为,您可以首先Flatten
将输入输入到 15 维向量,然后应用Dense
:
model = Sequential()model.add(Flatten(input_shape=(3, 2)))model.add(Dense(16))model.add(Activation(''relu''))model.add(Dense(4))model.compile(loss=''mean_squared_error'', optimizer=''SGD'')
编辑: 有些人难以理解 - 这里有一张解释图片:
altKey Mouse Event在JavaScript中的作用是什么?
altkey鼠标事件属性用于显示单击鼠标按钮时是否按下了 SHIFT 键。
示例
您可以尝试运行以下代码来了解如何在 JavaScript 中实现 altKey 鼠标事件。
<!DOCTYPE html> <html> <body onmousedown="funcAltKey(event)"> <div>Press and hold ALT key and then click here.</div> <script> function funcAltKey(event) { if (event.altKey) { alert("ALT key: Pressed"); } else { alert("ALT key: NOT Pressed"); } } </script> </body> </html>
以上就是altKey Mouse Event在JavaScript中的作用是什么?的详细内容,更多请关注php中文网其它相关文章!
BEGIN块在Perl中的作用是什么?
#!/ms/dist/perl5/bin/perl5.8 use strict; use warnings; BEGIN { print "Hello from the BEGIN block\n"; } END { print "Hello from the END block\n"; }
我已经被教导,早期编译和执行BEGIN块允许程序员在执行主程序之前确保任何所需的资源可用。
所以我一直在使用BEGIN块,以确保像DB连接的事情已经建立,并可供主程序使用。类似地,我使用END块来确保所有资源在程序终止之前被关闭,删除,终止等。
今天上午的讨论,我想知道这是错误的方式来看看BEGIN和END块。
BEGIN块在Perl中的预期作用是什么?
更新1:刚刚发现为什么DBI连接没有工作。之后给出这个小Perl程序:
use strict; use warnings; my $x = 12; BEGIN { $x = 14; } print "$x\n";
当执行它打印12。
更新2:感谢Eric Strom的评论下面这个新版本使它更清楚:
use strict; use warnings; my $x = 12; my $y; BEGIN { $x = 14; print "x => $x\n"; $y = 16; print "y => $y\n"; } print "x => $x\n"; print "y => $y\n";
输出为
x => 14 y => 16 x => 12 y => 16
再次感谢埃里克!
解决方法
但我必须问,为什么它都在特殊的块。为什么不只是做一些prepare_db_connection()函数,然后在程序启动时根据需要调用它?
如果一个模块文件中的主线代码被使用,那么在BEGIN {}中不起作用的东西也会有同样的问题。这是使用INIT {}块的另一个可能的原因。
我也看到致命的相互递归的问题,必须解开使用类似require而不是使用,或INIT {}而不是BEGIN {}。但这是非常罕见的。
考虑这个程序:
% cat sto-INIT-eg #!/usr/bin/perl -l print " PRINT: main running"; die " DIE: main dying\n"; die "DIE XXX /* NOTREACHED */"; END { print "1st END: done running" } CHECK { print "1st CHECK: done compiling" } INIT { print "1st INIT: started running" } END { print "2nd END: done running" } BEGIN { print "1st BEGIN: still compiling" } INIT { print "2nd INIT: started running" } BEGIN { print "2nd BEGIN: still compiling" } CHECK { print "2nd CHECK: done compiling" } END { print "3rd END: done running" }
当仅编译时,它产生:
% perl -c sto-INIT-eg 1st BEGIN: still compiling 2nd BEGIN: still compiling 2nd CHECK: done compiling 1st CHECK: done compiling sto-INIT-eg Syntax OK
当编译和执行时,它产生:
% perl sto-INIT-eg 1st BEGIN: still compiling 2nd BEGIN: still compiling 2nd CHECK: done compiling 1st CHECK: done compiling 1st INIT: started running 2nd INIT: started running PRINT: main running DIE: main dying 3rd END: done running 2nd END: done running 1st END: done running
而shell报告退出255,每个模具。
你应该能够安排连接发生在你需要的时候,即使BEGIN {}证明太早了。
嗯,只是记得。没有机会你在BEGIN {}中使用DATA做什么,是吗?这直到翻译运行才设置;它不对编译器开放。
C ++中extern“ C”的作用是什么?
将extern "C"
放入C ++代码到底能做什么?
例如:
extern "C" {
void foo();
}
#1楼
extern“ C”旨在由C ++编译器识别,并通知编译器所注明的功能已(或将要)以C样式进行编译。 这样,在链接时,它会链接到C中正确版本的函数。
#2楼
它通知C ++编译器在链接时以C样式查找这些函数的名称,因为在链接阶段,用C和C ++编译的函数的名称不同。
#3楼
它以一种可从C调用该函数的方式更改函数的链接。实际上,这意味着函数名称不会被修饰 。
#4楼
extern“ C”使C ++中的函数名称具有''C''链接(编译器不会更改名称),以便客户端C代码可以使用''C''兼容的头文件链接到(即使用)您的函数,该头文件仅包含函数的声明。 函数定义以二进制格式(由C ++编译器编译)包含,客户端“ C”链接器随后将使用“ C”名称链接至该二进制文件。
由于C ++具有重载的函数名,而C没有重载,因此C ++编译器不能仅使用函数名作为要链接的唯一ID,因此它通过添加有关自变量的信息来破坏名称。 AC编译器不需要处理名称,因为您不能在C中重载函数名称。当您声明函数在C ++中具有外部“ C”链接时,C ++编译器不会将参数/参数类型信息添加到用于连锁。
众所周知,您可以显式地为每个单独的声明/定义指定“ C”链接,也可以使用一个块对一系列声明/定义进行分组以具有一定的链接:
extern "C" void foo(int);
extern "C"
{
void g(char);
int i;
}
如果您关心技术方面的问题,它们会在C ++ 03标准的7.5节中列出,此处是一个简短的摘要(着重于外部“ C”):
- extern“ C”是一个链接规范
- 每个编译器都需要提供“ C”链接
- 链接规范应仅在命名空间范围内发生
-
所有函数类型,函数名称和变量名称都具有语言链接。请参阅Richard的注释:只有具有外部链接的函数名称和变量名称才具有语言链接。 - 即使语言相同,具有不同语言链接的两个函数类型也都是不同类型
- 链接规格嵌套,内部决定最终的链接
- 类成员忽略外部“ C”
- 最多一个具有特定名称的函数可以具有“ C”链接(无论名称空间如何)
-
extern“ C”强制函数具有外部链接(不能使其静态)请参见Richard的评论: ''extern“ C”''内部的''static''有效; 如此声明的实体具有内部链接,因此没有语言链接 - 从C ++到其他语言定义的对象以及从其他语言到C ++定义的对象的链接是实现定义的和语言相关的。 只有两种语言实现的对象布局策略足够相似时,才能实现这种链接
#5楼
在每个C ++程序中,所有非静态函数在二进制文件中均以符号表示。 这些符号是特殊的文本字符串,可唯一标识程序中的功能。
在C语言中,符号名称与函数名称相同。 这是可能的,因为在C中,没有两个非静态函数可以具有相同的名称。
由于C ++允许重载,并且具有C所不允许的许多功能(例如类,成员函数,异常规范),因此无法简单地将函数名用作符号名。 为了解决这个问题,C ++使用了所谓的名称修饰,将函数名称和所有必要的信息(例如参数的数量和大小)转换为一些仅由编译器和链接器处理的怪异字符串。
因此,如果将函数指定为extern C,则编译器不会对其进行名称修饰,并且可以使用其符号名作为函数名称直接对其进行访问。
这在使用dlsym()
和dlopen()
调用此类函数时非常方便。
C++ lambda 表达式在代码重用中的作用是什么?
lambda 表达式是一种轻量级函数对象,允许定义匿名函数,语法为:[capture-list] (parameter-list) -> return-type { body }。优点包括:简洁性、灵活性、代码重用性。实例如 findlargestevennumber() 函数可重写为 lambda 表达式,并用作比较函数。
C++ lambda 表达式:代码重用中的利器
简介
lambda 表达式是一种轻量级函数对象,允许在代码中定义匿名函数。它们因简洁性和灵活性而受到推崇,尤其是在代码重用场景中。
语法
lambda 表达式使用以下语法定义:
[capture-list] (parameter-list) -> return-type { body }
- capture-list:指定要捕获的变量。
- parameter-list:指定函数的参数。
- return-type:指定函数的返回类型(可选)。
- body:包含函数实现的代码块。
实战案例
假设我们有一个函数 findLargestEvenNumber(),用于从数组中查找最大的偶数。我们可以将其重写为 lambda 表达式:
立即学习“C++免费学习笔记(深入)”;
auto largestEvenNumber = [](const int* numbers, int size) { int maxEven = INT_MIN; for (int i = 0; i < size; i++) { if (numbers[i] % 2 == 0 && numbers[i] > maxEven) { maxEven = numbers[i]; } } return maxEven; }; int main() { int numbers[] = {1, 3, 5, 2, 4, 6}; int size = sizeof(numbers) / sizeof(numbers[0]); int result = largestEvenNumber(numbers, size); cout << "Largest even number: " << result << endl; }
在这个案例中,lambda 表达式 largestEvenNumber 被用作传递给 std::max_element 函数的比较函数。它捕获了 numbers 和 size 变量,并且仅接收 const int* 和 int 作为参数。
优点
lambda 表达式的优点包括:
- 简洁性:lambda 表达式可以简化代码,特别是在需要使用匿名函数时。
-
灵活性:lambda 表达式可以捕获周围
作用域中的变量,使其具有高度灵活性。 - 代码重用性:lambda 表达式可以存储在变量中或传递给其他函数,从而实现代码重用。
结论
C++ lambda 表达式为代码重用提供了强大的机制。它们的简洁性和灵活性使它们成为编写可维护且可重用的代码的宝贵工具。
以上就是C++ lambda 表达式在代码重用中的作用是什么?的详细内容,更多请关注php中文网其它相关文章!
今天关于“Flatten”在 Keras 中的作用是什么?和keras.flatten的分享就到这里,希望大家有所收获,若想了解更多关于altKey Mouse Event在JavaScript中的作用是什么?、BEGIN块在Perl中的作用是什么?、C ++中extern“ C”的作用是什么?、C++ lambda 表达式在代码重用中的作用是什么?等相关知识,可以在本站进行查询。
本文标签: