tensorflow中去除不足一个batch的数据

利用tensorflow做lstm,遇到一个奇怪的问题,只是显示输入格式不对,但是 换个batch_size就可以了,思来想去可能是tensorflow1.0的bug,写一下解决方案

解决方案1:

直接采用

steps_per_epoch

参数,将原来的代码

AE.fit(x_train, x_train, epochs=params['epochs_pre'],
                             batch_size=batch_size,
                             shuffle=False,
                             verbose = 0
                             )

改为

AE.fit(x_train, x_train, epochs=params['epochs_pre'],
             steps_per_epoch =len(x_train)//(params['batch_size']*params['epochs_pre']),
             shuffle=False,
             verbose = 0
             )

这个地方注意:①在model.fit()函数中设置了batch_size就不可以设置step_per_epoch了

                         ②keras 中 fit_generator参数steps_per_epoch已经改变含义了,目前的含义是一个epoch分成多少个batch_size。旧版的含义是一个epoch的样本数目。因为我采用的是tensorflow1.0,所以用的还是旧版的定义。

解决方案2:

第一个解决方案在我用numpy数组定义输入数据时可以使用,但是我写成从文件中读取后就不行了,很无奈,找了很多方法,有说用tensorflow中去除不足一个batch的数据的tensorflow函数,参考:https://blog.csdn.net/qq_36076233/article/details/81063127

dataset = dataset.apply(tf.contrib.data.batch_and_drop_remainder(3))  #每个batch3个数据,不足3个舍弃

的,但是好像跟我的数据格式不太一样,我是直接读取.csv文件,这个好像是迭代器,搞了半天也没弄明白咋用=_=

查了一些资料又有说,参考:https://www.javaroad.cn/questions/108699

  • 设置 batch_size 时,训练数据将被分割为此大小的批次(请参阅L184) .

  • 当您设置 steps_per_epoch 时,如果训练输入不是框架原生张量(这是最常见的情况),整个训练集将被一次性送入网络(参见L152),这就是为什么你得到了记忆错误 .

因此,基于实现,我建议仅在通过框架本机张量(即第一个维度为批量大小的TensorFlow张量)进行馈送时使用参数 steps_per_epoch ,这确实是一个要求 . 为此,需要将 model.fit 中的参数 x 和 y 设置为 None .

这个的,我也没搞明白=_=

最后,我用了最直白的方法,直接遍历数组,把不能整除batch_size的剩余数据直接删掉,写了个函数,方便调用一下:

def remove(x,y,batch_size):
	if len(x) / batch_size != 0:
		index = []
		for step, batch in enumerate(Data.DataLoader(dataset=x, batch_size=batch_size, shuffle=False)):
			if len(batch) != batch_size:
				for i in range(len(batch)):
					index.append(step * batch_size + i)
		x = np.delete(x, index, axis=0)
		y = np.delete(y, index, axis=0)
	print('x.shape is desized!', x.shape)
	return x,y

x,y就是不能被batch_size整除的数据,通过把不能被整除的索引记录下来并删除对应元素,最后返回一个能够被整除的数组,方法虽然很笨,但是终于能用了

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以为你提供一个基于TensorFlow的迁移学习的代码示例:# 导入TensorFlow import tensorflow as tf# 定义基础模型 base_model = tf.keras.applications.MobileNetV2(input_shape=IMAGE_SHAPE, include_top=False, weights='imagenet')# 冻结基础模型的权重 base_model.trainable = False# 定义迁移学习模型 model = tf.keras.Sequential([ base_model, tf.keras.layers.Conv2D(32, 3, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.GlobalAveragePooling2D(), tf.keras.layers.Dense(NUM_CLASSES, activation='softmax') ])# 编译模型 model.compile(optimizer=tf.keras.optimizers.Adam(), loss='categorical_crossentropy', metrics=['accuracy']) ### 回答2: import tensorflow as tf from tensorflow.keras.applications import VGG16 # 加载预训练的VGG16模型 base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) # 冻结卷积基层的权重,只训练顶部的全连接层 for layer in base_model.layers: layer.trainable = False # 自定义顶部分类器 top_model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=base_model.output_shape[1:]), tf.keras.layers.Dense(256, activation='relu'), tf.keras.layers.Dropout(0.5), tf.keras.layers.Dense(10, activation='softmax') ]) # 将顶部分类器与卷积基层连接 model = tf.keras.models.Model(inputs=base_model.input, outputs=top_model(base_model.output)) # 编译模型 model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=1e-4), loss='categorical_crossentropy', metrics=['accuracy']) # 加载数据集 train_data = ... # 加载训练数据 val_data = ... # 加载验证数据 # 数据预处理 train_data = ... # 数据预处理 val_data = ... # 数据预处理 # 迁移学习训练模型 history = model.fit(train_data, epochs=10, validation_data=val_data) # 保存模型 model.save('model.h5') ### 回答3: TensorFlow一个非常强大的深度学习库,可以用于构建和训练神经网络模型。迁移学习是一种机器学习技术,可以利用已经训练好的模型的知识,来加速新任务的学习过程。 下面是一个简单的TensorFlow代码示例,用于实现迁移学习: ```python import tensorflow as tf from tensorflow.keras.applications import VGG16 from tensorflow.keras.preprocessing.image import ImageDataGenerator # 加载预训练的VGG16模型,并去除最后一层全连接层 base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) # 冻结(不更新)VGG16模型的权重 for layer in base_model.layers: layer.trainable = False # 添加自定义的全连接层 model = tf.keras.models.Sequential([ base_model, tf.keras.layers.Flatten(), tf.keras.layers.Dense(256, activation='relu'), tf.keras.layers.Dense(10, activation='softmax') ]) # 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 数据预处理 train_datagen = ImageDataGenerator(rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) test_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory('./train', target_size=(224, 224), batch_size=32, class_mode='categorical') validation_generator = test_datagen.flow_from_directory('./validation', target_size=(224, 224), batch_size=32, class_mode='categorical') # 模型训练 model.fit_generator(train_generator, steps_per_epoch=len(train_generator), epochs=10, validation_data=validation_generator, validation_steps=len(validation_generator)) # 保存模型 model.save('my_model.h5') ``` 以上代码实现了使用VGG16模型进行图像分类任务的迁移学习。首先加载VGG16模型,并去除它的最后一层全连接层。然后冻结VGG16模型的权重,以保持其原有的特征提取能力。接下来,我们添加自定义的全连接层,并编译模型。之后进行数据预处理,包括图像的缩放、翻转和增强等操作。最后,使用训练数据和验证数据对模型进行训练。训练完成后,保存模型以备以后使用。 请注意,上述代码仅为一个简单示例,实际应用可能需要根据具体问题进行适当的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值