神经网络除法:无法获取未知秩的形状的长度

问题描述 投票:0回答:1

我正在尝试使用类似于此处概述的方法来编写一个神经网络来对两个数字进行乘法和除法。首先,我编写了两个数字相加和相减以及数字平方的模型。对于除法,我使用除数的倒数并将其与除数相乘,如下所示:

import tensorflow as tf
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras import regularizers

#Models for adding and subtracting two numbers

num_train = 1000

X_train = np.random.rand(num_train, 2)
y_train_add = X_train[:, 0] + X_train[:, 1]
y_train_subtract = X_train[:, 0] - X_train[:, 1]

model_add = Sequential(
        [
            Dense(10),
            Dense(1)
            ]
        )

model_subtract = Sequential(
        [
            Dense(10),
            Dense(1)
            ]
        )

batch_size = 32
epochs = 100

model_add.compile(loss = 'mse', optimizer='adam')
model_add.fit(X_train, y_train_add, batch_size=batch_size, epochs=epochs, verbose = 1)


model_subtract.compile(loss = 'mse', optimizer='adam')
model_subtract.fit(X_train, y_train_subtract, batch_size=batch_size, epochs=epochs, verbose = 1)

#Model for squaring a number

x_train = np.random.random((10000,1))*100-50
y_train = np.square(x_train)

model_sqr = Sequential(
        [
            Dense(8, activation = 'relu', kernel_regularizer = regularizers.l2(0.001), input_shape = (1,)),
            Dense(8, activation = 'relu',  kernel_regularizer = regularizers.l2(0.001)),
            Dense(1)
            ]

        )

batch_size = 64
epochs = 2000

model_sqr.compile(loss = 'mse', optimizer='adam')
model_sqr.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose = 1)

#Code for calculating the product and quotient of two numbers using models

x = "n" 
while True:
    print("enter first num:")
    x = input()
    if x == "end":
        break

    print("Enter operation:")
    op= input()

    print("enter second num:")
    y = input()

    X = int(x)
    Y = int(y)
    Ydiv = 1/Y

    if op == "*":
        predicted_product = model_sqr.predict(model_add.predict(np.array([[X, Y]]))) - model_sqr.predict(np.array([X])) -  model_sqr.predict(np.array([Y]))
        print(predicted_product/2)
    elif op =="/":
        predicted_quot = model_sqr.predict(model_add.predict(np.array([[X, Ydiv]]))) - model_sqr.predict(np.array([X])) -  model_sqr.predict(np.array([Ydiv]))
        print(predicted_quot/2)


乘法部分工作得相当好,但是在输入两个要除的数字时,会出现以下错误:

Exception encountered when calling Sequential.call().

Cannot take the length of shape with unknown rank.

有人可以帮我解决这个问题吗?

编辑:我将

Ydiv=1/Y
更改为
Ydiv = np.reciprocal(Y)
,虽然现在没有显示错误,但我进行的每个除法都会产生大约某个特定数字的结果(每次运行程序时都有不同的值)。

所以现在我想知道

1: 如何解决这个问题,以及

2: 错误最初是如何出现的。

python numpy tensorflow keras neural-network
1个回答
0
投票

你的方法的问题来自于模型执行平方,这很难用你的模型来学习。如果您单独检查它,您会发现它对某些值给出了非常错误的结果。尝试查看正方形(0)、正方形(1)等

enter image description here

请注意,学习的模型有几个“平坦”区域,它们与真实曲线并不真正匹配。如果您绘制平方误差,它将显示:

enter image description here

所以误差相当大。至于总是得到相同的结果,很可能你的模型收敛得不好,比如:

enter image description here

在这种情况下,对于 -10、10 区域中的值,您可能会得到固定输出。因此,您的公式

(a + b)^2 - a^2 - b^2
相当于
c^2 - c^2 -c^2 = -c^2
,其中
c
是该常数。由于您没有使用任何 np.random.seed,因此每次都会得到不同的
c

为了学习更好的正方形模型,我有两个建议:

  • 增加样本数量,而不是纪元数。与 10K 数据上的 2000 个 epoch 相比,100K 数据上的 200 个 epoch 可能更有用。
  • 将激活从“relu”更改为也可以容纳负值的东西,例如“elu”。

您仍然不会得到完美的方形模型,但它将是一个更好的近似值。

© www.soinside.com 2019 - 2024. All rights reserved.