我正在构建一个Tensorflow模型来对文本短语进行推理.为简单起见,假设我需要一个具有固定数量的输出类但输入中的可变长度文本的分类器.换句话说,我的迷你批次将是一系列短语,但并非所有短语都具有相同的长度.
data = ['hello',
'my name is Mark',
'What is your name?']
Run Code Online (Sandbox Code Playgroud)
我的第一个预处理步骤是在字典中构建一个包含所有可能单词的字典,并将每个单词映射到整数单词-Id.输入变为:
data = [[1],
[2, 3, 4, 5],
[6, 4, 7, 3]
Run Code Online (Sandbox Code Playgroud)
处理这种输入的最佳方法是什么?tf.placeholder()可以在同一批数据中处理可变大小的输入吗?或者我应该填充所有字符串,使它们都具有相同的长度,等于最长字符串的长度,使用一些占位符来删除单词?如果某些字符串比大多数其他字符串长得多,这似乎是非常低效的内存.
- 编辑 -
这是一个具体的例子.
当我知道我的数据点的大小(并且所有数据点具有相同的长度,例如.3)时,我通常使用类似的东西:
input = tf.placeholder(tf.int32, shape=(None, 3)
with tf.Session() as sess:
print(sess.run([...], feed_dict={input:[[1, 2, 3], [1, 2, 3]]}))
Run Code Online (Sandbox Code Playgroud)
其中占位符的第一个维度是小批量大小.
如果输入序列是不同长度的句子中的单词怎么办?
feed_dict={input:[[1, 2, 3], [1]]}
Run Code Online (Sandbox Code Playgroud) 我正在阅读有关动态内存分配和静态内存分配的内容,并找到了有关动态内存分配的内容:
在前面章节中看到的程序中,通过定义所需的变量,在程序执行之前确定所有内存需求.但是可能存在程序的内存需求只能在运行时确定的情况.例如,当需要的内存取决于用户输入.
所以我用C++编写了以下程序:
#include <iostream>
int main()
{
int n = 0;
int i = 0;
std::cout << "Enter size: ";
std::cin >> n;
int vector[n];
for (i=0; i<n; i++)
{
vector[i] = i;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个程序有效.我不明白它是如何工作的.什么时候确定尺寸?在这种情况下如何分配向量?
被迫将可变长度数组功能用于打印方阵的辅助函数,我将其定义如下:
void print_matrix(M, dim)
unsigned dim;
int M[dim][dim];
{
/* Print the matrix here. */
...
Run Code Online (Sandbox Code Playgroud)
好消息是,代码可以正常工作,并且其参数按照我希望的顺序排列。
dim坏消息是,我必须使用“旧式”函数声明语法才能引用的声明中尚未声明的参数M,这显然被认为是过时且危险的。
是否有一种直接的方法可以对“新式”函数声明执行相同的操作而不更改参数的顺序?(如果不是,在这种特殊情况下使用旧式语法是否可以接受?)
在我本科 C 编程课程的大部分时间里,我们学习了 C99,我们的讲师从不费心教我们 C99 和以前版本之间的主要区别。
我们最近被告知,我们可能会被要求在下一次考试期间使用 C89 实施解决方案。
我的问题是关于函数内部声明和使用的可变长度多维数组的使用。
在 C99 中,我可以有这样的功能:
void func(int cols, int mat[][cols], int rows);
Run Code Online (Sandbox Code Playgroud)
而在 C89 中,VLA 和类似的装置是不合法的。有人告诉我,您需要改用指向指针的指针。所以像:
void func(int **mat, int cols, int rows);
Run Code Online (Sandbox Code Playgroud)
但是,我在理解方面遇到了问题:
mat[i][j]吗?int **mat;吗?我认为您必须使用malloc(),但我很难弄清楚确切的声明语句。边问。仍然关于可变大小的矩阵,有人告诉我有这样的设置:
int rows, cols;
// get rows and cols from stdinput
int mat[rows][cols];
Run Code Online (Sandbox Code Playgroud)
由于程序堆栈上的分配,这不是创建具有给定维度的矩阵的最佳方法。什么是更好的方法?
谢谢!
我正在编写一个汇编程序,我希望能够执行以下(基本)操作:
x = 100;
y = int[x]
Run Code Online (Sandbox Code Playgroud)
例如,y 的大小取决于 x 的值。
注意:我在 64 位 Ubuntu 系统上使用 NASM 指令集。
在汇编中,我知道数组的大小需要在文件的数据部分中声明,例如
myvariable resq 1000
Run Code Online (Sandbox Code Playgroud)
问题是在我完成之前的计算之前我不知道它有多大。我真正想要的是这样的:
mov rax, 100
myvariable resq rax
Run Code Online (Sandbox Code Playgroud)
但这是不允许的吧?只是对汇编中的数组访问/声明有些困惑。
任何指示表示赞赏!
可以执行可变长度列,例如:
private int k[][] = new int[3][];
for(int i = 0; i < k.length; i++) {
k[i] = new int[i+1];
}
Run Code Online (Sandbox Code Playgroud)
我想知道如果您知道列的长度,是否可以进行可变长度的行?:
private int k[][] = new int[][5];
for(int i = 0; i < k.length; i++) {
// How would you do this?
}
Run Code Online (Sandbox Code Playgroud)
谢谢。
我很好奇这个:
有什么区别:
const int MAX_BUF = 1000;
char* Buffer = malloc(MAX_BUF);
Run Code Online (Sandbox Code Playgroud)
和:
char Buffer[MAX_BUF];
Run Code Online (Sandbox Code Playgroud) #include <iostream>
using namespace std;
void aa(int n) {
int test[n] = {0};
}
int main() {
aa(10);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并得到
error: variable-sized object may not be initialized
Run Code Online (Sandbox Code Playgroud)
但
#include <iostream>
using namespace std;
void aa(int n) {
int test[n];
fill(test,test+10,0);
}
int main() {
aa(10);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
还可以
我想知道为什么在前一个失败的情况下编译该文件的原因。
C 标准有这种语言:
6.5.3.4 sizeof 和 _Alignof 运算符
语义学
- 该
sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或带括号的类型名称。大小由操作数的类型确定。结果是一个整数。如果操作数的类型是变长数组类型,则对操作数求值;否则,不计算操作数并且结果是整型常量。
我不清楚标准的含义:如果操作数的类型是可变长度数组类型,则对操作数进行求值
sizeof(char[foo()])大小表达式中必须在运行时求值来计算大小,但标准的语言似乎没有涵盖这种情况(什么是类型名称的类型吗?)C 标准的语言是否应该修改以澄清?
下面是一个测试程序,用于说明 VLA 的某些特定情况下的行为:
#include <stdio.h>
static int N = 0;
int foo(void) { return ++N; }
int main() {
typedef char S[foo()]; // foo() is called
printf("typedef char S[foo()];\t"); printf("N=%d\n", N);
printf("sizeof(S)=%d\t\t", (int)sizeof(S)); printf("N=%d\n", N);
typedef char U[foo()]; // foo() is called
printf("typedef char U[foo()];\t"); printf("N=%d\n", N);
printf("sizeof(U)=%d\t\t", (int)sizeof(U)); printf("N=%d\n", N);
S s1;
printf("S s1;\t\t\t"); …Run Code Online (Sandbox Code Playgroud) c c99 expression-evaluation language-lawyer variable-length-array
我有接下来的两个代码示例:
const char *val = strchr(ch, ' ');
const int diff = (int)(val - ch);
char arr[diff];
Run Code Online (Sandbox Code Playgroud)
和
const char *val = strchr(ch, ' ');
const int diff = (int)(val - ch);
char arr[diff] = {0};
Run Code Online (Sandbox Code Playgroud)
第二个产生错误,如
错误:可变大小的对象可能未初始化
这是正确的错误,我明白它为什么会发生。
我想知道为什么第一个代码片段不会产生错误?
更新: 关于 sizeof(arr) 在第一个片段中也给出了数组的大小,但我认为 sizeof 是一个编译时运算符(?)