Когда я запускаю свою классификационную модель, я получаю следующую ошибку.
tensorflow.python.framework.errors_impl.InternalError: Unable to get element as bytes.
Сам код в основном шаблонный материал, я использую классификацию Bag-Of-Words на своем собственном наборе данных. Сначала я обрабатываю данные из CSV-файла, используя:
def import_data(data_path):
data = pd.read_csv(data_path,encoding = 'utf-8')
data.drop('alert_number', axis=1, inplace=True)
data.drop('defect_desc', axis=1, inplace=True)
def to_series(cell):
#First we get rid of special chars
cell = re.sub(r'[\.\,\'\"\?\!\)\(]','',cell)
# get everythin in lowercase
cell = cell.lower()
#and split to list
cell = cell.split(' ')
return pd.Series(cell)
data['risk_desc'] = data['risk_desc'].map(to_series)
word_list = []
for element in data['risk_desc']:
word_list.extend(element)
risk_types = list(set([element.split(',')[0] for element in
pd.unique(data['risk_type'])]))
label_dictionary = dict((element,i) for i, element in
enumerate(risk_types))
data['risk_type'] = data['risk_type'].map(lambda element:label_dictionary[element.split(',')[0]])
return data, list(set(word_list))
Получение pandas dataframe, состоящего из текста в виде списка слов и метки в виде целого числа. Я также получаю список уникальных слов в тексте.
С этими данными я приступаю к тренировкам.
Сначала я создаю столбцы объектов:
def construct_feature_columns():
columns = []
categorical_column_names = []
numerical_column_names = []
for column in data.columns:
if(data[column].dtype == np.float64 or data[column].dtype == np.int64 or data[column].dtype == np.uint8):
numerical_column_names.append(column)
else:
categorical_column_names.append(column)
columns = [tf.feature_column.numeric_column(k) for k in numerical_column_names]
for column in categorical_column_names:
columns.append(tf.feature_column.embedding_column(tf.feature_column.categorical_column_with_vocabulary_list(column,vocabulary_list = vocabulary),dimension=8))
return columns
и функции ввода:
def input_fn_constructor(data):
#even_data = pd.DataFrame()
even_data = data.sample(frac=1)
training_data = even_data.iloc[int(len(even_data)/4):]
testing_data = even_data.iloc[0:int(len(even_data)/4)]
training_labels = training_data['risk_type'].to_frame()
testing_labels = testing_data['risk_type'].to_frame()
training_input_fn = tf.estimator.inputs.pandas_input_fn(training_data, training_data['risk_type'], num_epochs=None, shuffle=True)
testing_input_fn = tf.estimator.inputs.pandas_input_fn(testing_data, testing_data['risk_type'], shuffle=True)
return training_input_fn, testing_input_fn
Наконец, я запускаю модель и начинаю обучение, опять же, большая часть этого - шаблонные материалы из учебных пособий, просто настроенные для немного другой задачи.
optimizer = tf.train.AdamOptimizer()
model = tf.estimator.DNNClassifier(feature_columns=construct_feature_columns(),
hidden_units = [500,200],
n_classes=9,
model_dir='./model/',
optimizer = optimizer)
average_losses = []
for i in range(0, epochs):
model.train(input_fn=training_input_fn, steps=10)
evaluation = model.evaluate(input_fn=testing_input_fn, steps=10)
print(evaluation)
average_losses.append(evaluation['average_loss'])
Я получил исключение в этой строке:
model.train(input_fn=training_input_fn, steps=10)
Так что я предполагаю, что это как-то связано с функцией ввода и данными, которые он передает в модель. Но я понятия не имею, что на самом деле не так.
Я попытался просмотреть соответствующий файл tenorflow, но там нет особого понимания. Это буквально просто функция чтения данных.
Кто-нибудь знает, какую ошибку я совершил?