Initializing keras.preprocessing.text.Tokenizer
without any arguments results in a MemoryError
. This appears to be because the variable nb_words
is not set. Setting this to 1000 in the constructor fixes this issue. Suggested fix: if nb_words
is not set using an argument it should have a sensible default.
See the script below for an example.
import io import json import keras from keras.preprocessing import text SOURCE_FILE = "/tmp/reddit_titles" with open(SOURCE_FILE, "r") as f: data = json.load(f) data = [d.encode('ascii') for d in data] tk = text.Tokenizer() # Change this to fix: tk = text.Tokenizer(nb_words=1000) tk.fit_on_texts(data) tfidf = tk.texts_to_matrix(data, mode="tfidf")
Traceback (most recent call last):
File "bug.py", line 13, in <module>
tfidf = tk.texts_to_matrix(data, mode="tfidf")
File "/home/sumanas/Documents/python/keras/local/lib/python2.7/site-packages/Keras-1.0.7-py2.7.egg/keras/preprocessing/text.py", line 167, in texts_to_matrix
return self.sequences_to_matrix(sequences, mode=mode)
File "/home/sumanas/Documents/python/keras/local/lib/python2.7/site-packages/Keras-1.0.7-py2.7.egg/keras/preprocessing/text.py", line 191, in sequences_to_matrix
X = np.zeros((len(sequences), nb_words))
MemoryError
Ваше предложение result = result
не будет работать, потому что это параметр out
— он определенно не назначен для начала, поэтому вы не можете прочитать его значение, пока не присвоите ему значение.
result = null;
— это, безусловно, правильный путь для параметра object
out. В основном используйте default(T)
для любого типа T
, который у вас есть. (Оператор default
полезен в общих методах — для не общего кода я обычно использовал бы null
, 0, что угодно.)
РЕДАКТИРОВАНИЕ: на основании комментария Бориса, возможно, стоит остановиться на различии между параметром ref
и параметром out
:
Параметры вывода
- Не обязательно назначаться вызывающим абонентом
- В начале метода рассматриваются как «не определенно назначенные» (вы не можете прочитать значение, не назначая его сначала, точно так же, как локальная переменная)
- Должно быть определенно назначено (методом) до того, как метод завершится нормально (т.е. до его возвращения, он может выдать исключение без присвоения значения параметру)
Параметры параметров
- Должно быть определенно назначено вызывающим абонентом
- В начале метода рассматриваются как «определенно назначенные» (поэтому вы можете прочитать значение без его назначения в первую очередь)
- Не нужно назначать внутри метода (т.е. вы можете оставить параметр с его исходным значением)
Столбец первичного ключа часто устанавливается на автоматическое увеличение при построении базы данных SQL Server. Для этого устанавливается ограничение IDENTITY для столбца первичного ключа. Начальная позиция и шаг приращения передаются в столбец IDENTITY в качестве параметров. Затем всякий раз, когда добавляется новая запись и для вставки идентификатора установлено значение OFF, значение столбца IDENTITY увеличивается на заранее определенный шаг, обычно это число. Более того, для свойства IDENTITY INSERT установлено значение ON только для одной таблицы в одном сеансе.
В этой статье мы обсудим ошибку «Невозможно вставить явное значение для столбца идентификаторов в таблице.
когда для IDENTITY_INSERT установлено значение OFF »
как показано ниже.
Ошибка возникает, когда пользователь установил «identity_insert» в «OFF». Затем пытается явно вставить данные в столбец первичного ключа таблицы. Это можно пояснить на примере ниже.
Создание базы данных и таблиц:
Сначала создайте базу данных с именем «appuals».
Создайте таблицу с именем «человек», используя следующий код. Построенная таблица с использованием «ОСНОВНАЯ КЛЮЧЕВАЯ ИДЕНТИЧНОСТЬ»
СОЗДАТЬ ТАБЛИЦУ человека (ID INT IDENTITY (1, 1), first_name VARCHAR (MAX), last_name VARCHAR (MAX))
Синтаксис для установки «identity_insert off | на»:
В «Выключить identity_insert | на» поможет нам устранить эту ошибку. Правильный синтаксис этого оператора приведен ниже.
УСТАНОВИТЬ IDENTITY_INSERT . .
Тогда как первый аргумент — имя базы данных, в которой находится таблица. Второй аргумент показывает схему, к которой принадлежит эта таблица, значение идентификатора которой должно быть установлено на НА или ВЫКЛ.. Третий аргумент
НА — это таблица со столбцом идентификаторов.
Существует два основных способа безошибочной вставки данных в таблицу. Они считаются решением этой ошибки и обсуждаются ниже.
Ошибка 1: установите identity_insert в OFF
В первом случае мы вставим данные в таблицу с «ВСТАВКА ИДЕНТИЧНОСТИ» установлен в «ВЫКЛ.». Итак, если идентификатор присутствует в инструкции INSERT, вы получите сообщение об ошибке «Невозможно вставить явное значение для столбца идентификаторов в таблицу« person », когда для IDENTITY_INSERT установлено значение OFF».
Выполните следующий код на вкладке запроса.
выключить identity_insert человека; вставить в значения person (ID, first_name, last_name) (3, ’Sadia’, ’Majeed’), (4, ’Michel’, ’Ronald’)
Результат будет таким.
Решение:
При повороте «ИДЕНТИЧНОСТЬ ВСТАВИТЬ», то «ИД ПЕРВИЧНОГО КЛЮЧА» НЕ ДОЛЖЕН ПРИСУТСТВОВАТЬ в инструкции вставки
Теперь выполните следующий код на вкладке запроса
выключить identity_insert человека; вставить в значения person (first_name, last_name) (‘Sadia’, ‘Majeed’), (‘Michel’, ‘Ronald’)
Это безошибочно вставит данные в таблицу. Более того, ПЕРВИЧНЫЙ КЛЮЧ ID не требуется вводить пользователем, скорее, он автоматически добавит уникальное значение ID, как показано на рисунке ниже.
Ошибка 2: установите identity_insert в положение ON
Во втором случае мы вставим данные в таблицу с «ВСТАВКА ИДЕНТИЧНОСТИ» установлен в «НА». Итак, если идентификатор отсутствует в инструкции INSERT, вы получите сообщение об ошибке «Msg 545, уровень 16, состояние 1, строка 17. Явное значение должно быть указано для столбца идентификаторов в таблице« person », когда для IDENTITY_INSERT установлено значение ON, или когда пользователь репликации вставляет данные в столбец идентификаторов NOT FOR REPLICATION».
Решение:
При повороте «ИДЕНТИФИКАЦИОННАЯ ВСТАВКА» в «ОСНОВНОЙ КЛЮЧ МНЕ БЫ» должен присутствовать в операторе вставки.
Выполните следующий код на вкладке запроса
установить identity_insert человека; вставить в значения person (ID, first_name, last_name) (5, ’Jack’, ’black’), (6, ’john’, ’Wicky’)
Это безошибочно вставит данные в таблицу. Таким образом ПЕРВИЧНЫЙ КЛЮЧ ID явно требуется для вставки пользователем. Кроме того, он не будет автоматически добавлять значение уникального идентификатора, как показано на рисунке ниже.
Если ты «ВКЛЮЧИТЬ ВСТАВКУ ИДЕНТИЧНОСТИ ”, он будет оставаться включенным в течение всего сеанса. Таким образом, вы можете добавить столько записей, сколько захотите, как только это будет установлено. Это также относится только к сеансу, в котором он включен. Поэтому, если вы откроете другую вкладку запроса, вам нужно включить ее НА снова для этого окна запроса.
Я сталкиваюсь с ошибкой «Использование неинициализированного значения» при чтении файлов во вложенных циклах while. Я сократил свой код до минимума и удалил имена файлов / каталогов для конфиденциальности:
#/usr/bin/perl -w
use strict;
use warnings;
use diagnostics;
my $line_gene = undef;
my $gene_name = undef;
my $gene_chr = undef;
my $gene_pos = undef;
my $line_pval = undef;
my $chr = undef;
my $pos_start = undef;
my $pos_end = undef;
my $pos_mid = undef;
my $pval = undef;
open(IN_GENE,"somefile_gene") || die "Failed, genen";
open(IN_PVAL,"somefile_pval") || die "Failed, pvaln";
while ($line_gene = <IN_GENE>) {
chomp $line_gene;
($gene_name,$gene_chr,$gene_pos) = split(/t/,$line_gene);
while ($line_pval = <IN_PVAL>) {
chomp $line_pval;
($chr,$pos_start,$pos_end,undef,undef,$pval) = split(/t/,$line_pval);
$pos_mid = ($pos_start + $pos_end)/2;
if ($gene_chr == $chr) {
print $gene_chr."t".$chr."n";
}
}
seek IN_PVAL, 0, 0;
}
exit;
Когда я запускаю этот код, я получаю следующее сообщение об ошибке:
Use of uninitialized value $gene_chr in numeric eq (==) at Xtest.pl line 36,
<IN_PVAL> line 5772 (#1)
а затем следуя этим "Use of uninitialized value"
предупреждения — это правильные строки, выводимые на стандартный ввод:
6 6
1 1
20 20
... ...
Если я явно не делаю что-то не так, я не могу понять, почему он думает, что $gene_chr
неинициализирован. Также интересно то, что для каждой строки входного файла <IN_PVAL>
печатает выше "Use of uninitialized value"
предупреждение от строки 1 до строки 5772 (см. предупреждение выше), за исключением того, что этот файл содержит только 2886 строк, то есть ровно половину 5772.
Ни один входной файл (<IN_GENE>
а также <IN_PVAL>
) имеет пустые строки, либо в середине, либо в конце, и оба формата отформатированы, как и ожидалось, с правильным количеством полей, ни одно из которых не является пустым.
Любой совет будет принят во внимание. Спасибо!
2015-01-14 11:47
3
ответа
Решение
Если $gene_chr
не определено, то это означает, что для одной или нескольких строк somefile_gene
,
($gene_name,$gene_chr,$gene_pos) = split(/t/,$line_gene);
возвращается undef
как его второе значение (или возвращающее менее двух значений, что на самом деле одно и то же).
Я могу думать о двух способах, которыми это могло произойти:
1) Строка (и) не содержит вкладок, поэтому вся нерасщепленная строка помещается в $gene_name
, Это может произойти из-за строки, которая ошибочно использует пробелы вместо вкладок для разделения полей.
2) После первого значения строки (и) содержат две последовательные вкладки. Это может произойти из-за того, что кто-то пытается сделать поля более «привлекательными» для визуального представления, если $gene_name
значительно варьируется по длине.
Также интересно то, что для каждой строки входного файла он печатает вышеупомянутое предупреждение «Использование неинициализированного значения» из строки 1 в строку 5772 (см. Предупреждение выше), за исключением того, что в этом файле всего 2886 строк, то есть ровно половина из 5772.
Номер строки, который он показывает, является просто счетчиком того, сколько строк было прочитано из файла. С вами seek
вернуться к началу файла на каждом проходе, вместо того, чтобы закрывать и открывать его снова, счетчик никогда не будет сброшен.
Номера строк, идущие от 1 до (2 * количество строк в файле pval), указывают на то, что ваши ошибки в файле pval находятся в первых двух строках, которые будут считаться 1..2886 и 2887..5772, соответственно. Если ошибки были позже в файле, счетчик был бы выше.
Кроме того, в качестве общего совета, если строки в файле pval не являются слишком длинными, я бы серьезно задумался о том, возможно ли прочитать его содержимое один раз в хэш-ключ, включенный в $pval_chr
а затем заменить весь внутренний цикл
if (exists $pval_hash{$gene_chr}) { ... do stuff ... }
Если у вас есть несколько строк в файле гена, это значительно повысит производительность, так как не нужно будет перечитывать файл pval для каждой строки в файле гена.
user18914
14 янв ’15 в 14:33
2015-01-14 14:33
2015-01-14 14:33
Поскольку мне не о чем продолжать, это в основном образованные догадки. Однако, с некоторой обратной связью, я думаю, что мы можем получить где-нибудь. Я добавил это как ответ, так как чувствовал, что это слишком много информации для комментария.
Анализ
По-видимому, в какой-то момент из разделения не хватает полей, чтобы присвоить значение $gene_chr
, Вот почему он становится неинициализированным. Вот эта строка:
($gene_name,$gene_chr,$gene_pos) = split(/t/,$line_gene);
Это произойдет, если в строке вообще нет вкладок, иначе вы получите пустую строку, и ваша ошибка будет ""
не быть числовым в ==
, То есть:
Argument "" isn't numeric in numeric eq (==)
Так как ваши сообщения об ошибках содержат строки, в два раза превышающие максимальное количество строк во внутреннем файле цикла, я бы предположил, что ваши IN_GENE
Файл имеет только две строки данных. Кроме того, я бы предположил, что у него есть завершающая пустая строка, которую вы не заметили, и это является причиной ошибок. Это не полностью складывается, но стоит попробовать, если это решит вашу проблему.
Решение
Попробуйте добавить проверку, чтобы увидеть, есть ли у вас пустые строки. Что-то вроде:
...
while ($line_gene = <IN_GENE>) {
chomp $line_gene;
unless ($line_gene =~ /S/) { # unless the line contains non-whitespace
warn "Warning: Blank line in gene file";
next;
}
Это предупредит вас о пустых строках и пропустит их. Предупреждение (а также другие ошибки) отправляются в STDERR, что означает, что вы можете отделить их от стандартного вывода в STDOUT.
2015-01-14 14:33
«chr» является зарезервированным ключевым словом. Вы не должны использовать это для имени переменной, независимо от того, что это работает.
Вы должны добавить строку print Dumper($gene_chr,$chr,$line_pval);
после вашего раскола и use Data::Dumper;
на вершине. Он многое расскажет о ваших данных. Я полагаю, проблема может быть в ваших файлах данных.
Может также добавить exit if $. > 10
куда-нибудь выйти после 10 строк, прочитанных из файла, и облегчить отладку.
2015-01-14 12:36
У меня есть абстрактная сущность под названием Block
, которая содержит два атрибута: column
и order
(которые не являются необязательными), и одно отношение, thing
, где это деталь а 1-> М. У меня есть еще одна сущность, Whatever
, которая имеет Block
в качестве своего родителя и добавляет один атрибут, someNumber
.
Мой код выглядит так:
Whatever *block = (Whatever *)[NSEntityDescription insertNewObjectForEntityForName:@"Whatever" inManagedObjectContext:managedObjectContext];
block.order = 0;
block.column = 0;
block.thing = self.thing;
При попытке сохранить появляется такая ошибка:
Failed to save to data store: Operation could not be completed. (Cocoa error 1560.)
DetailedError: {
NSLocalizedDescription = "Operation could not be completed. (Cocoa error 1570.)";
NSValidationErrorKey = column;
NSValidationErrorObject = <Whatever: 0x5124890> (entity: someWhatever; id: 0x511b4e0 <x-coredata:///Whatever/t718B63A4-927B-4D88-A9E6-7F61CF9621675> ;
data: {
column = nil;
thing = 0x54367a0 <x-coredata://E6648244-E5FC-4202-B5F9-C7A91BACF8DA/Thing/p2>;
order = nil;
someNumber = 0;
});
Я не понимаю, почему там написано, что column
и order
равны nil
, поскольку я только что установил их в строке раньше, так что это не должно быть проблемой.
Я тоже пробовал использовать стиль [block setColumn:0]
, но безуспешно.
Любая помощь будет оценена. Благодарность!
2 ответа
Лучший ответ
Вы устанавливаете их на nil, поскольку nil — это просто значение нулевого или нулевого указателя.
Свойства Core Data должны быть установлены для объектов (в отличие от примитивных типов).
Целые числа и числа с плавающей запятой являются объектами NSNumber.
Мне нравится использовать удобные конструкторы numberWith *.
Например:
block.order = [NSNumber numberWithInteger:0];
block.column = [NSNumber numberWithInteger:0];
5
gerry3
7 Мар 2010 в 21:41
Чтобы расширить ответ gerry3, замечательный способ упростить кодирование с использованием Core Data — использовать mogenerator компании Rentzsch. Это позволит вам:
block.orderValue = 0;
block.columnValue = 0;
1
Tim Sullivan
16 Фев 2012 в 03:37