利用队列实现多个CSV文件读取,实现深度学习网络训练

本文介绍了一种使用自动编码器进行特征学习的方法,并结合softmax分类器实现对数据集的有效分类。通过TensorFlow构建模型,对大规模数据进行预处理和批处理,实现了高效的训练过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 代码主要利用队列随机读取文件中的样本数据,进行自动编码器的训练。总觉得,代码哪个地方不对,那有没有大佬给指点一下,代码如下:
    # coding=utf-8
    '''
    Created on 2016年12月3日
    @author: chunsoft
    '''
    import tensorflow as tf
    import numpy as np
    import os
    import pandas as pd
    # 参数
    learning_rate = 0.01  # 学习速率
    training_epochs = 50000  # 训练批次
    batch_size = 10000  # 随机选择训练数据大小
    display_step = 200  # 展示步骤
    
    # 网络参数
    # 我这里采用了三层编码,实际针对mnist数据,隐层两层,分别为256,128效果最好
    n_hidden_1 = 30  # 第一隐层神经元数量
    n_hidden_2 = 15  # 第二
    n_hidden_3 = 10  # 第三
    n_input = 15  # 输入
    classes = 3
    
    # tf Graph输入
    # 权重初始化
    weights = {
        'encoder_h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),
        'encoder_h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
        'encoder_h3': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_3])),
        'decoder_h1': tf.Variable(tf.random_normal([n_hidden_3, n_hidden_2])),
        'decoder_h2': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_1])),
        'decoder_h3': tf.Variable(tf.random_normal([n_hidden_1, n_input])),
        'soft_w': tf.Variable(tf.truncated_normal([n_hidden_3, classes]))
    }
    
    # 偏置值初始化
    biases = {
        'encoder_b1': tf.Variable(tf.random_normal([n_hidden_1])),
        'encoder_b2': tf.Variable(tf.random_normal([n_hidden_2])),
        'encoder_b3': tf.Variable(tf.random_normal([n_hidden_3])),
        'decoder_b1': tf.Variable(tf.random_normal([n_hidden_2])),
        'decoder_b2': tf.Variable(tf.random_normal([n_hidden_1])),
        'decoder_b3': tf.Variable(tf.random_normal([n_input])),
        'soft_b': tf.Variable(tf.constant(0.0, shape=[classes])),
    }
    
    
    # 开始编码
    def encoder(x):
        # sigmoid激活函数,layer = x*weights['encoder_h1']+biases['encoder_b1']
        layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['encoder_h1']),
                                       biases['encoder_b1']))
        layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['encoder_h2']),
                                       biases['encoder_b2']))
        layer_3 = tf.nn.sigmoid(tf.add(tf.matmul(layer_2, weights['encoder_h3']),
                                       biases['encoder_b3']))
        return layer_3
    
    
    # 开始解码
    def decoder(x):
        # sigmoid激活函数,layer = x*weights['decoder_h1']+biases['decoder_b1']
        layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['decoder_h1']),
                                       biases['decoder_b1']))
        layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['decoder_h2']),
                                       biases['decoder_b2']))
        layer_3 = tf.nn.sigmoid(tf.add(tf.matmul(layer_2, weights['decoder_h3']),
                                       biases['decoder_b3']))
        return layer_3
    
    
    def sample_split(X, Y):
        size_sample = Y.shape[0]
        # np.random.shuffle(int(size_sample))   # shuffle 没有返回值
        index = np.random.permutation(size_sample)
        return X[index[0:int(size_sample/2)], :], X[index[int(size_sample/2)+1:-1], :], \
               Y[index[0:int(size_sample/2)], :], Y[index[int(size_sample/2)+1:-1], :]
    
    
    def csvfile( filelist, batch_size ):
        file_queue = tf.train.string_input_producer(filelist)
        reader = tf.TextLineReader()
        # 每次read的执行都会从文件中读取一行内容, decode_csv 操作会解析这一行内容并将其转为张量列表
        key, value = reader.read(file_queue)
        records = list([1.0] for i in range(16))
        out = tf.decode_csv(value, record_defaults=records)
    
        sample = tf.train.shuffle_batch([out], batch_size=batch_size, capacity=200, min_after_dequeue=100, num_threads=2)
        sample_batch = sample[:, 1:]
        label_batch = sample[:, 0]
        label_batch = tf.one_hot(tf.cast(label_batch, tf.int32), 3, 1, 0)
        return sample_batch, label_batch
    
    
    # 导入数据
    # 生成一个先入先出队列和一个QueueRunner,生成文件名队列
    filenames = os.listdir("/home/ubuntian18/Desktop/Data/all_r")
    file_name = "/home/ubuntian18/Desktop/Data/all_r"
    filelist = [os.path.join(file_name, line) for line in filenames]
    print(filelist)
    sample_batch, lable_batch = csvfile(filelist, batch_size)
    
    
    # 导入测试数据
    with open(r'/home/ubuntian18/Desktop/Data/test_data/test_data.csv') as f:
        test_data = pd.read_csv(f)
    
    test_data = np.array(test_data)
    test_x = test_data[:, 1:]
    test_y = test_data[:, 0].astype(np.int16)
    test_y = np.eye(np.max(test_y))[test_y-1]   # 重新排序
    
    # 构造模型
    print(sample_batch.shape)
    encoder_op = encoder(sample_batch)
    encoder_result = encoder_op
    decoder_op = decoder(encoder_op)
    
    # 预测
    x_pred = decoder_op
    # 实际输入数据当作标签
    x_true = sample_batch
    
    # 定义代价函数和优化器,最小化平方误差,这里可以根据实际修改误差模型
    cost = tf.reduce_mean(tf.pow(x_true - x_pred, 2))
    optimizer = tf.train.RMSPropOptimizer(learning_rate).minimize(cost)
    print(weights['soft_w'].get_shape().as_list())
    print(encoder_op.shape, '&'*10)
    # 进行softmax分类
    soft_out = tf.nn.softmax(tf.matmul(encoder_op, weights['soft_w']) + biases['soft_b'])
    
    lable_batch = tf.cast(lable_batch, tf.float32)
    print(lable_batch)
    print(soft_out)
    loss = tf.reduce_mean(-tf.reduce_sum(lable_batch * tf.log(soft_out), reduction_indices=[1]))
    opt_loss = tf.train.AdamOptimizer(1e-4).minimize(loss)
    
    # 计算精度
    correct_prediction = tf.equal(tf.argmax(soft_out, 1), tf.argmax(lable_batch, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    
    
    # 初始化变量
    init = tf.global_variables_initializer()
    
    # 运行Graph
    with tf.Session() as sess:
        sess.run(init)
    
        coord = tf.train.Coordinator()  # 创建一个协调器,管理线程
        threads = tf.train.start_queue_runners(coord=coord)  # 启动QueueRunner, 此时文件名队列已经进队。
    
        # 预训练
        print("*"*10)
        for epoch in range(training_epochs//1000):
            _, c = sess.run([optimizer, cost])
            # 展示每次训练结果
            if epoch % display_step == 0:
                print("Epoch:", '%04d' % (epoch + 1),
                      "cost=", "{:.9f}".format(c))
        print("Optimization Finished!")
        # 优化训练
        for epoch in range(training_epochs):
            _, c = sess.run([opt_loss, loss])
            # 展示每次训练结果
            if epoch % display_step == 0:
                print("Epoch:", '%04d' % (epoch + 1),
                      "cost=", "{:.9f}".format(c))
                print("训练精度:", sess.run(accuracy))
                sample_batch, lable_batch = test_x, test_y
                print("测试精度:", sess.run(accuracy))
        print("Optimization Finished!")
        # Applying encode and decode over test set
        coord.request_stop()
        coord.join(threads)
    
    

     

<think>好的,用户现在的问题是关于如何在Windows上批量连接多个Linux服务器。之前他们询问过如何定时从Linux获取文件并处理,现在扩展到了多台服务器的情况。我需要先理解他们的具体需求。 首先,用户可能需要同时管理多台Linux服务器,执行相同的任务,比如批量部署、监控或收集数据。他们之前用Python和Paramiko库处理单台服务器,现在需要扩展到多台。可能的场景包括自动化运维、日志收集或分布式任务处理。 接下来,我需要考虑不同的方法来实现批量连接。常见的方法有使用SSH客户端工具如PuTTY的批量脚本,或者用Python的Paramiko库多线程处理。此外,像Ansible这样的自动化工具可能更适合,但用户可能更倾向于编程解决方案,因为他们之前用了Python。 用户可能对安全性有要求,比如使用密钥认证而不是密码。之前的回复中提到了密钥的使用,这里需要再次强调。另外,他们可能需要处理多个服务器的不同配置,比如不同的IP、用户名或密钥。 还需要考虑效率和稳定性。多线程或异步IO可以提高连接多台服务器的速度。错误处理也很重要,比如某台服务器连接失败时不应影响其他服务器。日志记录和结果汇总也是用户可能需要的功能。 用户可能没有提到但需要考虑的是如何管理服务器列表,可能是通过配置文件或数据库。此外,是否需要在Windows上长期运行这个批量连接的任务,比如作为定时任务,这也需要指导。 最后,根据用户之前接受的Python方案,提供一个基于Paramiko的多线程示例会比较合适。同时,简要介绍其他方法如Ansible,让用户有更多选择。需要确保代码示例清晰,包含必要的注释,并提到安全最佳实践,比如使用密钥和避免硬编码密码。</think>以下是基于 **Python 多线程/异步方案** 的完整实现方法,支持 Windows 批量连接多台 Linux 服务器并执行统一或定制化操作: --- ### 一、技术选型对比 | 方法 | 优点 | 缺点 | 适用场景 | |---------------------|-------------------------------|---------------------------|--------------------------| | **Python Paramiko 多线程** | 灵活控制、可定制逻辑 | 需自行处理并发和错误 | 复杂操作/需深度定制 | | **Ansible** | 标准化、内置模块丰富 | 需学习 YAML 语法 | 标准化运维任务 | | **Batch脚本+Plink** | 无需编程 | 功能受限、安全性差 | 简单命令快速执行 | | **异步SSH库(asyncssh)** | 高性能、资源占用低 | 需理解异步编程 | 大规模服务器集群 | --- ### 二、Python 多线程方案实现(推荐) #### 1. 环境准备 ```bash pip install paramiko pandas # 安装必要库 ``` #### 2. 服务器清单文件 `servers.csv` ```csv hostname,username,port,key_path,role 192.168.1.101,admin,22,/keys/server1.pem,web 192.168.1.102,ubuntu,2222,/keys/server2.key,db 10.0.0.15,root,22,D:\ssh\backup_key.ppk,backup ``` #### 3. 核心代码 ```python import paramiko import pandas as pd from queue import Queue from threading import Thread import logging # 配置日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s [%(levelname)s] %(message)s', handlers=[logging.FileHandler('ssh_batch.log'), logging.StreamHandler()] ) class SSHWorker(Thread): def __init__(self, task_queue): Thread.__init__(self) self.task_queue = task_queue def run(self): while True: server = self.task_queue.get() if server is None: break try: self.connect_and_execute(server) except Exception as e: logging.error(f"{server['hostname']} 连接失败: {str(e)}") finally: self.task_queue.task_done() def connect_and_execute(self, server): # 创建SSH客户端 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 密钥认证 key = paramiko.RSAKey.from_private_key_file(server['key_path']) ssh.connect( hostname=server['hostname'], username=server['username'], pkey=key, port=server['port'], timeout=10 ) # 示例操作:获取磁盘使用情况 stdin, stdout, stderr = ssh.exec_command('df -h') output = stdout.read().decode() # 记录结果 logging.info(f"\n=== {server['hostname']} ({server['role']}) ===\n{output}") # 关闭连接 ssh.close() if __name__ == "__main__": # 读取服务器清单 servers = pd.read_csv("servers.csv").to_dict('records') # 创建任务队列 task_queue = Queue() for server in servers: task_queue.put(server) # 启动工作线程(建议4-8个) threads = [] for _ in range(4): worker = SSHWorker(task_queue) worker.start() threads.append(worker) # 等待所有任务完成 task_queue.join() # 停止工作线程 for _ in range(4): task_queue.put(None) for t in threads: t.join() ``` --- ### 三、关键功能扩展 #### 1. 执行不同角色的差异化命令 ```python # 在 SSHWorker 类中添加 def get_role_command(self, role): command_map = { 'web': 'systemctl status nginx', 'db': 'mysql -e "SHOW PROCESSLIST;"', 'backup': 'ls -l /backups' } return command_map.get(role, 'hostname') # 默认命令 ``` #### 2. 结果收集与分析 ```python # 添加全局结果队列 result_queue = Queue() # 修改执行方法 def connect_and_execute(self, server): # ...连接代码... result = { 'host': server['hostname'], 'output': output, 'status': 'success' if not stderr else 'error' } result_queue.put(result) ``` --- ### 四、安全增强措施 #### 1. 加密存储凭据 使用 `python-keyring` 库管理密钥密码: ```python import keyring # 存储 keyring.set_password('ssh_batch', 'server101', 'key_password') # 读取 password = keyring.get_password('ssh_batch', 'server101') ``` #### 2. 连接审计日志 在 Linux 服务器端配置 `/etc/ssh/sshd_config`: ```bash # 启用详细日志 LogLevel VERBOSE # 记录用户命令 PrintMotd yes ``` --- ### 五、替代方案实现 #### 方案A:使用 Ansible 1. **安装**:通过 `Windows Subsystem for Linux (WSL)` 安装 2. **清单文件** `hosts.ini`: ```ini [web] 192.168.1.101 ansible_user=admin ansible_ssh_private_key_file=/keys/server1.pem [db] 192.168.1.102 ansible_user=ubuntu ansible_port=2222 ``` 3. **执行命令**: ```bash ansible all -i hosts.ini -m ping ansible web -m shell -a "systemctl restart nginx" ``` #### 方案B:PowerShell 脚本 ```powershell $servers = @( @{Host="192.168.1.101"; User="admin"; Key="C:\keys\server1.ppk"}, @{Host="10.0.0.15"; User="root"; Key="D:\ssh\backup_key.ppk"} ) foreach ($server in $servers) { $session = New-PSSession -HostName $server.Host -UserName $server.User -KeyFilePath $server.Key Invoke-Command -Session $session -ScriptBlock { Get-Process } Remove-PSSession $session } ``` --- ### 六、性能优化建议 1. **连接池技术**:对高频操作服务器保持长连接 2. **异步IO**:使用 `asyncssh` 库提升吞吐量 ```python import asyncssh async def run_command(host): async with asyncssh.connect(host) as conn: return await conn.run('uptime') ``` 3. **结果缓存**:对只读命令使用 `redis` 缓存结果 --- ### 七、故障排查指南 | 现象 | 诊断命令 | 解决方案 | |-----------------------|------------------------------|---------------------------| | 连接超时 | `telnet 主机 22` | 检查防火墙/安全组规则 | | 认证失败 | `ssh -v user@host` | 验证密钥权限(chmod 600) | | 命令无响应 | `strace -f sshd` (Linux端) | 检查服务器资源使用情况 | | 中文乱码 | `locale` (Linux端) | 统一字符集为 UTF-8 | --- 根据实际需求选择方案,**Python 多线程方案适合需要深度定制的场景**,而 **Ansible 更适合标准化运维**。建议从 10 台以下服务器开始测试,逐步优化并发参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Op_chaos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值