Python 具有多个输入的tf.keras.backend.function在tf.data管道中抛出错误 序言
神经网络作为一种强大的网络有着丰富的历史。在第一篇论文中,研究人员使用样式转换来变换imagenet图像的纹理,从而提高了性能。在第二种情况下,研究人员使用嵌入产生的扰动将数据点转换为新样本,从而提高性能。这些只是我脑海中的前两个例子 问题 考虑到使用神经网络增强数据的优势,我试图在自己的tf.data管道中使用它们。我使用TF2.2。虽然数据增强网络(augmenter)和分类器(base)都在tf.data之外工作,但它们在tf.data管道中似乎发挥不了很好的作用。下面的代码试图将embeddings和embeddings2转换为一个新的数据点X。要清楚,这段代码只是创建一个最小的示例Python 具有多个输入的tf.keras.backend.function在tf.data管道中抛出错误 序言,python,tensorflow,machine-learning,keras,neural-network,Python,Tensorflow,Machine Learning,Keras,Neural Network,神经网络作为一种强大的网络有着丰富的历史。在第一篇论文中,研究人员使用样式转换来变换imagenet图像的纹理,从而提高了性能。在第二种情况下,研究人员使用嵌入产生的扰动将数据点转换为新样本,从而提高性能。这些只是我脑海中的前两个例子 问题 考虑到使用神经网络增强数据的优势,我试图在自己的tf.data管道中使用它们。我使用TF2.2。虽然数据增强网络(augmenter)和分类器(base)都在tf.data之外工作,但它们在tf.data管道中似乎发挥不了很好的作用。下面的代码试图将embe
import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import *
target = np.random.choice([0,1], size = 10000)
embeddings = np.random.normal(size = (target.shape[0], 100)).astype(np.float32)
embeddings2 = np.random.normal(size = (target.shape[0], 100)).astype(np.float32)
def get_Augmenter():
input_dims = embeddings.shape[1]
inp = Input(shape = (input_dims,), name ='input')
inp2 =Input(shape = (input_dims,), name ='input2')
concat = Concatenate(axis=1, name= 'Encoder_concat')([inp, inp2])
hidden = Dense(10, activation = 'relu', name = 'hidden')(concat)
out = Dense(input_dims, activation = 'relu', name='output')(hidden)
Augmenter = tf.keras.models.Model(inputs =[inp, inp2], outputs=out)
return Augmenter
Augmenter = get_Augmenter()
inputs = [Augmenter.get_layer(name='input').input, Augmenter.get_layer(name='input2').input]
outputs = Augmenter.get_layer(name='output').output
Aug_Func = tf.keras.backend.function(inputs = inputs, outputs = outputs)
X = Auto_Func([embeddings, embeddings2])
上面的代码创建了扩展数据:X。将其放入训练循环有点难看,但它可以工作:
#Base Classifier
inp = Input((embeddings.shape[1],))
x = Dense(1, activation = 'sigmoid')(inp)
base = tf.keras.models.Model(inputs = inp, outputs = x)
base.compile(optimizer='adam',loss='mae')
EPOCHS = 5
for epoch in range(EPOCHS):
#transform the input via Aug_Func
np.random.shuffle(embeddings)
np.random.shuffle(embeddings2)
X = Aug_Func([embeddings, embeddings2])
base.fit(x=X, y=target)
当我尝试将代码放入tf.data时,我得到以下错误
func() takes 1 positional argument but 2 were given
我知道在tf.data内部进行神经增强并不重要。如果没有其他目的,除了我自己的教诲,我怎么能让Aug_Func在tf.数据管道中工作
#Below is function for use inside dataset.map
def tf_aug_transform(var1, var2):
var1_shape = var1.shape
[var1,] = tf.py_function(Aug_Func, [var1, var2], [tf.float32])
var1.set_shape(var1_shape)
return var1
def get_dataset(X,X2, y, batch_size = 32):
train_ds = tf.data.Dataset.from_tensor_slices((X, X2, y))
train_ds = train_ds.batch(batch_size)
train_ds = train_ds.map(lambda var1,var2,y: (tf_aug_transform(var1,var2), y))
return train_ds
temp = get_dataset(embeddings, embeddings2, target, 64)
for elem in temp:
print(elem)