Bindsnet使用

Bindsnet是一个基于pytorch实现的用于搭建SNN的框架。

关于网络构建:

(1)首先初始化一个网络:

import torch
import matplotlib.pyplot as plt
from bindsnet.network import Network, nodes, topology, monitors
#初始化一个网络
network = Network(dt=1.0)

(2)定义层,以及层与层之间的连接(其中moitor用于记录网络运行过程中各层的电压和脉冲)

X = nodes.Input(100) #输入层
Y = nodes.LIFNodes(100) #LiF神经元层
C = topology.Connection(source=X, target=Y, w = torch.rand(X.n, Y.n)#这边的n就是X和Y的维度

(3)将上述组件添加进网络

network.add_layer(layer=X, name='X')
network.add_layer(layer=Y, name='Y')
network.add_connection(connection=C, source='X', target='Y')
network.add_monitor(monitor=M1, name='X')
network.add_monitor(monitor=M2, name='Y')

(4)构建输入,运行网络

data = 15 * torch.rand(100)#随机输入
train = encoding.poisson(datum=data, time=5000)#possion编码,时间长度为5000 
inputs = {'X' : train}
network.run(inputs=inputs, time=5000)#开始跑这个网络
spikes = {'X' : M1.get('s'), 'Y' : M2.get('s')}#得到输入层以及输出层的spike

 

 

对于BindsNet搭建的SNN的输入,与pytroch实现的ANN类似,但是在定义Dataset类时增加了输入样本和标签的脉冲编码(以手动下载MNIST数据集为例):

#定义函数用于加载原始数据
def load_data(data_folder, data_name, label_name):
    """
        data_folder: 文件目录
        data_name: 数据文件名
        label_name:标签数据文件名
    """
    with gzip.open(os.path.join(data_folder,label_name), 'rb') as lbpath: # rb表示的是读取二进制数据
        y_train = np.frombuffer(lbpath.read(), np.uint8, offset=8)
    with gzip.open(os.path.join(data_folder,data_name), 'rb') as imgpath:
        x_train = np.frombuffer(
            imgpath.read(), np.uint8, offset=16).reshape(len(y_train), 28, 28)
        return (x_train, y_train)

#定义可以加载脉冲序列的类
class MNIST_Encode_Dataset(Dataset):
    def __init__(self, folder, data_name, label_name,transform=None,image_encoder=None,label_encoder=None):
        (train_set, train_labels) = load_data(folder, data_name, label_name) # 其实也可以直接使用torch.load(),读取之后的结果为torch.Tensor形式
        self.train_set = train_set
        self.train_labels = train_labels
        self.transform = transform
        if image_encoder is None:
            image_encoder=NullEncoder()
        if label_encoder is None:
            label_encoder=NullEncoder()
        self.image_encoder=image_encoder
        self.label_encoder=label_encoder

    def __getitem__(self, index):
        image, label = self.train_set[index], int(self.train_labels[index])
        if self.transform is not None:
            image = self.transform(image)
        output = {
            "image": image,
            "label": label,
            "encoded_image": self.image_encoder(image),
            "encoded_label": self.label_encoder(label),
        }
        return output
    def __len__(self):
        return len(self.train_set)

encode_train = MNIST_Encode_Dataset('/MNIST', "train-images-idx3-ubyte.gz","train-labels-idx1-ubyte.gz",
transform=transforms.Compose([transforms.ToTensor(),transforms.Lambda(lambda x: x * intensity)]),image_encoder=PoissonEncoder(time=50, dt=1),label_encoder=None)

dataloader = torch.utils.data.DataLoader(
    encode_train, batch_size=batch_size, shuffle=True, num_workers=16, pin_memory=gpu
)

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
TensorFlow脉冲神经网络(Spiking Neural Networks,SNNs)是一种基于神经脉冲的新型深度学习模型。与传统的人工神经网络不同,SNNs将信息传递方式模拟为生物神经元之间通过突触传递电脉冲的机制。 SNNs的主要特点是在神经元之间使用离散的脉冲信号进行信息传递,并且这些脉冲信号在时间上是具有连续性的。脉冲的频率和时间间隔可以编码神经元之间的连接强度以及输入输出之间的关系,这使得SNNs具有更好的时间感知和时间编码能力。 在TensorFlow中,可以使用一些专门的库来构建和训练SNNs模型,如TensorFlow DeepLearning API(tf.keras)和BindsNET等。这些库提供了一些预定义的神经元模型和突触模型,同时也可以支持自定义模型的构建。 与传统的前向传播网络不同,SNNs在模型训练和推断时需要额外考虑时间的因素。在训练过程中,根据突触学习规则调整神经元之间的连接权重,以使得预测结果更加准确。在推断过程中,脉冲的传递通过时间间隔和神经元之间的连接权重来确定。 TensorFlow的SNNs模型可以应用于各种领域,如时间序列分析、事件驱动的任务和脑机接口等。通过模拟神经活动的方式,SNNs可以更好地处理具有时序关系的数据,并能够处理实时反馈和响应任务。 尽管TensorFlow脉冲神经网络在某些任务上具有优势,但其训练和推断过程相对复杂,对计算资源和时间要求较高。此外,与传统的深度学习模型相比,目前对于SNNs的优化和理论研究仍然处于初级阶段,需要进一步发展和探索。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

space_dandy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值