一个简单的网络,训练较慢

import numpy
import scipy.special

class NeuralNetWork:
    def __init__(self,inputnodes,hiddennodes,outputnodes,learningRate):
        self.input_nodes = inputnodes
        self.hidde_nodes = hiddennodes
        self.output_nodes = outputnodes
        self.lr=learningRate
        self.wih=numpy.random.rand(self.hidde_nodes,self.input_nodes)-0.5
        self.who=numpy.random.rand(self.output_nodes,self.hidde_nodes)-0.5

    def fit(self,input_list,targets_list):
        inputs=numpy.array(input_list,ndmin=2).T
        targets=numpy.array(targets_list,ndmin=2).T
        hidden_inputs=numpy.dot(self.wih,inputs)
        sigmoid=lambda x:scipy.special.expit(x)
        hidden_outputs=sigmoid(hidden_inputs)
        final_inputs=numpy.dot(self.who,hidden_outputs)
        final_outputs=sigmoid(final_inputs)
        output_errors = targets-final_outputs
        hidden_errors = numpy.dot(self.who.T,output_errors)
        self.who += self.lr*numpy.dot((output_errors*final_outputs*(1-final_outputs)),numpy.transpose(hidden_outputs))
        self.wih += self.lr*numpy.dot((hidden_errors*hidden_outputs*(1-hidden_outputs)),numpy.transpose(inputs))


    def evaluate(self,inputs):
        hidden_inputs=numpy.dot(self.wih,inputs)
        sigmoid=lambda x:scipy.special.expit(x)
        hidden_outputs=sigmoid(hidden_inputs)
        final_inputs=numpy.dot(self.who,hidden_outputs)
        final_outputs=sigmoid(final_inputs)
        print(final_outputs)
        pass


from keras.datasets import mnist
(train_images,train_labels),(test_images,test_labels)=mnist.load_data()
from keras.utils import to_categorical
train_images=train_images.reshape((60000,28*28))
train_images = train_images.astype('float32')/255
test_images=test_images.reshape((10000,28*28))
test_images = test_images.astype('float32')/255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

input_nodes=28*28
hidden_nodes=100
output_nodes=10
learning_rate=0.3
n=NeuralNetWork(input_nodes,hidden_nodes,output_nodes,learning_rate)
i=0
for train_image,train_label in zip(train_images,train_labels):
    n.fit(train_images,train_labels)
    print(i)
    i=i+1
#n.evaluate([1.0,0.5,-1.5])
scores=[]
for test_image,test_label in zip(test_images,test_labels):
    output = n.evaluate(test_image)
    evalueate_label=numpy.argmax(output)
    correct_label=numpy.argmax(test_label)
    if evalueate_label==correct_label:
        scores.append(1)
    else:
        scores.append(0)
scores_array=numpy.asarray(scores)
print("performance = ",scores_array.sum()/scores_array.size)


### 加速神经网络训练过程中数据读取速度的方法 为了提升神经网络训练期间的数据读取效率,可以从多个角度入手优化。当涉及到较小规模的数据集时,如仅有15组样本的情况,虽然整体训练时间较短[^1],但在更大更复杂的数据集中,高效的读取机制显得尤为重要。 #### 使用高效的数据加载器 采用多线程或多进程的方式进行数据预取能够显著减少等待时间。现代深度学习框架提供了内置工具支持这一功能。例如,在PyTorch中可以通过`DataLoader`类设置`num_workers`参数来指定用于并发处理的工作线程数: ```python from torch.utils.data import DataLoader, Dataset train_loader = DataLoader(dataset=custom_dataset, batch_size=batch_size, shuffle=True, num_workers=4) # 设置适当数量的工作线程 ``` #### 数据增强与预处理提前执行 对于图像或其他类型的输入数据,如果计划应用各种变换作为数据增强手段,则应考虑将这部分操作尽可能早地融入到管道当中,甚至是在创建最终版本之前就已完成。这有助于避免每次迭代都重复相同的操作,从而节省宝贵的时间资源。 #### 利用缓存技术 针对那些频繁使用的子集部分,可以预先加载至内存或者利用磁盘上的临时文件充当高速缓冲区。特别是当面对非常庞大的静态数据集合时,这种方法尤为有效。某些情况下也可以借助分布式文件系统实现跨节点共享访问。 #### 流水线化数据准备流程 通过构建合理的流水管线架构,可以在前向传播的同时准备好下一个批次的数据,进而达到无缝衔接的效果。这种做法不仅提高了吞吐率还降低了延迟现象的发生几率。正如提到过的那样,流水线训练能够在预处理和评估阶段对输入数据进行加速,同时还能节约内存空间,进一步促进训练速率的提升[^3]。 #### 并行计算环境下的注意事项 在多GPU环境下实施数据并行策略时要注意保持各设备间的一致性和同步性。确保每个参与运算单元接收到完全一致的信息副本,并适时调整彼此间的通讯模式以降低潜在开销[^5]。 综上所述,通过对上述几个方面的综合考量与实践探索,有望大幅改善神经网络训练环节中存在的数据读写瓶颈问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值