前期尝试
因为刚刚开始学习,想要记录一下自己学习的全过程,所以想知道具体方法的可以直接在目录跳到最后:最终的解决方法。
最近开始接触神经网络的学习,在看过一个比较复杂的代码之后,了解了一些最基本的写法,打算自己搭建一个简单的神经网络。
因为学习参考的代码中使用的是卷积层,所以也我这里也搭建了一个卷积网络,代码在下面。
前期的各种准备工作就不赘述,总而言之最后弄出了一个神经网络的雏形。
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 生成的张量。
本文记录了一位初学者在Keras环境中将numpy数据转换为tensor以适配神经网络过程中遇到的问题及解决方案。通过试错,作者发现需要使用tf.convert_to_tensor()函数,并设置Keras的浮点类型,以及调整numpy生成张量的形状。最终成功解决问题。
1万+

被折叠的 条评论
为什么被折叠?



