在keras环境下将numpy数据形式转换为tensor

本文记录了一位初学者在Keras环境中将numpy数据转换为tensor以适配神经网络过程中遇到的问题及解决方案。通过试错,作者发现需要使用tf.convert_to_tensor()函数,并设置Keras的浮点类型,以及调整numpy生成张量的形状。最终成功解决问题。
TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

前期尝试

因为刚刚开始学习,想要记录一下自己学习的全过程,所以想知道具体方法的可以直接在目录跳到最后:最终的解决方法

最近开始接触神经网络的学习,在看过一个比较复杂的代码之后,了解了一些最基本的写法,打算自己搭建一个简单的神经网络。

因为学习参考的代码中使用的是卷积层,所以也我这里也搭建了一个卷积网络,代码在下面。

前期的各种准备工作就不赘述,总而言之最后弄出了一个神经网络的雏形。

from keras.models import Sequential

from keras.layers import Conv2D

import numpy as np

import tensorflow as tf


model = Sequential()

model.add(Conv2D(filters=1, kernel_size=[2,2], padding='same', strides=[1,1], input_shape=(10, 10, 1)))

input_data = np.random.rand(10,10)

output_data=model(input_data)

在这里,我是想让numpy生成一个10*10的数据集,然后通过这个神经网络,得到一个输出。

本身这个神经网络是没有什么意义的,没有目的,只是单纯的尝试。

试错

然而,在一开始,就遇到了大麻烦,直接卡住:

在这里插入图片描述

ValueError:All inputs to the layer should be tensors.

那么就是说,我们使用numpy生成的数据集,数据形式并不是神经网络需要的形式,还需要转换成tensor形式。

这个问题是最大的问题,后面基本上一直都是围绕这个转换而进行的各种尝试,在解决了这个问题之后其他的问题都可以说是小菜一碟了。

首先,我找了几篇文章,进行了一些尝试,但是都出现了错误:

keras numpy数组转成keras的tensor
https://blog.youkuaiyun.com/u013249853/article/details/89958827

这里提供的方法是K.cast_to_floatx( ),尝试之后发现还是有问题,没转换过来。

然后在一个群里,有人提供了开启eager模式的方法,这样就可以不用转换数据形式了,于是我又搜了一下:

TensorFlow Eager模式
https://blog.youkuaiyun.com/u010472607/article/details/81945354

但是现在又出现了问题
在这里插入图片描述
随后我又查了一下tf.placeholder()相关的文章,尝试解决和eager execution不兼容的问题,但是最后没有成功,就不写了。

之后,我又查到一篇文章,提供了一个新的解决方法:

tensorflow中tensor与数组之间的转换
https://www.cnblogs.com/mituzhifan-/p/9205712.html

这里给出的方法是使用tf.convert_to_tensor(),这个函数的参数是numpy,函数的返回值是tensor类型,不会改变原有的类型,可以说应该是满足了我们的要求

进行尝试之后,将

output_data=model(input_data)

改成了

output_data=model(tf.convert_to_tensor(input_data))

终于!
虽然还是没有成功,但是总算是看到了不一样的错误提示:

ValueError: input tensor must have rank 4

这个时候其实我还是没怎么看懂到底错误是什么,但是在看了上面的几条具体的错误提示之后:

ValueError: Shapes (10, 10) and (?, ?, ?, ?) must have the same rank
ValueError: Shapes (10, 10) and (?, ?, ?, ?) are not compatible
ValueError: Shape (10, 10) must have rank 4

通过这几条,大概可以猜测出:numpy生成的10*10的数据集或许不满足神经网络的输入

接下来我进行了这样的改动:

output_data=model(1,tf.convert_to_tensor(input_data)1)

不过还是失败了:

TypeError: call() takes 2 positional arguments but 4 were given

从错误中可以看出来,刚才进行的改动是多此一举的

那么改动的方向就应该瞄准numpy生成的数据级,改动由 numpy 生成的张量

input_data = np.random.rand(10,10)
input_data = np.random.rand(1,10,10,1)

添加了batch和channel两个参数之后
,可以运行了吗?

答案还是不可以。。。

TypeError: Input ‘filter’ of ‘Conv2D’ Op has type float32 that does not match type float64 of argument ‘input’.

不过这个时候离最终解决已经很接近了,错误提示告知: Keras 后端默认是 float32,而 numpy 生成的张量是 float64 的,所以需要先设置 Keras 的浮点类型

所以我们在代码中添加这些:

from keras import backend as K

K.set_floatx('float64')

Ohhhhhhhhhhhhhhhh终于解决了

最终的解决方法

经过大量的试错,一个0基础的小白终于成功解决了一个微不足道的小问题。

把这个写下来主要也是为了记录一下这个过程,当然如果有和我遇到一样问题的人,也可以有一个参考

最后的代码如下

from keras.models import Sequential
from keras.layers import Conv2D
import numpy as np
import tensorflow as tf
from keras import backend as K

K.set_floatx('float64')

model = Sequential()
model.add(Conv2D(filters=1, kernel_size=[2,2], padding='same', strides=[1,1], input_shape=(10, 10, 1)))

input_data = np.random.rand(1,10,10,1)

output_data=model(tf.convert_to_tensor(input_data))

总而言之,一是使用了tf.convert_to_tensor()函数,二是设置 Keras 的浮点类型,三是改动由 numpy 生成的张量

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值