温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

tensorflow怎么配置

发布时间:2021-12-23 17:38:10 来源:亿速云 阅读:150 作者:iii 栏目:大数据

这篇文章主要介绍“tensorflow怎么配置”,在日常操作中,相信很多人在tensorflow怎么配置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”tensorflow怎么配置”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1.训练样本文件转换为集合
[]整个文件
[]每段话
[]分词,tag

2.将IOB模式标签转换为IOBES/B 开头,I 中间,E 结尾,S 单独,O 其他
B- => S-
I- => E-

3.创建字符和ID映射关系

当pkl文件不存在时
1)创建字符和ID映射字典
提取chars(所有词组)生成dico(词组加词频)倒序排列后生成char_to_id,id_to_char
2)同理创建标签和id的映射字典
提取tags(所有tag)生成dico(tag加频率)倒序排列后生成tag_to_id,id_to_tag,且写到tag_to_id.txt和id_to_tag.txt中
3)将映射关系存储到pkl文件中
(将映射关系对象obj序列化保存到文件中)
char_to_id,id_to_char,tag_to_id,id_to_tag

当pkl文件存在时
反序列化映射关系对象,将文件中的数据解析为char_to_id,id_to_char,tag_to_id,id_to_tag

4.将样本数据转为 单字符、对应的id、对应的分词转为(123)、对应的标签id 列表  train_data
data = []   data.append([string, chars, segs, tags])
string: 一段话中所有词组的list
chars: string中每个词在char_to_id字典中的id的list
segs:
    tmp = [2] * len(str(word))
    tmp[0] = 1
    tmp[-1] = 3
    seg_feature.extend(tmp)
    string通过segment分词后的word_list遍历word后得到的seg_feature(是个list:[0,0,0,1,2,3,1,2,2,2,3,0,0])
    
tags: string中每个tag在tag_to_id字典中的id的list

5.批量管理,将一批数据按批次大小拆分
train_manager: batch_data
               len_data
               
batch_data: list()  batch_data.append([strings, chars, segs, targets]) 

6.生成相关路径,生成配置文件
result_path,ckpt_path,config_file

7.tensorflow配置
设置步长
加载缓存

创建空模型:
通过checkpoint文件查找模型文件名
tf.global_variables_initializer()添加节点用于初始化所有的全局变量(GraphKeys.VARIABLES)。
返回一个初始化所有全局变量的操作(op),在构建完整个模型并在会话中加载模型后,运行这个节点。

设置使用CPU/GPU
设置训练次数
遍历乱序train_manager后的batch进行模型训练
step, batch_loss = model.run_step(sess, True, batch)
loss.append(batch_loss)

每20批次(步长steps_check)计算下剩余批次所需时间并打印日志(MSE表示了预测值与目标值之间差值
的平方和然后求平均 np.mean(loss)))

通过dev文件优化模型并保存
evaluate(sess, model, "dev", dev_manager, id_to_tag)

def evaluate(sess, model, name, data, id_to_tag): #logger = None
    logger.info("evaluate:{}".format(name))
    ner_results = model.evaluate(sess, data, id_to_tag)
    eval_lines = test_ner(ner_results, FLAGS.result_path)
    message = 'eval_lines value:{}'.format(eval_lines)
    # print(message)
    logger.info(message)
    f1 = float(eval_lines[1].strip().split()[-1])

    if name == "dev":
        best_test_f1 = model.best_dev_f1.eval()
        if f1 > best_test_f1:
            tf.assign(model.best_dev_f1, f1).eval()
            # print("new best dev f1 score:{:>.3f}".format(f1))
            logger.info("new best dev f1 score:{:>.3f}".format(f1))
        return f1 > best_test_f1
    elif name == "test":
        best_test_f1 = model.best_test_f1.eval()
        if f1 > best_test_f1:
            tf.assign(model.best_test_f1, f1).eval()
            # print("new best test f1 score:{:>.3f}".format(f1))
            logger.info("new best test f1 score:{:>.3f}".format(f1))
        return f1 > best_test_f1

def evaluate(self, sess, data_manager, id_to_tag):
    results = []
    trans = self.trans.eval()
    for batch in data_manager.iter_batch():
        strings = batch[0]
        tags = batch[-1]
        lengths, scores = self.run_step(sess, False, batch)
        batch_paths = self.decode(scores, lengths, trans)
        for i in range(len(strings)):
            result = []
            string = strings[i][:lengths[i]]
            gold = iobes_iob([id_to_tag[int(x)] for x in tags[i][:lengths[i]]])
            pred = iobes_iob([id_to_tag[int(x)] for x in batch_paths[i][:lengths[i]]])
            # gold = iob_iobes([id_to_tag[int(x)] for x in tags[i][:lengths[i]]])
            # pred = iob_iobes([id_to_tag[int(x)] for x in batch_paths[i][:lengths[i]]])
            for char, gold, pred in zip(string, gold, pred):
                result.append(" ".join([char, gold, pred]))
            results.append(result)
    return results

