首页 > 解决方案 > 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 层应该执行类似的操作(但在每个训练周期随机设置连接),但执行时没有明显的时间损失。

谢谢

标签: pythontensorflowkeras

解决方案


推荐阅读