Tensorflow:无法以字节为单位获取元素。在模型训练中

时间:2018-09-15 14:30:27

标签: python pandas tensorflow machine-learning categorical-data

运行分类模型时,出现以下错误。

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))

获取由文本作为单词列表和标签作为整数组成的熊猫数据框。我还获得了文本中唯一词的列表。

有了这些数据,我便开始进行训练。 首先,我创建功能列:

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)

因此,我认为它与输入功能及其输入到模型的数据有关。但是我不知道实际上是什么错。

我尝试研究相关的tensorflow文件,但是在这里没有太多的见识。它实际上只是读取数据的功能。

有人知道我犯了什么样的错误吗?

0 个答案:

没有答案