def test_ner(results, path):
    output_file = os.path.join(path, "ner_predict.utf8")
    with open(output_file, "w",encoding='utf8') as f:
        to_write = []
        for block in results:
            for line in block:
                to_write.append(line + "\n")
            to_write.append("\n")

        f.writelines(to_write)
    eval_lines = return_report(output_file)
    return eval_lines
            
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
标注实体识别 
1.加载config_file的配置参数、tensorflow参数、是否使用gpu
2.在指定路径下新建result_file、打开map_file文件读取char_to_id, id_to_char, tag_to_id, id_to_tag
3.将tf_config入参加载缓存
通过读取ckpt_path下的ckpt文件加载训练好的模型    
4. test_list = readText2Json("/data0/nlp/test/ner/test.txt") 将相应路径下的测试文件内容转换成dict

    strs = line.replace('\n','').split('\t')
    res = {}
    string = strs[0]
    res['string'] = string
    value_list = []
    wl = []
    tag_num = 0
    for str in strs[1:]:
        value = {}
        pos = find_last(str,':') //英国牛津大学:ORG
        word = str[:pos]    
        type = str[pos+1:]
        if not type == 'O':
            # print(type)
            tag_num += 1     //排除类型为O的计数
        value['word'] = word
        value['type'] = type
        value_list.append(value) //[{'type':'ORG','word':'英国牛津大学'}]
        wl.append(word)
    if len(value_list) == 0:
        continue
    res['value'] = value_list
    res['wl'] = wl
    res['tag_num'] = tag_num
    res_list.append(res) 

return res_list

5.遍历res_list
for tests in test_list:
    line = tests['string'].replace(' ', '').replace('\t', '').replace('\s', '')
    res_list = tests['value']

{'tag_num': 1, 
'wl': ['英国牛津大学', '出版社', '出版', '的', '多种', '英语词典', '的', '统称'], 
'value': [{'type': 'ORG', 'word': '英国牛津大学'}, {'type': 'O', 'word': '出版社'}, {'type': 'O', 'word': '出版'}, {'type': 'O', 'word': '的'}, {'type': 'O', 'word': '多种'}, {'type': 'O', 'word': '英语词典'}, {'type': 'O', 'word': '的'}, {'type': 'O', 'word': '统称'}], 
'string': '英国牛津大学出版社出版的多种英语词典的统称'}    

inputs = input_from_line(string, char_to_id, word_list=wl)            
将string进行全角符号转换为半角、html转码处理

inputs = list()
inputs.append([line])
inputs.append([[char_to_id[char] if char in char_to_id else char_to_id["<UNK>"]   //将line根据字典表转为id
                for char in line]])
inputs.append([get_seg_features(line, word_list=word_list)])          //将line进行get_seg_features 矩阵处理        
inputs.append([[]])            

6.进行模型训练得到训练结果result            
result = model.evaluate_line(sess, inputs, id_to_tag)            

def evaluate_line(self, sess, inputs, id_to_tag):
    trans = self.trans.eval(session=sess)
    lengths, scores = self.run_step(sess, False, inputs)
    batch_paths = self.decode(scores, lengths, trans)
    tags = [id_to_tag[idx] for idx in batch_paths[0]] //得到的id转为tag
    return result_to_json(inputs[0][0], tags)   //分词标注结果转换为json

entities = result['entities']            
[{'start': 0, 'end': 1, 'type': 'O', 'word': '英'}, {'start': 1, 'end': 6, 'type': 'ORGANIZATION', 'word': '国牛津大学'}, {'start': 6, 'end': 9, 'type': 'O', 'word': '出版社'}, {'start': 9, 'end': 11, 'type': 'O', 'word': '出版'}, {'start': 11, 'end': 12, 'type': 'O', 'word': '的'}, {'start': 12, 'end': 14, 'type': 'O', 'word': '多种'}, {'start': 14, 'end': 16, 'type': 'O', 'word': '英语'}, {'start': 16, 'end': 18, 'type': 'O', 'word': '词典'}, {'start': 18, 'end': 19, 'type': 'O', 'word': '的'}, {'start': 19, 'end': 21, 'type': 'O', 'word': '统称'}]            

7.遍历entities,排除掉type为O的数据,将标准答案 res_list 中的该下标的res的word、    type和识别结果 entities    中的type、word作为一行lin写入到result_file中。
  并统计正确结果的个数
-------------------------
for tests in test_list:
    test_acc += tag_num
-------------------------
  
for index, i in enumerate(entities):
    word = i['word']
    type = i['type']
    if index > len(res_list)-1:
        break
    # if type == 'O' and res_list[index]['type'] == 'O':
    #     continue
    if type == 'O':
        continue
    test_rec += 1
    lin = res_list[index]['word']+'\t'+res_list[index]['type']+'\t'+type+'\t'+word+'\n'
    start_in = 0
    end_in = -1
    if index > 5:
        start_in = index - 5
    if len(res_list) - index > 5:
        end_in = index + 5
    result_file.write(lin)
    for j in res_list[start_in:end_in]:
        if word == j['word'] and type == j['type']:
            test_right = test_right + 1
            break            

8.打印准确率、召回率等相关信息
zq = round(test_right / test_rec, 4) * 100
zh = round(test_right / test_acc, 4) * 100
f1 = round(2 * zq * zh / (zq + zh))
print('总标签数:{},识别标签数:{},识别对数量:{},准确率:{},召回率:{},f1:{}'.format(test_acc, test_rec, test_right, zq, zh, f1))

总标签数:8773,识别标签数:12260,识别对数量:3542,准确率:28.89,召回率:40.37,f1:34

test_acc:标准答案中所有排除other类型的标签个数
test_rec:通过模型实体识别后的结果中实际识别的非other类型标签的总数

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
分类模型训练:
1.准备post.xls、other.xls文件
train_datas = []
data = pd.read_excel(constant.clfytrain_path + '/{}'.format(file_name),  header=None)
将文件内容读取到train_datas中
将两个excel文件中的数据根据0轴(列)进行融合
pn = pd.concat(train_datas,  ignore_index=True)

到此,关于“tensorflow怎么配置”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI