- 积分
- 9842
- 回帖
- 0
- 西莫币
-
- 贡献
-
- 威望
-
- 存款
-
- 阅读权限
- 75
- 最后登录
- 1970-1-1
签到天数: 103 天 连续签到: 1 天 [LV.6]常住居民II
|
发表于 2026-4-3 14:57
|
显示全部楼层
来自: 中国江西九江
事实上,我个人观点是,最终象人一样会学习,有思想,有情感的AI,象电影《终结者》中的“天网”会必然出现的。这与跑不过汽车可以驾驶汽车不是同一类比。
当然楼主不是这个意思,主要是我想多了,悲观了些。
至于我们的AI项目,已经在开始商业运作了。多谢关心。
下面粘一下类人脑神经系统的一个简单代码。其运行原理,和现在的AI方法完全不一样。这个原理模仿了人类婴幼儿成长的过程,没有梯度运算,方法是我提出的,代码是gemini写的。以我工科背景出身的人,都可以想到这个方法,那些专门研究AI的天才人物,更不知道研究有多深了。
所有人类能够想到的,都在一步一步实现。无论是神话传说,还是电影故事情节。。。。
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from brian2 import *
import gradio as gr
# 加载MNIST数据
(X_train, y_train), (X_test, y_test) = tf.keras.datasets.mnist.load_data()
X_train = X_train[:500] / 255.0 # 训练图像缩小为[0,1]
y_train = y_train[:500]
X_test = X_test[:100] / 255.0
y_test = y_test[:100]
# 设定参数
n_input = 784
n_neurons = 100
duration = 350 * ms
# 这段代码的作用是将一张二维的灰度图像(如 28×28 的 MNIST 图片)
# 转换为脉冲神经网络中使用的发放率(firing rates)向量,
# 供 Poisson 神经元组使用。
# 这行代码完成的是:
# 将图像像素值 → 转换为 PoissonGroup 所需的发放频率。#
# 每个像素值将被视作输入神经元的激活强度。#
# 越亮的像素(值接近 1)将被映射为较高的脉冲发放频率(接近 max_rate),暗的像素则发放频率低或为 0。
# 输出是一个长度为 784 的一维向量,值的单位为 Hz,可以直接用于 PoissonGroup 的 rates。
def encode_image(img, max_rate=100 * Hz):
return img.flatten() * max_rate
# 构建网络
# 这段代码定义了一个类脑脉冲神经网络(Spiking Neural Network, SNN)结构,
# 它由输入层、学习层、突触连接、自组织学习机制、联想记忆机制和监视器组成。
def build_network():
start_scope() #这是 Brian2 的函数,用于清空之前的网络模型和变量定义,确保每次构建都是“干净”的网络。
# 输入
# PG 是一个泊松输入神经元组(大小为n_input,通常为784),用于模拟视觉输入(如MNIST图像)。
# 每个神经元的发放是随机的泊松过程,其发放频率rates(t, i)是一个外部定义的函数,表示第i 个神经元在时间t的发放频率。
PG = PoissonGroup(n_input, rates='rates(t, i)')
# LIF学习神经元
# G 是一个Leaky Integrate-and-Fire 神经元组(大小为 n_neurons,如 100)
# 微分方程:
# dv/dt = (v_rest - v) / tau:膜电位随着时间衰减向静息电位靠拢(电荷泄漏模型)
# threshold='v > v_thresh':当膜电位超过阈值就触发脉冲
# reset='v = v_reset':触发后将膜电位重置
# method='exact':使用解析解提高模拟精度
eqs = '''dv/dt = (v_rest - v) / tau : volt'''
G = NeuronGroup(n_neurons, eqs, threshold='v>v_thresh', reset='v=v_reset', method='exact')
G.v = -65 * mV
# STDP突触模型(自组织学习)
# w:突触权重
# apre, apost:前后脉冲的“踪迹变量”(trace),用于实现脉冲时间依赖可塑性(STDP)
# 'event-driven':表示只有当事件(脉冲)发生时才更新,节省计算资源
syn_eqs = '''
w : 1
dapre/dt = -apre / tau_pre : 1 (event-driven)
dapost/dt = -apost / tau_post : 1 (event-driven)
'''
# 权重更新规则(STDP)
# on_pre:当前神经元发放时:
# 给目标神经元一个权重加权的电压脉冲
# 增加 apre 值(记录这次脉冲)
# 根据前次后脉冲 apost 更新权重(LTP)
# on_post:当目标神经元发放时:
# 增加 apost
# 根据 apre 更新权重(LTD)
# 这正是 Hebbian 学习:“前放后随则增强,后放前随则削弱”
#
on_pre = '''
v_post += w * mV
apre += A_pre
w = clip(w + apost, 0, 1)
'''
on_post = '''
apost += A_post
w = clip(w + apre, 0, 1)
'''
# 创建输入连接(PG → G)
# 创建突触对象 S,应用上述模型和规则
# connect(p=0.3):30% 稠密连接(稀疏随机连接)
# 初始权重设置为 0~0.2 随机值
S = Synapses(PG, G, model=syn_eqs, on_pre=on_pre, on_post=on_post)
S.connect(p=0.3)
S.w = 'rand() * 0.2'
# 内部兴奋性连接(形成细胞簇)
# G → G:在学习层神经元内部增加突触连接
# 作用:
# 模拟细胞簇(Cell Assembly):代表相同模式的神经元之间的互相连接
# 这种结构是联想记忆(pattern completion)的基础
# 同样采用 STDP 学习规则
R = Synapses(G, G, model=syn_eqs, on_pre=on_pre, on_post=on_post)
R.connect(condition='i != j', p=0.1)
R.w = 'rand() * 0.1'
# 抑制机制:防止所有神经元同时激活(WTA)
# 抑制连接,模拟侧向抑制(Lateral Inhibition)
# 当某个神经元放电时,抑制其余神经元(Winner-Take-All机制)
# 防止所有神经元学习相同的模式,提高分化能力
I = Synapses(G, G, on_pre='v_post -= 3*mV')
I.connect(condition='i != j', p=0.1)
# 监视器:记录神经元活动
# 记录 G 中所有神经元的发放时间和索引
# 用于之后生成 Spike Raster Plot 或用于分类评估等分析
spikes = SpikeMonitor(G)
return PG, G, S, R, spikes
# 定义输入编码函数
def make_rates_func(image):
vector = encode_image(image)
def rates(t, i):
return vector
return rates
# 训练过程
def train_network(PG, G, S, R, images):
for i in range(len(images)):
PG.rates = make_rates_func(images)
run(duration)
# 分类器:返回每张图像激活次数最多的神经元
def classify_images(PG, G, images, labels, spike_monitor):
pred, truth = [], []
for i in range(len(images)):
spike_monitor.active = True
PG.rates = make_rates_func(images)
run(duration)
spike_monitor.active = False
if len(spike_monitor.i):
hist = np.bincount(spike_monitor.i)
pred_label = np.argmax(hist)
pred.append(pred_label)
else:
pred.append(-1)
truth.append(labels)
spike_monitor.i[:] = [] # 清空
return pred, truth
# 可视化感受野
def plot_receptive_fields(S):
fig, axs = plt.subplots(10, 10, figsize=(10, 10))
for i, ax in enumerate(axs.flat):
if i >= n_neurons:
break
w = S.w[:, i].reshape((28, 28))
ax.imshow(w, cmap='gray')
ax.axis('off')
plt.tight_layout()
return fig
# 交互:上传图像后模拟大脑补全与分类
def simulate(image):
image = np.array(image) / 255.0
PG, G, S, R, spikes = build_network()
train_network(PG, G, S, R, X_train)
# 遮挡输入
test_image = image.copy()
test_image[:, 14:] = 0
PG.rates = make_rates_func(test_image)
spikes.active = True
run(duration)
# 可视化感受野
fig_rf = plot_receptive_fields(S)
# Spike Raster Plot
fig_raster = plt.figure(figsize=(10, 4))
plt.plot(spikes.t / ms, spikes.i, '.k')
plt.xlabel('Time (ms)')
plt.ylabel('Neuron Index')
plt.title('Spike Raster Plot')
# 预测结果
if len(spikes.i):
pred_label = np.argmax(np.bincount(spikes.i))
else:
pred_label = -1
return fig_rf, fig_raster, str(pred_label)
def predict_fn(image):
# 你的大脑补全 + 推理代码
return image # 示例:原图返回
# Gradio界面
# interface = gr.Interface(
# fn=predict_fn,
# inputs=gr.Image(shape=(28, 28), image_mode='L', label="上传遮挡图像(28x28)"),
# outputs=[
# gr.Plot(label="感受野 (Receptive Fields)"),
# gr.Plot(label="Spike Raster Plot"),
# gr.Textbox(label="预测类别(细胞簇响应结果)")
# ],
# title="类脑神经网络:感知 · 联想 · 补全",
# description="上传一个遮挡的MNIST图像,系统通过SNN完成自组织学习与记忆补全,并输出分类结果。"
# )
interface = gr.Interface(
fn=simulate,
inputs=gr.Image(
image_mode="L",
label="上传遮挡图像(28x28)",
sources=["upload"],
type="numpy"
),
outputs=[
gr.Plot(label="感受野 (Receptive Fields)"),
gr.Plot(label="Spike Raster Plot"),
gr.Textbox(label="预测类别(细胞簇响应结果)")
],
title="类脑神经网络:感知 · 联想 · 补全",
description="上传一个遮挡的MNIST图像,系统通过SNN完成自组织学习与记忆补全,并输出分类结果。"
)
interface.launch(
inbrowser=False,
prevent_thread_lock=False,
server_port=7861,
share=False,
show_error=True
)
|
|