Tensorflow “如何修复”;“符号张量”;使用「;步骤“每个时代”;但不是",;批次“U尺寸”;在一个简单的conv2d&x2B;液态机网络

Tensorflow “如何修复”;“符号张量”;使用「;步骤“每个时代”;但不是",;批次“U尺寸”;在一个简单的conv2d&x2B;液态机网络,tensorflow,keras,Tensorflow,Keras,我正在制作一个简单的conv2d+动态库(一个自定义的循环层,具有随机/固定连接,只输出最后一个时间步节点状态)。储层写为lambda层,以实现代码中所示的简单方程。该模型可由Keras构建 我希望对模型进行训练,以对给定批量的一些图像序列进行分类。(例如,批次大小=2)因此,理想情况下,KERA应分配大小为2x3x8x1的批次,因为数据集的大小为10x3x8x1。时间分布的Conv2d层应返回2x3x6x3。后续自定义展平层应展平非时间维度并返回2x3x108。具有108个节点的储备层应返回2

我正在制作一个简单的conv2d+动态库(一个自定义的循环层,具有随机/固定连接,只输出最后一个时间步节点状态)。储层写为lambda层,以实现代码中所示的简单方程。该模型可由Keras构建

我希望对模型进行训练,以对给定批量的一些图像序列进行分类。(例如,批次大小=2)因此,理想情况下,KERA应分配大小为2x3x8x1的批次,因为数据集的大小为10x3x8x1。时间分布的Conv2d层应返回2x3x6x3。后续自定义展平层应展平非时间维度并返回2x3x108。具有108个节点的储备层应返回2x108。最后一个读出层应该返回2x5

导入keras
从keras.layers导入致密、卷积2D、活化、λ
从keras.layers.wrappers导入TimeDistributed
从keras.models导入顺序
从keras导入后端为K
导入tensorflow作为tf
将numpy作为np导入
#展平非时间维度
def展平步骤(x英寸):#输入形状(无,3,6,6,3),输出形状(无,3,108)
形状=K.形状(x_英寸)#张量形状
x_out=K.重塑(x_in,[shape[0],shape[1],K.prod(shape[1:]))
返回x_out
def展平步骤形状(x形状):
n_批次、n_步骤、n_行、n_列、n_过滤器=x_形状
输出_形状=(n_批次、n_步骤、n_行*n_列*n_过滤器)#展平
返回输出波形
#简单水库
#以单个批次为例,输入(尺寸3x108)到Reseriver中的108个节点有3个时间步。
#节点状态为stat_neuron(尺寸1x108)
#对于范围内的t(3)
#stat_neuron=stat_neuron*衰减系数+输入[t,:]+循环连接矩阵*stat_neuron
#结束
#该层有效地返回节点在最后一个时间步骤中的状态
def ag_储存器(x_英寸):#输入形状(无,3108),输出形状(无,108)
形状=K.形状(x_英寸)#张量形状
stat_neuron=K.zeros([shape[0],shape[2]])#初始化神经元状态
t_step=tf.常数(0)#初始化时间计数器,移位1
t_max=tf.减法(形状[1],tf.常数(1))#最大时间步长,移动1
x=x_英寸
def cond(t_步长,t_最大值,stat_神经元,x):
返回tf.less(t_步,t_最大值)
def主体(t_台阶、t_最大值、stat_神经元、x):
全局RC_矩阵,C_衰减#连接矩阵,衰减常数
temp=tf.标量_mul(C_衰减,stat_神经元)#stat_神经元*衰减系数
temp=tf.add(temp,x[:,t_step,:])#stat_neuron*衰减系数+输入[t,:]
temp=tf.add(temp,tf.einsum('ij,bj->bi',RC_矩阵,stat_神经元))#out[batch,i]=sum_j RC_矩阵[i,j]*stat_神经元[batch,j]
返回[tf.添加(t_步骤,1),t_最大值,温度,x]
res=tf.while\u循环(条件,身体,[t\u步进,t\u最大,stat\u神经元,x])
返回res[2]
def ag_储液罐形状(x_形状):
在批处理中,在步骤中,在节点中=x形状
输出\u形状=(在\u批中,在\u节点中)
返回输出波形
#%%参数
n_样本=10;#样本数量;
n_tstep=3;#每个样本的时间步数
n_行=8;#每帧的行数
n_col=8;#每帧的列数
n_通道=1;#频道数
RC_矩阵=K.random_normal([108,108])#储备层节点循环连接矩阵,注意有108个节点
C_衰减=K.常数(0.9)#递归层节点时间-时间衰减系数
data=K.random_normal([n_sample,n_tstep,n_row,n_col,1])#一些随机数据集
#data=np.random.randn(n_样本,n_步骤,n_行,n_列,1)
label=np.random.randint(5,size=n_样本)#一些随机数据集标签
label_onehot=K.one_hot(label,5)
x_列=数据
y\u train=标签\u onehot
x_检验=数据
y\u测试=标签
#%%模型
模型=顺序();
#卷积核:输入形状(批量大小,3,8,8,1),输出形状(批量大小,3,6,6,3)
添加(时间分布(卷积2d(3,(3,3),步长=1,padding='valid',use_bias=False,
内核\初始化器='random\ u uniform',trainable=False),输入\形状=(n\ t步骤,n\行,n\列,n\通道)
#展平非时间维度:输入形状(批次大小,3,6,6,3),输出形状(批次大小,3,108)
添加(Lambda(展平步,输出步=展平步)
#储备器:输入形状(批量大小3,108),输出形状(批量大小108)
添加(Lambda(ag_储存器,输出_形状=ag_储存器_形状))
#储存器读出:输入形状(批量大小,108),输出形状(批量大小,5)
添加(密集(5,使用_bias=False))
添加(激活('softmax'))
#检查模型
model.summary()
#%%训练
opt=keras.optimizers.rmsprop(lr=0.01,衰减=1e-6)
compile(loss='classifical_crossentropy',optimizer=opt,metrics=['acc'])
历史=模型.fit(x_序列,y_序列,历代=50,验证数据=(x_测试,y_测试),批量大小=2)
但是,Keras说,“如果数据是符号张量的形式,那么应该指定
每历元步长
参数(而不是
批量大小
参数,因为符号张量预计会生成批量输入数据)。”

您能否就如何让KERA正确识别批次大小并继续培训提出建议?(请注意,Conv2d层是固定的,lambda层也是固定的,只有最后一个密集层需要训练。)


提前感谢。

该错误意味着Fit()使用的数据张量之一是符号张量。one hot label函数返回符号张量。尝试以下方法:

label_onehot=tf.Session().run(K.one_hot(label,5))

我个人并没有直接在Keras上尝试过这一点——如果它在Keras上不起作用,请尝试使用tf one hot函数,而不是Keras one hot函数。

这是原因