python - TensorFlow:高效的非全连接层
问题描述
我正在尝试创建一个具有非完全连接层的神经网络。我一直在使用函数式 API,但即使在 MNIST 等简单问题上性能也很糟糕。我的问题是效率问题:我做得不好,我的方法不正确(也许功能 API 不是好方法),我错过了什么吗?
在我当前的代码中,我创建了一个输入层。
from tensorflow.keras.layers import Input, Lambda, Dense, concatenate
nInp=784 #sets the input size for MNIST 784
inp=Input(shape=(nInp,))
然后我设置了一个列表来存储我的隐藏层神经元和一个列表,其中神经元将从输入连接到隐藏层中的神经元。
n1=64 #sets the number of neurons in the hidden layer
h=[None for i in range(n1)] #initialize hidden layer storage
inpList=tf.constant([[0],[0]])
现在我们遇到了BIG SLOWDOWN发生的部分。在这个 for 循环中,我循环遍历每个隐藏层神经元,并随机分配从输入层到隐藏神经元的连接。
for j in range(n1):
flag=0
for i in range(nInp):
rand=random.randint(0,1)
if rand == 1:
if flag==0:
flag =1
inpList=Lambda(lambda x:x[:,i:i+1])(inp)
else:
inpList=tf.concat([inpList,Lambda(lambda x:x[:,i:i+1])(inp)],1)
h[j]=Dense(1, activation='relu')(inpList)
然后我将我的隐藏层神经元连接成一个单层并将其链接到一个输出层。
h_layer=concatenate(h)
out=Dense(10, activation='softmax')(h_layer)
model=Model(inp,out)
在这个模型上的训练速度非常慢。训练一个 784 ->64 ->10 网络需要 MNIST 数据每个 epoch 半个多小时。必须有更好的方法,因为内置的 Dropout 层应该执行类似的操作(但在每个训练周期随机设置连接),但执行时没有明显的时间损失。
谢谢
解决方案
推荐阅读
- angular - 如何知道子路由是否已经渲染(来自父组件)
- drupal-8 - 是否可以使用 .yaml 文件创建/管理角色?
- javascript - 量角器自定义定位器无法定位元素
- javascript - 为什么if语句会在while循环中阻塞?
- javascript - 如何使用从 Nodejs 中的 1 个函数返回的数组?
- javascript - 传递 axios 数据到视图模板
- bash - 将字符串添加到bash中的列
- xojo - 更改列表框单元格的背景颜色
- php - 在 PHP 中添加“插入”查询的位置
- python-3.x - 为什么写入文件二进制方法有时会返回一个字母和其他一个十六进制?