用于连续输入和连续输出的 Keras LSTM
Keras LSTM for continuous input and continuous output
例如我有二进制数据,比如说:0, 0, 0, 1, 1, 0, 1, 1。这可能会无限期地继续下去。对于每个输入,都有相应的输出。假设我们使用异或运算。因此,输出可能如下所示:0, 0, 0, 1, 0, 1, 1, 0.
如何塑造 Keras 输入形状?如何设置时间步长?如果我声明时间步长 1 是每个 1 个时间步长被认为是不同的情况,或者它仍然可以考虑以前的输入作为序列或学习记忆?
Keras 正在为其隐藏层使用 LSTM 或 GRU。
我已经尝试了 2 种方法来解决这个问题,但 none 似乎成功了。这两种方法都停留在 37.5 acc。事实上,它一直在猜测 1.
方法一:
data = [[[0], [0], [0], [1], [1], [0], [1], [1]]]
output = [[[0], [0], [0], [1], [0], [1], [1], [0]]]
model = Sequential()
model.add(GRU(10, input_shape=(8, 1), return_sequences=True))
model.add(GRU(10, return_sequences=True))
model.add(Dense(1, activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
model.fit(np.asarray(data), np.asarray(output), epochs=3000)
方法二:
data = [[[0]], [[0]], [[0]], [[1]], [[1]], [[0]], [[1]], [[1]]]
output = [[0], [0], [0], [1], [0], [1], [1], [0]]
model = Sequential()
model.add(GRU(10, input_shape=(1, 1), return_sequences=True))
model.add(GRU(10))
model.add(Dense(1, activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
model.fit(np.asarray(data), np.asarray(output), epochs=300)
In fact, it keep guessing 1.
那是因为你用了softmax
作为最后一层的激活。由于最后一层只有一个单元,而 softmax 函数对其输入进行归一化,使得元素之和等于 1,因此它始终输出 1。相反,您需要使用 sigmoid
作为最后一层的激活函数来输出介于 0 和 1 之间。
将activation='softmax'
更改为activation='sigmoid'
例如我有二进制数据,比如说:0, 0, 0, 1, 1, 0, 1, 1。这可能会无限期地继续下去。对于每个输入,都有相应的输出。假设我们使用异或运算。因此,输出可能如下所示:0, 0, 0, 1, 0, 1, 1, 0.
如何塑造 Keras 输入形状?如何设置时间步长?如果我声明时间步长 1 是每个 1 个时间步长被认为是不同的情况,或者它仍然可以考虑以前的输入作为序列或学习记忆?
Keras 正在为其隐藏层使用 LSTM 或 GRU。
我已经尝试了 2 种方法来解决这个问题,但 none 似乎成功了。这两种方法都停留在 37.5 acc。事实上,它一直在猜测 1.
方法一:
data = [[[0], [0], [0], [1], [1], [0], [1], [1]]]
output = [[[0], [0], [0], [1], [0], [1], [1], [0]]]
model = Sequential()
model.add(GRU(10, input_shape=(8, 1), return_sequences=True))
model.add(GRU(10, return_sequences=True))
model.add(Dense(1, activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
model.fit(np.asarray(data), np.asarray(output), epochs=3000)
方法二:
data = [[[0]], [[0]], [[0]], [[1]], [[1]], [[0]], [[1]], [[1]]]
output = [[0], [0], [0], [1], [0], [1], [1], [0]]
model = Sequential()
model.add(GRU(10, input_shape=(1, 1), return_sequences=True))
model.add(GRU(10))
model.add(Dense(1, activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
model.fit(np.asarray(data), np.asarray(output), epochs=300)
In fact, it keep guessing 1.
那是因为你用了softmax
作为最后一层的激活。由于最后一层只有一个单元,而 softmax 函数对其输入进行归一化,使得元素之和等于 1,因此它始终输出 1。相反,您需要使用 sigmoid
作为最后一层的激活函数来输出介于 0 和 1 之间。
将activation='softmax'
更改为activation='sigmoid'